iOS收到推送后,跳转到某一页面

字数1348 阅读1001 评论4 喜欢26

以前做过推送, 但只是那种最基本的广播推送(向所有安装appde设备通知), 列播组播这种对指定用户推送消息还没做过, 最近刚好有个项目,向指定用户推送物流信息、物品状态等等。于是前几天就和也没做过推送的后台干起来了,详情如下:

我用的是友盟推送, 配置证书这一环节直接跳过了,这个网上有讲的。给大家讲一点常识,友盟推送分生产环境和开发环境。用手机刷上去的就是开发环境, 发布到苹果商店就是生产环境,没发布前怎么模拟呢, 用普通账号打的ad hoc 包, 用企业账号打的ad hoc 包或者enterprise包都可以测试生产环境。

开发环境下, 你把APP删掉,重新调试上来,就会生成一个新的device_token了!下面的几个步骤是自己的理解结合网上的资料写出的想法,大牛们轻的吐槽…… 

1、传device_token的时机

后台向指定用户做同送,那么必须知道某个用户的device_token,那么怎么获取token呢,APP启动后会在appdelegate的didRegisterForRemoteNotificationsWithDeviceToken方法里返回device_token信息:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
[UMessage registerDeviceToken:deviceToken];
NSString * token = [[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""]
stringByReplacingOccurrencesOfString: @">" withString: @""]
stringByReplacingOccurrencesOfString: @" " withString: @""];
}

但是后台向指定用户推送, 就必须把uid(用户ID)和token关联起来,我这里的做法时, 用户登录的时候就上传token信息, 退出登录的时候, 就清除用户绑定的token信息, 这样确保后台会向用户最后一次登录的设备号做推送(只是自己的理解,当然了,iOS设备收到推送后,还要判断用户是否登录而且登录的是不是你要推送的用户)。

2、 收到通知时app的状态

收到通知的时候APP的状态可能是未启动、前台活跃(任何界面)、后台等三种。

  • 未启动时,点击通知栏启动App, 会在didFinishLaunchingWithOptions方法里收到通知内容。
  • 剩下两种会在didReceiveRemoteNotification方法里收到通内容。

    - (void)application:(UIApplication *)application   didReceiveRemoteNotification:(NSDictionary *)userInfo{
    _userInfo = userInfo;
    //关闭友盟对话框
    [UMessage setAutoAlert:NO];
    [UMessage didReceiveRemoteNotification:userInfo];
    NSLog(@"_______________友盟系统方法 userInfo %@",userInfo);
    if(userInfo)// 调用appdelegate的分类处理业务逻辑
    [self dealWithMyMessagePush:userInfo];
    }

    代码里面删减了一些和推送不相关的代码,我的项目架构是tab+nav 

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    self.window.rootViewController = [[FDIMGBarController alloc] init];
    // 分类
    [self UMengShareMethodAndCount:launchOptions];
    // 类别
    [self FD_updateAppVersion];
    NSDictionary* userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    if(userInfo){//推送信息
    self.userInfo = userInfo;//[userInfo copy]
    }
    return YES;
    }
  • 未启动时收到通知,就判断字典userInfo是否为空, 不为空是说明有通知消息。我这里的做法是把她复制给AppDelegate的某个属性, 在首页控制器取到AppDelegate的这个值,判断是否为空,不为空就进行下一步操作。
  • 用户在前台或后台收到消息的时候, 我会弹出一个弹出框提醒用户,是否前往我的消息界面。

5、 未启动时首页控制器逻辑处理

在viewDidLoad方法里:
AppDelegate * app = (AppDelegate *)[UIApplication sharedApplication].delegate;
//pushName 是我给后天约定的通知必传值,所以我可以根据他是否为空来判断是否有通知
NSString * pushName = [[app.userInfo objectForKey:@"aps"] objectForKey:@"alert"];
if(![SYFCustomCLASS SYFIsEmptyOrNull:pushName])
[self getPushInfo:app.userInfo];

如果有通知的话:

-(void)getPushInfo:(NSDictionary *)dict{
if(!IsLogin){// 判断用户是否登录
LoginViewController * loginVC = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
//通知必返回要通知用户的uid, 判断登录的用户是不是你要通知的用户
loginVC.push_uid = dict[@"uid"];
FDNavigationController * loginNav = [[FDNavigationController alloc] initWithRootViewController:loginVC];
[self presentViewController:loginNav animated:YES completion:^{}];
}else
{// 这就文章标题说的某一界面
MyUserMessageVC * messageVC = [[MyUserMessageVC alloc] initWithNibName:@"MyUserMessageVC" bundle:nil];
[self.navigationController pushViewController:messageVC animated:YES];
}
}

当用户的登录成功的时候,在上传device_token的接口方法里, 需要判断登录用户的uid是不是你要通知的用户。如果不是你要通知的用户,dismiss就好了,结束;如果是就要跳转到我的消息界面。

   if(![self.push_uid isEqualToString:currentuid])
