我的应用程序是使用React Native创建的,需要使用默认的相机应用程序扫描二维码,然后在应用程序中打开特定的屏幕,为了实现这一点,我还使用了React Native Firebase库来设置Firebase动态链接。
设置非常简单,一个使用Firebase提供的域的动态链接,该链接还包含url格式的https://example.page.link/abc-xyz深层链接。
在应用程序扫描QR之后,它使用深度链接url来提取abc-xyz部分并导航到不同的屏幕,这是我的实现。
// App.js
const handleDynamicLink = link => {
const linkCheck = new RegExp('^https://example.page.link/.*$');
let title;
if (linkCheck.test(link.url)) {
title = link.url.substring(link.url.lastIndexOf('/') + 1).split('-');
RootNavigation.navigate(Screens.offer, { title: title });
}
};
...
React.useEffect(() => {
// Handler for background/quit events
dynamicLinks().getInitialLink().then(link => {
handleDynamicLink(link);
});
// Handler for foreground events
const unsubscribe = dynamicLinks().onLink(handleDynamicLink);
return () => unsubscribe();
}, []);
// RootNavigation.js
import * as React from 'react';
export const navigationRef = React.createRef();
export function navigate(name, params) {
navigationRef.current?.navigate(name, params);
}所有必要的设置都已经为iOS和安卓配置,通过扫描二维码在安卓设备上进行测试,它可以识别链接并导航到预期的屏幕,但不适用于iOS,即使它理解链接并且它只打开初始屏幕然后停止。
奇怪的是,如果我直接在设备浏览器中打开链接,它将打开预览页面,然后如果我单击“打开”按钮,它将打开应用程序并导航到目标屏幕。
我想知道这是否与iOS原生端中的导航内容有关?
发布于 2021-10-16 11:22:09
原来我需要为iOS更新AppDelegate.m并添加链接处理程序。
在AppDelegate.m中的@end行上添加了下面的代码。
// AppDelegate.m
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
return [RCTLinkingManager application:application openURL:url options:options];
}
- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity
restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler
{
return [RCTLinkingManager application:application
continueUserActivity:userActivity
restorationHandler:restorationHandler];
}当应用程序处于前台状态或已打开时进行处理。
// App.js
if (Platform.OS === 'ios') {
Linking.addEventListener('url', handleDynamicLink);
}应用程序完全关闭/动态链接启动时的处理。
// App.js
if (Platform.OS === 'ios') {
Linking.getInitialURL()
.then(link => {
handleDynamicLink({ url: link });
})
.catch(error => {
// Error handling
});
} else {
// This part for Android
dynamicLinks().getInitialLink().then(link => {
handleDynamicLink(link);
});
}https://stackoverflow.com/questions/69587088
复制相似问题