[RN][IOS]是不是可以将 React Native RCTLinking 与 RNFirebase 动态链接结合使用?

Posted

技术标签:

【中文标题】[RN][IOS]是不是可以将 React Native RCTLinking 与 RNFirebase 动态链接结合使用?【英文标题】:[RN][IOS]Is it possible to use react native RCTLinking in conjonction with RNFirebase dynamic links?[RN][IOS]是否可以将 React Native RCTLinking 与 RNFirebase 动态链接结合使用? 【发布时间】:2018-01-13 11:01:03 【问题描述】:

我目前正在通过 RCTLinking API 处理 ios 通用链接。由于某些原因,我需要使用 Firebase 动态链接,我想知道是否可以在我的应用中同时使用这两种链接。 我的问题是:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler

这似乎不兼容,因为我需要同时返回 RCTLinkingManager 和 RNFirebaseLinks

有什么办法吗?

【问题讨论】:

【参考方案1】:

回答这个问题有点晚了,但目前建议的答案不起作用。它将无法从 Firebase 应用内消息中打开操作,因为从 RNFirebaseLinks 返回的 NO 将被 RCTLinkingManager 覆盖,YES 用于恢复处理程序。

如果您遇到这种情况,请尝试以下操作:

- (BOOL)application:(UIApplication *)application
        openURL:(NSURL *)url
        options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options 
   BOOL handledLink = [[RNFirebaseLinks instance] application:application openURL:url options:options];

  if (!handledLink) 
      handledLink = [RCTLinkingManager application:application openURL:url options:options];
  
  return handledLink;


- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
 restorationHandler:(void (^)(NSArray *))restorationHandler 
  
  BOOL handleRestore = [[RNFirebaseLinks instance] application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
  
  if (!handleRestore) 
    handleRestore = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
  
  return handleRestore;

我目前的设置和需要是react-navigation v3 和react-native-firebase v5

【讨论】:

我对你的restorationHandler 逻辑感到困惑。当然 handleRestore 只有在 handleRestorenull/false 时才应该重新分配? (这样RCTLinkingManager 就可以处理事情了。)目前只有在RNFirebaseLinks 返回YES/true 时才会重新分配它。 是的,这似乎是一个错字。应该是if (!handledRestore) ...【参考方案2】:

您可以在 restorationHandler 函数中包含类似以下代码的内容:

BOOL handled = [[RNFirebaseLinks instance] application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
if (!handled) 
    handled = [RCTLinkingManager application:application
                   continueUserActivity:userActivity
                           restorationHandler:restorationHandler];


return handled;

【讨论】:

【参考方案3】:

我的解决方案是:

- (BOOL)application:(UIApplication *)application
        openURL:(NSURL *)url
        options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options 
  if (url == nil) return false;
  BOOL handled = [[RNFirebaseLinks instance]
                  application:application
                  openURL:url
                  options:options
                  ] || [RCTLinkingManager
                        application:application
                        openURL:url
                        options:options
                        ];
  return handled;


- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
 restorationHandler:(void (^)(NSArray *))restorationHandler 
  BOOL handled = [[RNFirebaseLinks instance]
                   application:application
                   continueUserActivity:userActivity
                   restorationHandler:restorationHandler
                   ] || [RCTLinkingManager
                         application:application
                         continueUserActivity:userActivity
                         restorationHandler:restorationHandler
                         ];
   return handled;

react-native-firebase:5.5.6,react-navigation 3.X 不控制 url 为 nil 会导致应用启动时崩溃。

【讨论】:

以上是关于[RN][IOS]是不是可以将 React Native RCTLinking 与 RNFirebase 动态链接结合使用?的主要内容,如果未能解决你的问题,请参考以下文章

当React开发者初次走进React-Native的世界

TypeScript 和 React Native:RN 样式的类型定义是不是错误?

未找到 React/RCTDefines.h' 文件 (RN0.61)

[RN] React Native 封装选择弹出框(ios&android)

RN-iOS 原生向RN发送消息....

RN-iOS 原生向RN发送消息....