iOS React Native环境下Braze推送Deeplink后台唤起失效问题
Braze Deeplink iOS 后台唤起跳转失效问题
问题现象:使用Braze推送Deeplink时,App处于关闭状态下点击推送,能正常唤起App并跳转至指定页面(如Deeplink设为onboarding可跳转引导页);但App在后台运行时,点击推送仅能唤起App,无法跳转至目标页面。
现有代码
appDelegate.mm
// Deep Linking - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { NSLog(@"Calling RCTLinkingManager with url %@", url); return [RCTLinkingManager application:application openURL:url options:options]; } // Universal links - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> *restorableObjects))restorationHandler { return [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; }
app.tsx
setupLinking = async () => { // Listen to links opened when the app is closed const initialLink = await Linking.getInitialURL(); if (initialLink) { this.onURLEvent({ url: initialLink }); } // Listen to links opened in the app or when the app is in background Linking.addEventListener('url', this.onURLEvent); }; onURLEvent = async (event: { url: any; }) => { const { url } = event; if (!url) { return; } const link = getLinkFromDynamicLink(url); const eventMethod = getMethodFromLink(link); }
问题原因及修复方案
核心原因
App后台运行时,点击Braze推送的Deeplink,iOS不会触发openURL或continueUserActivity方法,而是触发推送点击的专属回调,但现有代码未处理该场景下的Deeplink解析与传递。
修复步骤
- 在appDelegate.mm中添加推送点击回调处理
实现userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:方法,从推送payload中提取Deeplink并传递给RCTLinkingManager:
#import <UserNotifications/UserNotifications.h> #import <React/RCTLinkingManager.h> // 处理推送点击事件 - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler { NSDictionary *userInfo = response.notification.request.content.userInfo; // 从Braze推送payload中获取Deeplink(字段名需与Braze后台配置一致,通常为"uri") NSString *deeplink = userInfo[@"uri"]; if (deeplink) { NSURL *url = [NSURL URLWithString:deeplink]; [RCTLinkingManager application:self.application openURL:url options:@{}]; } completionHandler(); }
确认Braze推送配置匹配
在Braze后台配置推送时,将Deeplink填入payload的对应字段(需与代码中提取的字段名一致,比如uri),确保推送内容包含该Deeplink字段。补全页面跳转逻辑
检查onURLEvent方法,确保获取到eventMethod后执行了对应的页面导航操作,示例:
onURLEvent = async (event: { url: any; }) => { const { url } = event; if (!url) { return; } const link = getLinkFromDynamicLink(url); const eventMethod = getMethodFromLink(link); // 补充导航逻辑,根据实际路由调整 if (eventMethod === 'onboarding') { navigation.navigate('Onboarding'); } }
额外测试提示
- 通过Xcode控制台日志,确认推送点击时是否触发了
userNotificationCenter:didReceiveNotificationResponse:方法,以及Deeplink是否被正确提取传递。 - 若使用Universal Links,需确保
apple-app-site-association文件配置正确,且Braze推送使用的是对应格式的链接。
内容的提问来源于stack exchange,提问作者Random guy
相关产品推荐
相关产品推荐

