Expo托管工作流中Firebase Dynamic Links在iOS无法跳转深层链接
Expo Managed Workflow中Firebase动态链接iOS无法跳转深层链接的解决方案
1. 补充导航链接前缀配置
你的AppNavigation.js里的prefixes仅包含myapp.web.app域名,但Firebase动态链接使用的是myapp.page.link域名,iOS通过动态链接打开应用时,传递的初始链接属于该域名,必须将其加入前缀列表:
const linking = { prefixes: [ prefix, 'https://myapp.web.app', 'https://*.myapp.web.app', 'https://myapp.page.link', // 新增Firebase动态链接域名 'https://*.myapp.page.link' // 新增通配符域名 ], // 需配置路径解析规则,确保深层链接能映射到对应页面 config: { screens: { // 示例:若深层链接为 /detail/:id,对应导航内的Detail页面 Detail: 'detail/:id', // 根据你的页面结构补充其他映射规则 } } };
2. 检查Firebase动态链接域名的AASA配置
你目前仅在myapp.web.app部署了AASA文件,但myapp.page.link域名也需正确配置Universal Links:
- 登录Firebase控制台,进入「动态链接」设置页,确认已关联你的iOS应用(Bundle ID和App Store ID需与配置一致)
- 直接访问
https://myapp.page.link/apple-app-site-association,检查返回的文件是否包含你的App ID:
{ "applinks": { "apps": [], "details": [ { "appID": "1234567890.com.my.app", "paths": ["*"] } ] } }
若返回内容不符,需在Firebase控制台重新配置iOS应用关联。
3. 完善动态链接生成Payload
修正Payload中的字符串格式问题,并添加iosDeepLink明确指定iOS端跳转链接:
const payload = { dynamicLinkInfo: { domainUriPrefix: 'https://myapp.page.link', link: `https://myapp.web.app/${deepLink}`, androidInfo: { androidPackageName: 'com.my.app', // 补充字符串引号 }, iosInfo: { iosBundleId: 'com.my.app', // 补充字符串引号 iosAppStoreId: '1234567890', iosDeepLink: `https://myapp.web.app/${deepLink}` // 明确指定iOS深层链接 }, } };
4. 验证Universal Links有效性
- 在iOS设备的Safari中打开动态链接,长按链接查看是否有「在[你的应用]中打开」选项,若无则说明Universal Links未生效
- 确认
app.config.js中的associatedDomains无拼写错误,修改后需重新执行EAS构建(该配置变更需重新打包生效)
5. 处理冷启动/后台启动的链接解析
在App组件中监听链接变化,确保冷启动和后台唤醒时都能正确解析深层链接:
import { Linking } from 'expo'; import { useNavigation } from '@react-navigation/native'; export default function App() { const navigation = useNavigation(); useEffect(() => { // 处理冷启动时的初始链接 Linking.getInitialURL().then(url => url && handleDeepLink(url)); // 处理后台唤醒时的链接 const subscription = Linking.addEventListener('url', ({ url }) => handleDeepLink(url)); return () => subscription.remove(); }, []); const handleDeepLink = (url) => { const path = new URL(url).pathname; // 根据路径映射导航到对应页面,示例: if (path.startsWith('/detail/')) { const id = path.split('/')[2]; navigation.navigate('Detail', { id }); } }; // ... 其他组件代码 }
内容的提问来源于stack exchange,提问作者Ilya T
相关产品推荐
相关产品推荐

