React Native iOS端应用退出时如何处理通知动作及提升推送送达率
方案1:优先实现「通知类推送交互动作可在App退出状态下处理」(推荐,符合苹果推送规范,稳定性更高)
这个方案的可靠性远高于强行优化纯数据后台通知的送达率,因为苹果本身就对后台通知做了频次限制,聊天场景高频率发送必然会被系统限流。
具体配置步骤:
- 调整iOS推送载荷
你之前已经改成通知+数据的混合类型,现在只需在aps字段内补充category参数,值和你本地定义的分类id对应即可,比如好友请求类推送填invitation,聊天消息类填reply,修改后的apns配置示例:
apns: { payload: { aps: { alert: { title: "Friend Request", body: oSender.displayname + " invited you to be friends." }, sound: "default", category: "invitation" }, // 自定义数据字段直接放在payload根节点,不要包裹在aps内部 referencetype: "user", referenceid: senderid, referencename: oSender.displayname, receiverid: receiverid, type: "friend", notificationid: notification.id }, headers: { 'apns-push-type': 'alert', 'apns-priority': '10', 'apns-topic': 'llc.attebyte.partyme' } }
- 原生层补充通知代理配置
你现在收不到退出状态下的动作回调,是因为react-native-push-notification的默认配置没有在App启动时就接管通知响应,需要在iOS原生工程的AppDelegate.m/AppDelegate.mm中补充以下代码:
- 先导入依赖头文件:
#import <UserNotifications/UserNotifications.h> #import <RNCPushNotificationIOS.h>
- 在
didFinishLaunchingWithOptions启动方法中注册通知代理:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 保留原有启动逻辑,在return前添加以下代码 UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; center.delegate = self; return YES; }
- 补充通知响应的回调方法,将事件传递到RN层:
// 处理所有通知动作点击,包含App完全退出状态下的点击 - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler { [RNCPushNotificationIOS didReceiveNotificationResponse:response]; completionHandler(); } // 处理App前台运行时的通知展示 - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler { completionHandler(UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionBadge); }
- RN层逻辑适配
原有onNotification回调即可接收全状态下的通知动作事件,包含App退出后的点击,可通过message.action字段判断用户点击的动作按钮,快捷回复的输入内容可以从message.userInput字段获取,不需要额外修改现有RN逻辑。
方案2:优化纯数据后台通知送达率(不推荐,仅作参考)
苹果对后台通知的限制是系统级的,无法100%保证送达,仅可通过参数调整提高投递概率:
- 将apns的priority从
5改为10,高优先级会被系统优先投递,但若App后台活跃度过低仍会被限流 - 纯后台通知仅保留
content-available: 1,不要同时携带alert相关字段 - 控制单用户的后台通知发送频次,短时间内大量发送会被系统直接丢弃
- 提前确认用户开启了App的后台刷新权限,关闭该权限后所有后台通知都无法接收
内容的提问来源于stack exchange,提问作者Tristan
相关产品推荐
相关产品推荐

