如何利用外部URL打开APP



  • 设置好schema,通过url能够打开app。现在的问题如下:
    如果app隐藏在后台:通过Linking.addEventListener('url', (e) => { this.handleOpenUrl(e); }); 能够用e.url拿到完整的外部URL。 如果app已经不在内存中存活的情况下,虽然依然能够通过外部URL来打开app,但是用Linking.addEventListener的方式就无法拿到外部URL进而拿到querystring进行处理。 当app不在内存中存活的时候,如何能够拿到URL并反映到rn的js中? 求帮助!



  • iOS有个launchOptions,你去研究下就知道了,直接会传到顶层View中,可以去了解一下。安卓同理



  • @atshitou 能详细说明一下吗?最好有个例子。谢谢!



    • (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

    外部打开URL信息在这个launchOptions里,并且通过这个传入JavaScript

    RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
    moduleName:@"Test"
    initialProperties:nil
    launchOptions:launchOptions];

    有些东西点到为止。都有人告诉你方向了,这点解决问题的能力都没有吗?



  • @atshitou
    谢谢指导。还是有不理解的地方。
    点击图标启动APP,launchOptions是空的。 如果通过urlscheme启动APP,launchOptions里才有url的信息。现在思路是这样:
    if(launchOptions) {
    NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
    }
    拿到url放到字典实例里,通过initialProperties传递给rn, 在rn层面通过this.props.KEY拿到。

    但是模拟器没法测试urlscheme的启动,我的猜测xcode运行时直接就启动了APP,相当于手动启动APP而不是通过urlscheme启动。我将启动的APP退出后台,再通过urlscheme启动APP,但是launchOptions还是空,这是为什么?



  • 问题已解决!
    android需要自己写原生类回调给rn。
    ios只要用到linkingmanager, 这个可以看官网的linking API目录就可以了解到。(http://facebook.github.io/react-native/docs/linking)



  • 进一步研究react native 的源码发现, 问题的解决很简单。就是利用Linking 这个API。rn已经对它进行了跨平台的整合。所以最后只需要用到一个方法,就是通过nativemodules来调用Linking.getInitialURL().then((url) => { this.handleOpenUrl(url); }); 就可以了。

    注意点:由于rn的render机制,如果app先打开并存活在后台,这时不会再执行willmount和didmount方法。所以,完善的办法是在didmount里对url进行监听。Linking.addEventListener('url', (e) => { this.handleOpenUrl(e.url); }); 结合上面的initialURL方法就完美的能够拿到外部URL的信息了。

    结帖了!!!!