iOS远程推送调用方法顺序

一、远程推送涉及的方法(5个):

(1) - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

(2) - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

(3) - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler

(4) - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler

(5) - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler 

方法(1)会在app启动完成调用launchOptions保存了app启动的原因信息,如果app是因为点击通知栏启动的,可以在launchOptions获取到通知的具体内容。

方法(2)会在接收到通知的时候调用,在最新的iOS 10中已经废弃,建议不再使用。

方法(3)是在iOS 7之后新增的方法,可以说是 2 的升级版本,如果app最低支持iOS 7的话可以不用添加 2了。

其中completionHandler这个block可以填写的参数UIBackgroundFetchResult是一个枚举值。主要是用来在后台状态下进行一些操作的,比如请求数据,操作完成之后,必须通知系统获取完成,可供选择的结果有

typedef NS_ENUM(NSUInteger, UIBackgroundFetchResult) { UIBackgroundFetchResultNewData, 

UIBackgroundFetchResultNoData, 

UIBackgroundFetchResultFailed 

}

分别表示获取到了新数据(此时系统将对现在的UI状态截图并更新App Switcher中你的应用的截屏),没有新数据,以及获取失败。不过以上操作的前提是已经在Background Modes里面勾选了Remote notifications(推送唤醒)且推送的消息中包含content-available字段。

方法(4)是 iOS 10 新增的UNUserNotificationCenterDelegate代理方法,在 iOS 10的环境下,点击通知栏都会调用这个方法。

方法(5)也是 iOS 10 新增的UNUserNotificationCenterDelegate代理方法,在iOS 10 以前,如果应用处于前台状态,接收到推送,通知栏是不会又任何提示的,如果开发者需要展示通知,需要自己在 3 的方法中提取通知内容展示。在iOS 10中如果开发者需要前台展示通知,可以再在这个方法中completionHandler传入相应的参数。

typedef NS_OPTIONS(NSUInteger, UNNotificationPresentationOptions) {     UNNotificationPresentationOptionBadge = (1 << 0),

    UNNotificationPresentationOptionSound = (1 << 1),

    UNNotificationPresentationOptionAlert = (1 << 2),

}

总结:(最低系统环境为iOS 7)

当程序处于关闭状态的时候收到推送消息,点击应用程序图标无法获取推送消息, iOS 10 环境下,点击通知栏会调用 方法(1)与(4)。非iOS 10的情况下,会调用方法(1)与(3)。

当程序处于前台状态下收到推送消息,iOS 10的环境下如果推送的消息中包含content-available字段的话执行方法(3)与(4),否则只执行(4)。非iOS 10的情况下会执行方法3。

当程序处于后台收到推送消息,如果已经在Background Modes里面勾选了Remote notifications(推送唤醒)且推送的消息中包含content-available字段的话,都会执行方法(3)。点击通知栏 iOS 10会执行方法(4),非iOS10会执行方法(3)。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 极光推送: 1.JPush当前版本是1.8.2,其SDK的开发除了正常的功能完善和扩展外也紧随苹果官方的步伐,SD...
    Isspace阅读 11,713评论 10 16
  • 推送通知 注意:这里说的推送通知跟NSNotification有所区别 NSNotification是抽象的,不可...
    iOS开发攻城狮阅读 9,757评论 1 13
  • 许多集成的步骤个推官网都有了,这里只写关于推送的远程推送和本地通知的步骤和代码。APP在后台时:走苹果的APNS通...
    AllureJM阅读 7,758评论 1 9
  • 写作原因:网上看了很多推送文章都没有完美的解答我的疑惑;主要有以下两点,1:推送来了我点击应用图标进入应用怎么取到...
    Thebloodelves阅读 9,996评论 26 71
  • 推送通知注意:这里说的推送通知跟NSNotification有所区别NSNotification是抽象的,不可见的...
    醉叶惜秋阅读 5,407评论 0 3