对于 iOS 来说,如果要在 App 启动后也监听传入的 App 链接,那么首先需要在项目中链接RCTLinking,
然后需要在AppDelegate.m
中增加以下代码
// iOS 9.x 或更高版本
#import <React/RCTLinkingManager.h>
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
return [RCTLinkingManager application:application openURL:url options:options];
}
// iOS 8.x 或更低版本
#import <React/RCTLinkingManager.h>
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [RCTLinkingManager application:application openURL:url
sourceApplication:sourceApplication annotation:annotation];
}
然后有app内部有两种方式获取传入的url
1.当app在后台或者前台模式的时候,也就是已经打开过app了,可以使用 Linking.addEventListener(url, callback)监听,获取到传入的url
2.当app在杀掉进程的模式下,也就是说app没有打开,可以使用Linking.getInitialURL(url)监听,获取到传入的url,但是在这种情况下我遇到了一个问题,就是获取到的url为null,我发现获取不到原因是因为在ios工程里面的Libraries下的RCTLinking.xcodeeproj/RCTLinkingManager.m文件林里的getInitialURL方法有问题,之前是这样的:
RCT_EXPORT_METHOD(getInitialURL:(RCTPromiseResolveBlock)resolve
reject:(__unused RCTPromiseRejectBlock)reject)
{
NSURL *initialURL = nil;
if (self.bridge.launchOptions[UIApplicationLaunchOptionsURLKey]) {
initialURL = self.bridge.launchOptions[UIApplicationLaunchOptionsURLKey];
}else {
NSDictionary *userActivityDictionary =
self.bridge.launchOptions[UIApplicationLaunchOptionsUserActivityDictionaryKey];
if ([userActivityDictionary[UIApplicationLaunchOptionsUserActivityTypeKey] isEqual:NSUserActivityTypeBrowsingWeb]) {
initialURL = ((NSUserActivity *)userActivityDictionary[@"UIApplicationLaunchOptionsUserActivityKey"]).webpageURL;
}
}
resolve(RCTNullIfNil(initialURL.absoluteString));
}
后来我改成了这样:
RCT_EXPORT_METHOD(getInitialURL:(RCTPromiseResolveBlock)resolve
reject:(__unused RCTPromiseRejectBlock)reject)
{
NSURL *initialURL = nil;
if (self.bridge.launchOptions[UIApplicationLaunchOptionsURLKey]) {
initialURL = self.bridge.launchOptions[UIApplicationLaunchOptionsURLKey];
}else if (self.bridge.launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]){
NSDictionary *dict = self.bridge.launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
NSString *string_url = [dict valueForKey:@"rpr_url"];
initialURL = [NSURL URLWithString:string_url];
} else {
NSDictionary *userActivityDictionary =
self.bridge.launchOptions[UIApplicationLaunchOptionsUserActivityDictionaryKey];
if ([userActivityDictionary[UIApplicationLaunchOptionsUserActivityTypeKey] isEqual:NSUserActivityTypeBrowsingWeb]) {
initialURL = ((NSUserActivity *)userActivityDictionary[@"UIApplicationLaunchOptionsUserActivityKey"]).webpageURL;
}
}
resolve(RCTNullIfNil(initialURL.absoluteString));
}
这样在杀掉进程的模式下就能获取到url了,注意,我这里写的是rpr_url,每个人的可能不一样,要根据自己的具体的key改