[self dismissViewControllerAnimated:YES completion:NULL];
else{
[self dismissViewControllerAnimated:YES completion:^{
AppDelegate * app = (AppDelegate *)[UIApplication sharedApplication].delegate;
//AppDelegate的分类
[app testLoginerUidCorret];
}];

方法如下:

- (void)testLoginerUidCorret{
// 取到tabbarcontroller
FDIMGBarController *tabBarController = ( FDIMGBarController*)self.window.rootViewController;
// 取到navigationcontroller
FDNavigationController * nav = (FDNavigationController *)tabBarController.selectedViewController;
//取到nav控制器当前显示的控制器
UIViewController * baseVC = (UIViewController *)nav.visibleViewController;
//如果是当前控制器是我的消息控制器的话,刷新数据即可
if([baseVC isKindOfClass:[MyUserMessageVC class]])
{
MyUserMessageVC * vc = (MyUserMessageVC *)baseVC;
[vc reloadMessageData];
return;
}
// 否则,跳转到我的消息
MyUserMessageVC * messageVC = [[MyUserMessageVC alloc] initWithNibName:@"MyUserMessageVC" bundle:nil];
[nav pushViewController:messageVC animated:YES];
}

6、应用在前台或后台的逻辑处理

逻辑和未启动时很多情况都是类似,弹出提醒框, 点击立即前往时,判断用户是否登录,如果用户登录,直接跳转到我的消息界面;没有登录请参考上面逻辑。

iOS推送处理的更多相关文章

  1. iOS推送证书转pem文件

    iOS推送证书转 .pem文件. 推送证书转pem文件openssl x509 -in apns_miaobozhibo.cer -inform der -out apns_miaobozhibo.p ...

  2. IOS 推送-客户端处理推送消息

    IOS 推送-客户端处理推送消息 1.推送调用顺序 APN push的消息到达后,UIApplicationDelegate有两个方法和处理消息有关: 1)application:didReceive ...

  3. IOS 推送-配置与代码编写

    IOS 推送配置与代码编写 这里介绍IOS的推送,本文章已经在IOS6/7/8上都能运行OK,按照道理IOS9应该没问题. 大纲: 1.文章前提 2.推送介绍 3.推送文件账号设置 4.推送证书介绍 ...

  4. IOS 推送消息 php做推送服务端

    IOS推送消息是许多IOS应用都具备的功能,最近也在研究这个功能,参考了很多资料终于搞定了,下面就把步骤拿出来分享下: iOS消息推送的工作机制可以简单的用下图来概括: Provider是指某个iPh ...

  5. 友盟iOS推送配置(从真机调试到推送)

    下面我来讲解一下友盟iOS的推送配置,其实友盟只是一个示例,换做其余的第三方推送服务也会适用,只是第三方的后面服务变了而已. iOS推送(包括真机调试)所需要的步骤和文件如下: 备注:这里我将省略掉一 ...

  6. iOS 推送全解析

    本文旨在对 iOS 推送(以下简称 推送)进行一个完整的剖析,如果你之前对推送一无所知,那么在你认真地阅读了全文后必将变成一个推送老手,你将会对其中的各种细节和原理有充分的理解.以下是 pikacod ...

  7. “iOS 推送通知”详解:从创建到设置到运行

    这是一篇编译的文章,内容均出自Parse.com的iOS开发教程,同时作者还提供了视频讲解.本文将带领开发者一步一步向着iOS推送通知的深处探寻,掌握如何配置iOS推送通知的奥义. 介绍一点点背景资料 ...

  8. 转载:iOS 推送的服务端实现

    参考网址1: iOS消息推送机制的实现 http://www.cnblogs.com/qq78292959/archive/2012/07/16/2593651.html 参考网址2: iOS 推送的 ...

  9. C#调用IOS推送

    C#调用IOS推送 使用的是 PushSharp 开源库 源码代码如下 点我

  10. iOS推送 再备

    这是一篇编译的文章,内容均出自Parse.com的iOS开发教程,同时作者还提供了视频讲解.本文将带领开发者一步一步向着iOS推送通知的深处探寻,掌握如何配置iOS推送通知的奥义. 介绍一点点背景资料 ...

随机推荐

  1. Tree

    //Header.h #ifndef _HEAD_ #define _HEAD_ #include <queue> #include <iostream> using name ...

  2. css3和原生js时钟

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. <转>SQL语句大全

    本文为转载,原文地址:http://www.cnblogs.com/cangqiongbingchen/p/4530333.html 一.基  础 1.说明:创建数据库CREATE DATABASE ...

  4. (原创)mybaits学习三,springMVC和mybatis融合

    上一节,总计了spring和mybaits的融合,这一节,我们来学习springmvc和mybatis融合 最近在弄一个SSM的项目,然后在网上找资料,将资料总结如下 一,开发环境的配置 MyEcli ...

  5. grains

    用途 1,匹配客户端 2,配置文件里使用 3,资产管理     定义grains方法1:             方法2:        

  6. linux ISO/IMG make

    sudo dd if=/PATH/*.ISO  of=/dev/sdb 1.制作启动U盘需要sdb,不能sdb1,否则会提示isolinux.bin文件丢失 2.TF卡,设置sdb1?忘了 /* sy ...

  7. python网络编程学习《一》

    最近,刚实习完,很喜欢实验楼,但是自己的方向仍然不能确定,自己觉得可选择的空间很大,尽管已经是大四的人了,想到别人都在忙着买职业装,买高跟鞋面试,学习化妆什么的,看看自己,反而开始慢慢关注运动,食疗以 ...

  8. SpringMVC源码分析系列

    说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而springmvc是依托着Servlet容器元素来设计的,同时sp ...

  9. Nodejs进阶:基于express+multer的文件上传

    关于作者 程序猿小卡,前腾讯IMWEB团队成员,阿里云栖社区专家博主.欢迎加入 Express前端交流群(197339705). 正在填坑:<Nodejs学习笔记> / <Expre ...

  10. 开发错误11:Configuration with name ‘default’ not found

    开发错误11:Configuration with name 'default' not found 今天在导入一个sdkdemoapp3.0项目时,发现project build.gradle 与m ...