我正在我的 React Native 应用程序中实现与 expo 的深度链接。我已经成功地使用此代码以及本教程和本文档来将其调整为我的嵌套堆栈:
const linking = {
prefixes:[prefix],
config: {
screens: {
Drawer: {
screens: {
Tabs: {
screens: {
Profile:"profile"
}
}
}
},
}
}
}
return (
<NavigationContainer linking={linking}>
<RootStackScreen actions={actions} showLoader={showLoader} user={user} {...props} />
</NavigationContainer>
)
}
如果我使用
myscheme://profile
,它会按预期工作,但前提是应用程序在后台打开。当应用程序关闭时,它只是在我的初始主屏幕中打开它,我尝试谷歌搜索和搜索,但找不到任何适合我所做的解释。我还尝试将 getInitialRoute
功能添加到 linking
,该功能在应用程序关闭并从深层链接打开时触发,但不知道如何使用它来激活导航。
async getInitialURL() {
const url = await Linking.getInitialURL(); // This returns the link that was used to open the app
if (url != null) {
//const { path, queryParams } = Linking.parse(url);
//console.log(path,queryParams)
//Linking.openURL(url)
return url;
}
},
我想您确认您的函数 getInitialURL 在您的应用程序启动时被调用?另外,
if (url != null) {
中的注释代码不应该被注释吗?
如果上述情况正常,则问题可能与启用的调试器有关。根据 React Native 的文档 (https://reactnative.dev/docs/linking#getinitialurl):
启用调试时,getInitialURL 可能会返回 null。禁用调试器以确保它通过。
我遇到了同样的问题,并且执行以下操作对我有帮助
const ApplicationNavigator = () => {
useEffect(() => {
// THIS IS THE MAIN POINT OF THIS ANSWER
const navigateToInitialUrl = async () => {
const initialUrl = await Linking.getInitialURL()
if (initialUrl) {
await Linking.openURL(initialUrl)
}
}
navigateToInitialUrl()
}, [])
const linking = {
prefixes: ['<your_custom_scheme>://'],
config: {
/* configuration for matching screens with paths */
screens: {},
},
}
return (
// Your components/navigation setup
)
}
很明显,您的应用程序收到了该网址,但以某种方式“使用”它从后台唤醒应用程序。当它位于前台时,useEffect 运行并使用 URL 导航到预期屏幕。
PS:确保您的链接树与您的应用程序树匹配
基于https://documentation.onesignal.com/v7.0/docs/react-native-sdk#handlers
iOS 中应用程序关闭状态下的深度链接
您必须修改 AppDelegate.m 文件中的 application:didFinishLaunchingWithOptions 才能使用以下内容:
NSMutableDictionary *newLaunchOptions = [NSMutableDictionary dictionaryWithDictionary:launchOptions];
if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) {
NSDictionary *remoteNotif = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
if (remoteNotif[@"custom"] && remoteNotif[@"custom"][@"u"]) {
NSString *initialURL = remoteNotif[@"custom"][@"u"];
if (!launchOptions[UIApplicationLaunchOptionsURLKey]) {
newLaunchOptions[UIApplicationLaunchOptionsURLKey] = [NSURL URLWithString:initialURL];
}
}
}
RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:newLaunchOptions];
也在反应导航中:
https://reactnavigation.org/docs/deep-linking/
const linking = {
prefixes: ["https://example.com", "example://"],
config,
async getInitialURL() {
const url = await Linking.getInitialURL();
if (url != null) {
return url;
}
},
};
<NavigationContainer linking={linking}>
...
</NavigationContainer>
我面临这个问题,因为第一次加载导航为空,所以我添加了超时来导航到深层链接路径:
//helper.ts `让导航;
function setNavigation(navigationRef) {
navigation = navigationRef;
}
function getNavigation() {
return navigation;
}
export { setNavigation, getNavigation };
`
//App.tsx:
useEffect(() => {
async function getInitialUrl() {
try {
const initialUrl = await Linking.getInitialURL();
if (initialUrl) {
setData(Linking.parse(initialUrl));
}
} catch (error) {
console.error("Error getting initial :", error);
}
}
const subscription = Linking.addEventListener("url", handleDeeplinkUrl);
if (!data) {
getInitialUrl();
}
return () => {
subscription.remove();
};
}, [data]); // Add data as a dependency to avoid missing the initial URL
function handleDeeplinkUrl(event) {
let data = Linking.parse(event.url);
setData(data);
if (data.hostname === "details") {
let navigation = getNavigation();
if (!navigation) {
// If navigation is not available, wait for 500 milliseconds and try again
setTimeout(() => {
navigation = getNavigation();
if (navigation) {
navigation.navigate("Details", { id: data.path });
}
}, 500);
} else {
navigation.navigate("Details", { id: data.path });
}
}
}
我也遇到了同样的问题。在 iOS(flutter build)中,我通过添加“可用内容”解决了这个问题。本文位于:Apple 内容可用文档。我正在使用 OneSignal,因此在 api 中我添加了该字段。现在,即使应用程序被强制关闭,它也会醒来并且深层链接可以工作。对于 Onesignal,我必须使用“content_available”:true。完整的 Onesignal 邮递员代码是:
{
"app_id": "1234",
"included_segments": ["Test"],
"content_available" : true,
"contents": {
"en": "Hi"
},
"data": {
"dynamic_link": "https://google.com"
},
"headings": {
"en": "Testing"
}
}