如何使用React Native Firebase动态链接获取iOS的初始链接?

时间:2020-01-22 05:14:37

标签: ios firebase react-native firebase-dynamic-links react-native-firebase

我正在使用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 推出了。为什么会这样?

请在这里建议我做错了。

1 个答案:

答案 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)
      })
  }
})