接收到通知时有两种进入的方式:
1.当app未运行时
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;launchOptions不会为空,就可以根据launchOptions是否为空来判断是否有推送消息,当launchOptions不为空时,你就可以发一个通知,可以再rootViewController中接收通知执行响应的操作。
2.当app在后台运行时
激活APP时会走
-(void)applicationDidBecomeActive:(UIApplication *)application;这个方法,在这里面里可以对推送消息做响应的处理

我们可以设想一下消息通知的几种使用场景:
  1,在app没有被启动的时候,接收到了消息通知。这时候操作系统会按照默认的方式来展现一个alert消息,在app icon上标记一个数字,甚至播放一段声音。
  2,用户看到消息之后,点击了一下action按钮或者点击了应用图标
  如果action按钮被点击了,系统会通过调用application:didFinishLaunchingWithOptions:这个代理方法来启动应用,并且会把notification的payload数据传递进去。
  如果应用图标被点击了,系统也一样会调用application:didFinishLaunchingWithOptions:这个代理方法来启动应用,唯一不同的是这时候启动参数里面不会有任何notification的信息。
  示例代码如下:   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  {
  // do initializing works
  ...
  
  if (launchOptions) {
  // do something else
  ...
  
  [AVAnalytics trackAppOpenedWithLaunchOptions:launchOptions];
  }
  
  [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];   return YES;
  }
  3,如果远程消息发送过来的时候,app正在运行,这时候会发生什么呢?
  app代理的application:didReceiveRemoteNotification:方法会被调用,同时远程消息中的payload数据会作为参数传递进去。
  示例代码如下:   - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
  if (application.applicationState == UIApplicationStateActive) {
  // 转换成一个本地通知,显示到通知栏,你也可以直接显示出一个alertView,只是那样稍显aggressive:)
  UILocalNotification *localNotification = [[UILocalNotification alloc] init];
  localNotification.userInfo = userInfo;
  localNotification.soundName = UILocalNotificationDefaultSoundName;
  localNotification.alertBody = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"];
  localNotification.fireDate = [NSDate date];
  [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
  } else {
  [AVAnalytics trackAppOpenedWithRemoteNotificationPayload:userInfo];
  }
  }

最新文章

  1. eclipse安装genymotion的奇葩问题
  2. Visual C++ 设置适合自己的解决方案目录结构
  3. hdu 1222 Wolf and Rabbit
  4. jvisualvm 使用
  5. Mac OSX 安装Python的paramiko模块经验总结
  6. OpenCL 第10课:kernel,work_item和workgroup
  7. DES、AES、TEA加密算法的比较
  8. Oracle EBS-SQL (PO-18):检查工作台下达的PR在系统找不到.sql
  9. WCF学习笔记之事务编程
  10. C++从函数返回指针
  11. hive -- 自定义函数和Transform
  12. cocos开发学习记录
  13. ASP.NET MVC使用Oauth2.0实现身份验证
  14. AJAX之三种数据传输格式详解
  15. Django的调试方法
  16. mybatis左连接需要输出左表的指定内容与筛选
  17. Flink架构分析之HA
  18. Android - Telephony API 1.5
  19. 【Todo】找出共同好友 & Spark & Hadoop面试题
  20. redis+cookie+json+filter实现单点登录

热门文章

  1. Android 设置控件可见与不可见
  2. Android 使控件各占屏幕的一半
  3. matlab安装和入门
  4. VS2005代码自动提示功能失灵
  5. C++文件读写总结
  6. BZOJ1895: Pku3580 supermemo
  7. meta你到底了解多少
  8. 纯CSS实现侧边栏/分栏高度自动相等
  9. 删除一个目录和其各级子目录下的.svn文件
  10. UVA 11426 GCD - Extreme (II) 欧拉函数