[iOS]推送相关两点

 

 

讨论一下最近遇到的两个问题:

  • 推送接收

  • 点击推送打开APP时数据的处理

理想情况是:

  1. app处于活跃状态,有推送到来,在应用内部应当弹出我们自己生成的提示。
  2. app处于非活跃状态,有推送到来,弹出系统生成的提示,点击提示会进入app并且显示相关内容。

推送接收

考虑第一种情况,我们需要拿到数据,才能生成相应提示。与此相关的有两个方法:

方法1.-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

方法2.-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

这两个方法看起来比较眼熟,区别在于哪里呢?第二个方法是iOS7之后才出现的,与之相关的是 "iOS 7 Background Remote Notification"这种类型的通知,它允许应用收到通知后在后台(background)状态下运行一段代码,可用于从服务器获取内容更新。功能使用场景:(多媒体)聊天,Email更新,基于通知的订阅内容同步等功能,提升了终端用户的体验。

如果你用到了这个类型的通知,需要在Xcode 中 Capabilities找到 Backgroud Modes,在 Remote notifications打钩,这样就开启了"Background Remote Notification",之后notification 处理函数一律切换第二个方法,我们应该在这里拿数据。

如果你没有使用这种类型的通知,你在两个在这两个方法里二选一(Apple推荐第二个方法),如果两个方法都实现了,会默认调用第二个方法。

If your delegate implements both methods, the app object calls the application:didReceiveRemoteNotification:fetchCompletionHandler: method.

 

点击推送打开APP时数据的处理

当用户点击通知进入app时,你可能想要展示关于这条通知的内容,比如推送了一条商品A的打折信息,用户点击通知进入应用后弹出一个Alert:“商品A打折,是否查看?”。在第二个方法的文档里有这样一段话

If the user opens your app from the system-displayed alert, the system may call this method again when your app is about to enter the foreground so that you can update your user interface and display information pertaining to the notification 意思是当用户点击通知进入app时,会 再次 调用这个方法(之所以用再次这个词,是因为之前说过,如果你的应用处于后台状态并且收到"iOS 7 Background Remote Notification"这种通知,会调用这个方法)。如果你的iOS版本小于iOS7,这个方法就不能使用,你可以在启动方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中拿到推送的数据:

NSDictionary* userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(userInfo){
//do something
}

 

结论

  1. 如果不考虑小于iOS7的版本,所有的问题可以在方法 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 中解决。
  2. 需要支持iOS7之前版本,不需要"iOS 7 Background Remote Notification"这种通知。

    • 不实现上面第二个方法,在第一个方法-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo中接收通知。
    • 用户点击通知打开app时,在方法 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions拿到通知数据。
  3. 需要支持iOS7之前版本,同时需要"iOS 7 Background Remote Notification"这种通知。

    这时比较容易出现重复处理的情况,如iOS7中点击推送进入app,在方法2-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler和启动方法- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中都能获得此条通知数据。

    • 在方法1.-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo和推送接收方法2.-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler中都获得通知内容并处理(不同版本会调用不同方法,不会重复调用)。
    • 在启动方法- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中拿到推送的数据,判断系统版本,如果小于iOS7,拿数据并处理,反之跳过不处理。
 
 
posted @ 2016-01-14 16:26  Wonderful1024  阅读(250)  评论(0编辑  收藏  举报