项目开发用集成是极光推送JPush

    这里主要是消息推送过来处理对应界面跳转

    
    同时看到两篇写的不错的相关博客分享一下:

     http://www.jianshu.com/p/eaf07c4372a8

     http://www.jianshu.com/p/d4460fed39c1

   

   推送的是根据用户ID及用户的绑定的JPush注册ID,对应用户推送。

    首先看一下推送过来的消息格式:


推送来的字典:{
    "_j_msgid" = 976126105;
    aps =     {
        alert =
"\U865a\U62df\U7b56\U7565I160704711100001\U5356\U51fa\U80a1\U7968:\U5b9c\U534e\U5065\U5eb7100\U80a1\U3001\U4ef7\U683c\U4e3a32.15\U3001\U5171\U8ba13215\U2026\U2026";
        badge = 50;
        sound = "";
    };
    "pro_id" = 160704711100001;
    "pro_type" = 1;
    "type_id" = 1;
}



其中    "pro_id" = 160704711100001;
    "pro_type" = 1;
    "type_id" = 1;

这三个是后台服务自定义的键值信息,根据自己开发的需要自定义。主要靠这三个信息跳转到对应的界面。


 
alert =
"\U865a\U62df\U7b56\U7565I160704711100001\U5356\U51fa\U80a1\U7968:\U5b9c\U534e\U5065\U5eb7100\U80a1\U3001\U4ef7\U683c\U4e3a32.15\U3001\U5171\U8ba13215\U2026\U2026";
        badge = 50;
        sound = "";

这三个是推送的固定格式,不管谁的推送都有,alert是通知栏提示的消息信息,badge是桌面app数字角标提醒

sound是收到消息提醒的声音。

接收到推送的通知有三种情况,第一种,App未启动  第二种,App在前台   第三种,App在后台

第一种,App未启动
时候,点击通知栏消息时,app从- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 这个方法里接受处理消息

处理逻辑为:将消息放到专门的方法dealRemoteNotification里处理分析后跳转

 // 未启动 推送消息
    NSDictionary* userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    if(userInfo){
       
        [self dealRemoteNotification:userInfo];
    }

其他的两种情况在下面方法处理

-
(void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void
(^)(UIBackgroundFetchResult))completionHandler {
    
    // iOS 7 Support Required
    [self dealRemoteNotification:userInfo];


    [JPUSHService handleRemoteNotification:userInfo];
    completionHandler(UIBackgroundFetchResultNewData);
}

