【问题标题】:How to get initial link for iOS using react native firebase dynamic links?如何使用 react native firebase 动态链接获取 iOS 的初始链接?
【发布时间】:2020-01-22 05:14:37
【问题描述】:

我正在使用 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
    }
});

如果应用程序已经打开,我将在此函数中获取动态链接 url 值::

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”功能有效,我正在 将 url 值设为“未定义”。 getInitialLink() 函数将 返回应用程序启动的 URL。如果应用程序是 不是从 URL 启动的,返回值将为空,但我是 即使在 iOS 的情况下从 url 启动应用程序时也会出现“未定义” 只要。如果是 iOS,我在 onLink() 中获取 url 推出。为什么会这样??

请提出我在这里做错了什么。

【问题讨论】:

  • 我也有类似的问题。我注意到 Linking.getInitialURL 有效。过去一个小时左右一直在诅咒 react-native-firebase。
  • @vijayst 你有什么发现吗?我开始查看 getInitialURL 但它返回的 URL 不像 RNF 从 onLink 返回的那样干净
  • 是的,我找到了解决方案。但是,在评论中写它太长了。我将获得的缩短链接传递给我编写的本机模块 - 该模块使用 Firebase SDK resolveShortLink 函数。这会返回您在应用中需要的深层链接。
  • @alittletf 我在本文中提供了本机代码:vijayt.com/post/…

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


【解决方案1】:

如果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)
      })
  }
})

【讨论】:

  • 嘿@vijayst 感谢您抽出时间写一篇关于此的博客文章。不幸的是,我遇到了一个错误。我完全按照你的指示做了。我不断收到“未处理的承诺拒绝。类型错误:null 不是对象(评估 '_reactNative.NativeModules.FDLResolver.resolveShortLink')。任何可能有什么问题?用 exps 替换 https 的意义是什么?
  • 您必须将 FDLResolver.h 和 FDLResolver.m 添加到您的 Xcode 项目中(就像您对任何本机模块所做的那样)
  • 你能描述得更详细一点吗?我以前从未添加过本机模块。我已将我的 FDLResolver.h 和 FDLResolver.m 文件放在我的 AppDelegate 文件所在的 /ios/myproj 文件夹中。你是说我需要像这样将 FDLResolver.h 文件导入到我的 AppDelegate.m 文件中 ---> "#import "FDLResolver.h" ?
  • 我能够让事情正常进行!我使用 webstorm 进行开发,虽然我在正确的目录中创建了文件,但我注意到它们没有出现在 Xcode 中。我将文件添加到 xcode 中,现在一切正常。非常感谢!!!
  • @alittletf - 我写了一篇后续文章让 getInitialLink 工作 - vijayt.com/post/…
猜你喜欢
  • 2019-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 2020-10-27
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
相关资源
最近更新 更多