从后台打开 React Native 深层链接应用程序

Posted

技术标签:

【中文标题】从后台打开 React Native 深层链接应用程序【英文标题】:React Native deep link app opening from background 【发布时间】:2018-02-09 19:47:26 【问题描述】:

我启用了深度链接,当应用程序打开时一切正常。当我使用 url moderatorapp://hello 从关闭状态打开应用程序时,它会记录正确的 url,但是当应用程序在从后台状态打开时深度链接时它不起作用。我的代码如下:

componentDidMount() 
    // Storage.clear();
    Storage.getItem('data_moderator')
        .then(_data => 
            if (_data && _data.tokens) 
                this.autoLogin(_data.tokens);
             else 
                Actions.loginForm();
            
        
    );

    Linking.getInitialURL()
        .then(url => 
            console.log('Initial Url then ', url);
            if (url) 
                console.log('Initial Url ', url);
            
        )
        .catch(error => console.log(error));

    Linking.addEventListener('url', this.handleOpenURL);

这显然是因为此时没有调用 componentDidMount 方法。

我尝试过的:

我试图将链接代码包装在一个事件中,该事件检测到应用程序进入活动状态并且它不起作用,它记录了与应用程序关闭时的初始尝试相同的 URL。当我尝试使用 url moderatorapp://goodbye 从后台状态深度链接到应用程序时,它会记录 moderatorapp://hello。所以它不知何故没有更新。

AppState.addEventListener('change', (state) => 
    if (state === 'active') 
        console.log('state active');
        Linking.getInitialURL()
            .then(url => 
                console.log('Initial Url then ', url);
                if (url) 
                    console.log('Initial Url ', url);
                
            )
            .catch(error => console.log(error));
    

    if(state === 'background')
        console.log('background');
    
);

我是 React Native 的新手,非常感谢任何帮助。

谢谢。

【问题讨论】:

【参考方案1】:

https://facebook.github.io/react-native/docs/linking.html 具体:

- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
   
return [RCTLinkingManager application:application openURL:url options:options];

Apple 更改了用于链接的 api,因此如果您的目标是 ios 9 或更高版本,则需要在 AppDelegate.m 文件中使用此代码。

【讨论】:

谢谢。我想我应该为了他人的利益回答这个问题。我在 React Native 文档中找到了相同的信息。 facebook.github.io/react-native/docs/linking.html#getinitialurl @Aaron 感谢您的帮助!你拯救了我的一天。 getInitialURL() 确实是需要使用的。 如果您使用 expo,请参阅 github.com/expo/expo/issues/2063【参考方案2】:

即使应用程序位于 background 中,深层链接也能按预期工作。请检查以下规格。

节点版本:v12.18.x 或更高 NPM 版本:v6.14.x 或更高版本 反应原生-cli:2.0.1 react-native : 0.63.x 或更大

请检查您是否在AppDelegate.m 中添加了以下行。

#import

必须在#ifdef FB_SONARKIT_ENABLED 行上方添加。在此行下方添加它会导致在存档发布时构建失败。

请检查您是否在负责深度链接的AppDelegate.m 中添加了以下代码。

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 选项:(NSDictionary *)选项 返回 [RCTLinkingManager 应用程序:应用程序 openURL:url 选项:选项];

它适用于应用程序冷启动,但如果您的应用程序位于background 中,它将不起作用。为此,您需要在AppDelegate.m中添加以下代码

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restoreHandler:(nonnull void (^)(NSArray *_Nullable))restorationHandler 返回 [RCTLinkingManager 应用程序:应用程序 继续用户活动:用户活动 恢复处理程序:恢复处理程序];

无论您的 AppState 是什么,这都应该有效:active **OR** background

这对我很有效!试试看。这绝对应该有效。

提前致谢!

【讨论】:

以上是关于从后台打开 React Native 深层链接应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 react-native 在 iOs 上处理同一个应用程序的多个环境的深层链接

如何在 React Native 中分享社交网络上的深层链接

xml 使用Linker的React Native深层链接的AndroidManifest.xml

使用 React Native 在 Firebase 中使用动态链接设置带有查询参数的动态深层链接

在 React Native 应用程序中使用 Branch.io 在 iOS 中延迟深度链接

从 React Native App 中的 WebView 打开动态链接