iOS 接收远程推送主要牵扯到的方法有以下五种
(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
- 会在app启动完成调用
launchOptions
保存了app启动的原因信息,如果app是因为点击通知栏启动的,可以在launchOptions
获取到通知的具体内容。 - 会在接收到通知的时候调用,在最新的iOS 10中已经废弃,建议不再使用。
- 是在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
字段。
- 是 iOS 10 新增的
UNUserNotificationCenterDelegate
代理方法,在 iOS 10的环境下,点击通知栏都会调用这个方法。 - 也是 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与5,否则只执行5。非iOS 10的情况下会执行方法3。当程序处于后台收到推送消息,如果已经在
Background Modes
里面勾选了Remote notifications
(推送唤醒)且推送的消息中包含content-available
字段的话,都会执行方法3。点击通知栏 iOS 10会执行方法4,非iOS10会执行方法3。