在Android上调用本机Linking.getInitialUrl总是调用

时间:2018-09-06 15:50:29

标签: android react-native react-native-android deep-linking react-native-navigation

我有一个带有以下代码的React-Native应用程序(这里是App.js,应用程序入口点),用于管理Android上的深层链接。

Linking.getInitialURL().then((deepLinkUrl) => {
  if (deepLinkUrl) {
    manageDeepLink(deepLinkUrl);
  } else {
    Navigation.startSingleScreenApp('rootScreen');
  }
});

这里的问题是,每次我从深度链接或正常启动我的应用程序时,都会调用getInitialURL,并且每次它包含 deepLinkUrl 参数为空时都会调用它。 我已经在AndroidManifest中注册了我的意图,如下所示:

<application
    android:name=".MainApplication"
    android:allowBackup="true"
    android:launchMode="singleTask"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:windowSoftInputMode="adjustResize">
        <!-- deeplink -->
        <intent-filter android:label="@string/app_name">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="myapp" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

更新 如果这可能有用,我正在使用本机导航来注册屏幕。

2 个答案:

答案 0 :(得分:0)

如果您在应用程序生命周期中过早注册侦听器(例如直接在某些.js文件中,因此在加载应用程序时执行)似乎无法正常工作。

如果将其移至根组件上的componentDidMount(),一切正常。

    componentDidMount() {
        Linking.addEventListener('url', event => {
            console.warn('URL', event.url)
        })

        Linking.getInitialURL().then(url => {
            console.warn('INITIAL', url)
        })
    }

答案 1 :(得分:0)

因为您将 fscanf 添加到 AndroidManifest.xml。请将其修改为android:launchMode="singleTask",这样您的问题就迎刃而解了。