iOS中点击OneSignal通知意外弹出次级窗口问题求助
Expo iOS集成OneSignal推送:解决launchURL弹出Safari弹窗问题
问题背景
基于Expo构建的iOS应用,完全依赖WebView处理页面导航(无原生路由),点击携带launchURL的OneSignal通知时,目标链接未在应用内WebView打开,反而弹出右上角带“Done”按钮的系统Safari弹窗。
核心原因
OneSignal默认会自动处理launchURL,直接调用系统浏览器/弹窗打开链接,并未将URL的控制权交还给应用的自定义导航逻辑。
解决步骤
1. 拦截通知点击事件,阻止默认跳转行为
在应用初始化OneSignal的代码中,添加通知打开监听器,手动接管launchURL的处理,并阻止OneSignal的默认跳转:
import OneSignal from 'react-native-onesignal'; // 初始化OneSignal(确保已配置好App ID) OneSignal.setAppId('你的OneSignal App ID'); // 处理前台/后台状态下的通知点击 OneSignal.setNotificationOpenedHandler(async (notification) => { const targetUrl = notification.notification.launchURL; if (targetUrl) { // 将URL传递给WebView加载(示例:通过WebView的ref调用loadUrl) // webViewRef.current?.loadUrl(targetUrl); // 返回true,阻止OneSignal触发默认的URL打开行为 return true; } }); // 处理应用冷启动时的通知点击 OneSignal.getInitialNotification().then((notification) => { if (notification?.notification.launchURL) { // 执行相同的WebView加载逻辑 return true; } });
2. 确保WebView内部导航逻辑正常
检查WebView的配置,确保已拦截同域名链接的外部跳转,仅在应用内加载:
import { WebView } from 'react-native-webview'; import { useRef } from 'react'; import Linking from 'react-native/Libraries/Linking/Linking'; function AppWebView() { const webViewRef = useRef(null); return ( <WebView ref={webViewRef} source={{ uri: '你的初始网页地址' }} onShouldStartLoadWithRequest={(request) => { // 仅允许加载指定域名的链接,外部链接可自定义处理 if (request.url.includes('devengage.fudr.in')) { return true; } // 外部链接跳转至系统浏览器 Linking.openURL(request.url); return false; }} /> ); }
3. 确认OneSignal插件配置兼容性
当前app.json中的OneSignal插件配置无需额外调整,需保证onesignal-expo-plugin与react-native-onesignal版本兼容(你的版本组合4.4.1+1.1.1适配Expo 46)。
关键提示
react-native-onesignal 4.x版本中,setNotificationOpenedHandler返回true即可拦截默认跳转逻辑;- 应用冷启动时的通知点击必须通过
getInitialNotification处理,否则无法覆盖系统默认行为。
内容的提问来源于stack exchange,提问作者Prashant Singhal
相关产品推荐
相关产品推荐

