我正在使用react-native-firebase :: 5.6.0,在获取iOS设备的初始链接时遇到问题。在android上运行正常。如果用户未登录应用程序,我正在使用“ Firebase动态链接”在我的应用程序登录屏幕内重定向用户,否则,如果他已经登录,则仅打开应用程序。 它适用于android应用,但ios应用存在问题。我使用了两个功能,一个是在应用程序“ getInitialLink”关闭时获取动态链接,另一个是检查应用程序“ onLink”何时打开。
这是我在关闭启动画面后使用的功能,仅在从关闭状态打开应用程序时才调用一次。
firebase.links().getInitialLink().then((url) => {
if (url && url === 'https://mycustomdomain.co.in') {
navigationToScreen(AUTH, INITIAL_SCREEN);
} else {
// INITIALIZE APP HERE
}
});
如果应用程序已经打开,我将在此函数中获取动态链接的网址值:
this.unsubscribeHandleOpenAppDynamicLinks = firebase.links().onLink(async (url) => {
let isLoggedIn = await AsyncStorage.getItem(LocalStorageKeys.IS_LOGGEDIN);
if (url) {
if ( isLoggedIn !== 'yes' && url === 'https://mycustomdomain.co.in') {
navigationToScreen(AUTH, INITIAL_SCREEN);
}
}
});
and clearing that listener on componentWillUnmount:: this.unsubscribeHandleOpenAppDynamicLinks();
在iOS上,只有“ onLink”功能可以正常使用 网址值为“未定义”。 getInitialLink()函数将 返回从中启动应用程序的URL。如果应用是 不是从URL启动,返回值将为null,但我是 即使在iOS中从URL启动应用程序时也会得到“未定义” 只要。如果应用程序为iOS,我在iOS的onLink()中获取url 推出了。为什么会这样?
请在这里建议我做错了。
答案 0 :(得分:2)
如果getInitialLink
方法不起作用,则可能是由于链接不正确,或者是由于Expo运行时。或者,使用Linking.getInitialURL
方法获取初始URL。这也需要一点本机代码。这是因为链接模块不知道如何解释缩短的URL。因此,我们调用Firebase SDK的resolveShortLink
方法来获取嵌入式深层链接。收到嵌入式深层链接后,我们就可以照常在应用程序中对其进行处理。
此article中记录了本机源代码。但是为了完整起见,我将其发布在这里。
#import "FDLResolver.h"
#import <React/RCTLog.h>
@implementation FDLResolver
RCT_EXPORT_MODULE();
RCT_EXPORT_METHOD(resolveShortLink:(NSString *)shortLink :(RCTPromiseResolveBlock)resolve
:(RCTPromiseRejectBlock)reject)
{
id completion = ^(NSURL *_Nullable dynamicLink, NSError *_Nullable error) {
if (!error && dynamicLink) {
resolve(dynamicLink.absoluteString);
} else {
reject(@"Error", @"Error in getting dynamic link", error);
}
};
NSURL *shortLinkURL = [NSURL URLWithString:shortLink];
[[FIRDynamicLinks dynamicLinks] resolveShortLink:shortLinkURL completion:completion];
}
@end
链接模块代码在下面。
Linking.getInitialURL().then(url => {
if (url && url.includes('page.link')) {
const shortLink = url.replace('exps', 'https')
NativeModules.FDLResolver.resolveShortLink(shortLink)
.then(link => {
const linkParts = link.split('?')
const query = qs.parse(linkParts[1])
this.parseRouteUrl(query.deep_link_id)
})
}
})