iOS后台/退出状态下Remote Notification代理未触发问题求助
iOS后台/退出状态下Remote Notification代理未触发的解决配置
针对你遇到的iOS应用后台/退出状态下didReceiveRemoteNotification:fetchCompletionHandler:不触发的问题,需要补充以下关键配置和注意事项:
1. 开启后台推送权限
在Xcode项目中配置后台模式:
- 打开项目Target → 切换到
Signing & Capabilities标签 - 点击
+ Capability,添加Background Modes - 勾选
Remote notifications选项
注意:iOS模拟器对后台推送的支持有限,部分唤醒逻辑无法触发,建议优先用真机测试。
2. 推送Payload必须包含content-available: 1
后台发送的推送消息必须携带该字段,告知系统唤醒应用处理推送:
{ "aps": { "alert": "测试推送内容", "badge": 1, "sound": "default", "content-available": 1 }, "customData": "自定义业务数据" }
- 若使用第三方推送平台(如Firebase、JPush),需确保平台配置正确传递该字段,且字段值为整数
1而非字符串。
3. 实现UNUserNotificationCenter的点击代理方法
应用处于后台/退出状态时,点击推送通知不会触发didReceiveRemoteNotification,而是触发didReceiveNotificationResponse,需补充实现该方法:
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler { NSDictionary *userInfo = response.notification.request.content.userInfo; NSLog(@"后台/退出状态下点击推送"); [RNCPushNotificationIOS didReceiveNotificationResponse:response]; completionHandler(); }
同时要在didFinishLaunchingWithOptions中设置代理:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 其他初始化逻辑 UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; center.delegate = self; // 请求通知权限 [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) { if (granted) { [[UIApplication sharedApplication] registerForRemoteNotifications]; } }]; return YES; }
4. 处理退出状态下的启动推送
应用完全退出时,点击推送会直接启动应用,需在didFinishLaunchingWithOptions中处理启动参数里的推送信息:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 其他初始化逻辑 if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) { NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]; NSLog("从推送启动应用"); [RNCPushNotificationIOS didReceiveRemoteNotification:userInfo fetchCompletionHandler:^(UIBackgroundFetchResult result) {}]; } return YES; }
5. iOS 17额外注意事项
- iOS 17对后台活动限制更严格,确保应用未被系统标记为"后台受限"(可在设置→通用→后台App刷新中检查)
- 若使用模拟器测试,可通过Xcode的
Debug → Simulate Background Fetch模拟后台唤醒,或用终端命令发送推送(需提前获取设备token)
内容的提问来源于stack exchange,提问作者Office Space
相关产品推荐
相关产品推荐

