[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
只有在 handleRestore
是 null
/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 动态链接结合使用?的主要内容,如果未能解决你的问题,请参考以下文章
TypeScript 和 React Native:RN 样式的类型定义是不是错误?
未找到 React/RCTDefines.h' 文件 (RN0.61)