我正在尝试在我的react原生Android应用程序中实现deeplinking。链接通过短信发送,当链接被点击时,它会打开应用程序,并基于URL,我正在使用android:launchMode="singleTop"
导航到一个perticular屏幕。我所面临的问题是当链接被点击时,打开了应用程序的一个新示例,我不想这样,所以我在AndroidManifest.xml
中将android:launchMode="singleTask"
更改为我的activity
,现在只有一个示例。但现在,当链接从短信被点击,它恢复现有的页面,我不能得到网址点击。
我实现了“AppState”来知道屏幕何时恢复,但它也没有给予我URL。
我希望能够实现的是
- 应用程序从一开始完全重新启动
Splash activity
,我知道我可以获得URL并根据URL从那里导航。(android:launchMode="singleTop"
不重新启动应用程序,但打开一个新示例) - 或者当用户单击URL链接时,即使它恢复现有屏幕,我也希望获得URL并导航到一个perticular屏幕。
舱单
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.abcdabcdapp">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<application
android:name=".MainApplication"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:allowBackup="false"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="singleTop"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
//This is what is required to open from the link
<intent-filter android:label="ABCD App">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="http"
android:host="abcd"
android:pathPrefix="/createpassword" />
</intent-filter>
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>
</manifest>
通过SMS发送的链接-http://abcd/createpassword
启动画面-初始画面。
componentDidMount() {
setTimeout(() => {
this.whereShoulINavigateTo();
}, 2500);
}
whereShoulINavigateTo = async () => {
if (Platform.OS === 'android') {
Linking.getInitialURL().then( async (url) => {
//this.navigate(url);
if(url === 'http://abcd/createpassword')
{
this.props.navigation.navigate('CreatePasswordScreen');
}else{
//do something
}
});
} else {
alert('ios url -' + url );
//Linking.addEventListener('url', this.handleOpenURL);
}
}
上面的设置可以很好地与android:launchMode="singleTop"
,但唯一的问题是我不想要一个新的应用程序示例。
因此我尝试了以下更改
舱单
android:launchMode="singleTask"
在这种情况下,只有一个示例,当URL被单击时,应用程序恢复。
因此,我添加了AppState到恢复的页面,并试图获得URL,但没有工作。
componentDidMount(){
//this.whereShoulINavigateTo();
AppState.addEventListener('change', this._handleAppStateChange);
}
componentWillUnmount() {
AppState.removeEventListener('change', this._handleAppStateChange);
}
_handleAppStateChange = (nextAppState) => {
if (this.state.appState.match(/inactive|background/) && nextAppState === 'active') {
console.log('App has come to the foreground!')
this.whereShoulINavigateTo();
}
this.setState({appState: nextAppState});
}
whereShoulINavigateTo = async () => {
if (Platform.OS === 'android') {
Linking.getInitialURL().then( async (url) => {
alert('url - ' + url)
if(url === 'http://abcd/createpassword')
{
this.props.navigation.navigate('CreatePasswordScreen');
}
});
} else {
alert('ios url -' + url );
//Linking.addEventListener('url', this.handleOpenURL);
}
}
请建议。
谢谢
2条答案
按热度按时间jljoyd4f1#
下面是对我有效的解决方案。
启动模式我已将其设置为
singleTask
Manifest.xml在我的应用程序中打开的初始屏幕是闪屏。假设你收到了短信,你的应用程序关闭了,我们将重新打开应用程序,所以它将始终打开初始屏幕在我的情况下闪屏。
这是我的启动画面代码。
在其他屏幕上,当应用程序打开并收到消息时,你点击链接,它会打开同一个屏幕。因此,在该屏幕上需要遵循以下逻辑。
希望有帮助。
如果你需要更多的信息请告诉我
谢谢
omqzjyyz2#
删除/android文件夹和expo
运行“expo prebuild”命令并构建它。