iOS10及以上APNS消息触发场景区分及相关代理方法问询
iOS 10+ 区分APNS消息触发来源:UNUserNotificationCenterDelegate的两个核心方法
嘿,在iOS 10及以上版本处理APNS远程通知时,你不用再纠结怎么区分消息是系统自动接收(App在前台)还是用户点击触发(App在后台/已杀死)的了——苹果在UNUserNotificationCenterDelegate协议里提供了两个专门的方法,完美解决这个问题:
1. 处理前台接收的通知
当你的App处于前台状态时,APNS消息到达后会调用这个方法。你可以在这里决定是否要给用户展示通知(比如弹出横幅、播放声音),通过completionHandler返回对应的展示选项就行。
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler { // 先解析通知携带的自定义内容 NSDictionary *notificationContent = notification.request.content.userInfo; // 示例:选择展示横幅+播放提示音 completionHandler(UNNotificationPresentationOptionBanner | UNNotificationPresentationOptionSound); }
2. 处理用户点击通知的行为
不管你的App是在后台挂起,还是被完全杀死,只要用户点击了通知栏里的APNS消息,这个方法就会被触发。你可以在这里处理跳转页面、执行特定逻辑等操作,记得最后一定要调用completionHandler告诉系统你处理完了。
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler { // 获取通知内容 NSDictionary *notificationContent = response.notification.request.content.userInfo; // 这里写你的点击逻辑,比如跳转到指定页面 // ... // 必须调用这个block,否则可能会有系统警告 completionHandler(); }
最后提个小提醒:一定要在App启动时设置UNUserNotificationCenter的代理,比如在application:didFinishLaunchingWithOptions:方法里加上这段代码:
UNUserNotificationCenter *notificationCenter = [UNUserNotificationCenter currentNotificationCenter]; notificationCenter.delegate = self;
内容的提问来源于stack exchange,提问作者fizix100
相关产品推荐
相关产品推荐

