[iOS]推送相关两点

 

 

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

  • 推送接收

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

理想状况是:服务器

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

推送接收

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

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

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

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

若是你用到了这个类型的通知,须要在Xcode 中 Capabilities找到 Backgroud Modes,在 Remote notifications打钩,这样就开启了"Background Remote Notification",以后notification 处理函数一概切换第二个方法,咱们应该在这里拿数据。this

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

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

 

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

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

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,拿数据并处理,反之跳过不处理。
相关文章
相关标签/搜索