先来说下iOS7到iOS10之间的情况,接收通知只有两个方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler
如果写了第二个,第一个则不会被执行,第一个方法在iOS10之后被弃用,第二个方法则用来接受iOS7-9的远程通知和iOS10之后的静默通知,看苹果的描述
翻译:使用UserNotifications Framework - [UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:]或 - [UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:]用于用户可见通知, - [UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:]用于静默远程通知
下面就只涉及到三个方法了
- didReceiveNotificationResponse:withCompletionHandler
- willPresentNotification
- didReceiveRemoteNotification
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler
iOS7-9之间用来接收通知和iOS10之后用来接受静默通知。静默推送参考。
iOS10以后,app在前台或者后台收到通知时触发的方法(如果集成了个推第三方,这个方法也不会触发,而是会走第三方长连接)。
iOS10以后app被杀掉时收到静默通知不会触发。
当content-available=1且app在前台或者后台时(不会在通知中心显示通知),可用来做静默推送进行后台数据下载或者刷新UI等操作,需要打开app后台模式。支持iOS7以上。
关于静默推送(a) 增加content-available字段,并设成1 。(b) alert字段必须为空,否则收到的就不是静默推送而是普通通知。 (c)sound字段设不设不影响静默推送的接收,只不过会出现符不符合需求的问题。还有一个badge属性,设置的话也不影响静默推送的接收,但是和sound一样。
当普通推送中有content-available=1时,app在前台和后台时也会触发该方法。
willPresentNotification
app在前台收到通知被调用,支持iOS10以上
didReceiveNotificationResponse
支持iOS10以上,通过以下三种方式被调用
- 点击通知进入应用
- 点击action
- 清除了category是UNNotificationCategoryOptionCustomDismissAction的通知。
PS:
测试通知的生产环境需要打adhoc包进行测试。使用xcode的weindow->organizer可以查看之前已经打包的界面,在包上右键show in finder
,并显示包内容,找到Products文件夹下的.app后缀的文件,在外面新建文件夹命名为Payload,将.app拷贝进去,压缩文件夹并该后缀为.ipa之后,就可以安装在手机上测试了。