处理跳转的方法如下

  1. // 推送消息处理跳转
  2. -(void)dealRemoteNotification:(NSDictionary*)userInfo{
  3.  
  4. NSLog(@"推送来的字典:%@",userInfo);
  5. // 取得 APNs 标准信息内容
  6. // NSDictionary *aps = [userInfo valueForKey:@"aps"];
  7. // NSString *content = [aps valueForKey:@"alert"]; //推送显示的内容
  8. // NSInteger badge = [[aps valueForKey:@"badge"] integerValue]; //badge数量
  9. // NSString *sound = [aps valueForKey:@"sound"]; //播放的声音
  10. //
  11.  
  12. // 前台的时候不处理消息跳转
  13. if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) { // 前台不处理推送
  14. return;
  15. }
  16. //服务端自定义键值
  17. NSString *typeID = [userInfo valueForKey:@"type_id"]; // 真实虚拟
  18. NSString *proType = [userInfo valueForKey:@"pro_type"]; // IMP还是ISM
  19. NSString *proID = [userInfo valueForKey:@"pro_id"]; // id或code
  20.  
  21. if (proType.integerValue == ){ // 消息助手详情
  22.  
  23. MsgAssistant_PushViewController *MsgVC = [[MsgAssistant_PushViewController alloc]init];
  24.  
  25. [self.window.rootViewController presentViewController:MsgVC animated:YES completion:^{
  26.  
  27. }];
  28.  
  29. }
  30.  
  31. if (typeID.integerValue == ) { // 虚拟
  32. if (proType.integerValue == ) { // ISM
  33.  
  34. ISM_PushTradeCommandViewController *ISMPush = [[ISM_PushTradeCommandViewController alloc]init];
  35. ISMPush.ismCodeString = proID;
  36. ISMPush.isVirtualExperience = YES;
  37.  
  38. [self.window.rootViewController presentViewController:ISMPush animated:YES completion:^{
  39.  
  40. }];
  41.  
  42. }else if(proType.integerValue == ){ // IMP
  43.  
  44. // IMP交易记录
  45. IMP_PushTradeRecordViewController *IMPPushVC = [[IMP_PushTradeRecordViewController alloc] init];
  46.  
  47. IMPPushVC.impId = proID;
  48. IMPPushVC.isVirtualExperience = YES;
  49.  
  50. [self.window.rootViewController presentViewController:IMPPushVC animated:YES completion:^{
  51.  
  52. }];
  53.  
  54. }else{
  55. return ;
  56. }
  57.  
  58. }else if (typeID.integerValue == ){ // 真实
  59.  
  60. if (proType.integerValue == ) { // ISM
  61.  
  62. ISM_PushTradeCommandViewController *ISMPush = [[ISM_PushTradeCommandViewController alloc]init];
  63. ISMPush.ismCodeString = proID;
  64. ISMPush.isVirtualExperience = NO;
  65.  
  66. [self.window.rootViewController presentViewController:ISMPush animated:YES completion:^{
  67.  
  68. }];
  69.  
  70. }else if(proType.integerValue == ){ // IMP
  71.  
  72. // IMP交易记录
  73. IMP_PushTradeRecordViewController *IMPPushVC = [[IMP_PushTradeRecordViewController alloc] init];
  74.  
  75. IMPPushVC.impId = proID;
  76. IMPPushVC.isVirtualExperience = NO;
  77.  
  78. [self.window.rootViewController presentViewController:IMPPushVC animated:YES completion:^{
  79.  
  80. }];
  81.  
  82. }else{
  83.  
  84. return ;
  85. }
  86.  
  87. }
  88.  
  89. }

本跳转是单个界面,没有下一级,所以没用导航控制器

根据个人情况处理,这里前台的时候没有处理,有的前台处理的时候是弹窗提示,引导跳转


同时注意 跳转的界面返回的处理,这里重写跳转界面返回事件

- (void)backButtonEvent{
    
    [self dismissViewControllerAnimated:YES completion:^{
        
    }];
    
}

一般情况下,看完一个消息详情界面用户会点击返回退出此界面,

如果用户未退出消息详情界面,而下拉通知栏点击了消息,可能会由于未dimiss的界面,

新的消息详情界面无法present出来,建议处理消息的方法里跳转前发送通知到控制器执行dimiss操作。


iOS开发——消息推送跳转的更多相关文章

  1. iOS开发消息推送原理

    转载自:http://www.cnblogs.com/cdts_change/p/3240893.html 一.消息推送原理: 在实现消息推送之前先提及几个于推送相关概念,如下图1-1: 1.Prov ...

  2. 玩转iOS开发 - 消息推送

    消息推送

  3. iOS 10 消息推送(UserNotifications)秘籍总结(二)

    背景 上一篇博客iOS 10 消息推送(UserNotifications)秘籍总结(一)发布后被 简书编辑推荐至首页,这着实让我受宠若惊啊.可是好事不长,后面发生了让我伤心欲绝的事,我的女朋友不要我 ...

  4. iOS开发 iOS10推送必看

    iOS10更新之后,推送也是做了一些小小的修改,下面我就给大家仔细说说.希望看完我的这篇文章,对大家有所帮助. 一.简单入门篇---看完就可以简单适配完了 相对简单的推送证书以及环境的问题,我就不在这 ...

  5. iOS 远程消息推送,原理和开发详解篇(新手推荐)

    1.APNS的推送机制 首先我们看一下苹果官方给出的对ios推送机制的解释.如下图 Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Servic ...

  6. iOS 之消息推送(个推)---个人小结

    前言:自从上个星期开始整这个推送,弄了差不多一个星期,今天终于给整好了,因此现在来记录这段"奇妙"的旅程. 我们公司使用的消息推送是用的第三方--个推,这里不得不说一下,个推的技术 ...

  7. 分分钟搞定IOS远程消息推送

    一.引言 IOS中消息的推送有两种方式,分别是本地推送和远程推送,本地推送在http://my.oschina.net/u/2340880/blog/405491这篇博客中有详细的介绍,这里主要讨论远 ...

  8. iOS 10 消息推送(UserNotifications)秘籍总结(一)

    前言 之前说会单独整理消息通知的内容,但是因为工(就)作(是)的(很)事(懒)没有更新文章,违背了自己的学习的初衷.因为互联网一定要有危机意识,说不定眼一睁,我们就out丢了饭碗. 图片来源网络.jp ...

  9. PHP 微信公众号开发 - 消息推送

    项目微信公众号开发,需要做用户消息推送,记录下来以便日后使用 1,接上一篇文章,可以查看如何获取用户openid PHP 微信公众号开发 - 获取用户信息 2,添加模板消息 3,查看模板详情 根据模板 ...

随机推荐

  1. 看京东如何把Intel RealSense技术用在物流上

    提起Intel RealSense 3D 深度摄像头,总是离不开无人机.机器人等前沿硬件产品,比如 CES 2016 上让人眼前一亮的自动避障无人机Yuneec “台风 H”,Segway.Nineb ...

  2. PostgreSQL的 initdb 源代码分析之十七

    继续分析: setup_collation() 展开: /* * populate pg_collation */ static void setup_collation(void) { #if de ...

  3. Educational Codeforces Round 2 B. Queries about less or equal elements 水题

    B. Queries about less or equal elements Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforc ...

  4. POJ 2406 Power Strings KMP运用题解

    本题是计算一个字符串能完整分成多少一模一样的子字符串. 原来是使用KMP的next数组计算出来的,一直都认为是能够利用next数组的.可是自己想了非常久没能这么简洁地总结出来,也仅仅能查查他人代码才恍 ...

  5. 杭电 3177 Crixalis's Equipment

    http://acm.hdu.edu.cn/showproblem.php? pid=3177 Crixalis's Equipment Time Limit: 2000/1000 MS (Java/ ...

  6. 关于android开发添加菜单XML文件之后无法在R.java中生成ID的问题

    因为和同学分开做的android软件,现在想整合他做的界面部分,于是拷贝了res和src文件夹的文件,其中包括一个res.menu文件夹中的XML.但是每次将该文件导入到工程总无法自动在R.java中 ...

  7. 压力单位MPa、Psi和bar之间换算公式

    压力单位MPa.Psi和bar之间换算公式 1bar=10^5PaPsi为英制压力单位.“磅力每平方英寸(1bf/in2)为1psi=6894.76 pa: 1bar等于10的5次方=10^5 pa ...

  8. 【ZZ】如何选择适合自己项目的编程语言

    http://news.cnblogs.com/n/506473/ 与操作系统一样,在办公室软件套装和计算机中也具有各种计算机语言.存在这种多样性的原因与其它地方的多样性一样—-因为没有单一的解决方法 ...

  9. Python学习 之 文件

    1.文件读写 python进行文件读写的函数是open或file file_handler=open(filename,,mode) (1)打开并读取文件 方式一:open() fo=open('/r ...

  10. Python学习 之 运算符&表达式

    1.Python运算符包括:赋值运算符.算术运算符.关系运算符.逻辑运算符. 表达式是将不同的数据(包括变量.函数)用运算符号按一定规则连接起来的一种式子. 2.赋值运算符:=.+=.-=.*=./= ...