📅  最后修改于: 2023-12-03 15:30:04.108000             🧑  作者: Mango
在 React Native 中,我们经常使用 Linking.openUrl
API 来打开一个链接或者跳转到其他 App。但是有些情况下 Linking.openUrl
会突然不能正常工作,这是因为我们缺少一些必要的设置或者权限。本文将介绍如何检查和解决这些问题。
Linking
在使用 Linking.openUrl
之前,我们应该首先确认 Linking
是否被正确定义。下面是一个例子:
import { Linking } from 'react-native';
Linking.openUrl('https://google.com');
如果你在调用 Linking.openUrl
时遇到了 'Linking is not defined'
错误,那么可以通过重新安装 react-native
包来解决:
$ npm install --save react-native
在 Android 中,需要注册 URL Scheme 才能打开其他应用程序。我们可以在 AndroidManifest.xml
中添加如下代码:
<intent-filter>
<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>
其中,myapp
是你的应用程序的 URL Scheme。在使用 Linking.openUrl
的时候,需要使用这个 URL Scheme。例如:
Linking.openUrl('myapp://example');
在 Android 中,如果我们需要打开一个与系统应用程序相关的 URL Scheme,我们必须在 AndroidManifest.xml
中添加对应的权限,例如:
<uses-permission android:name="android.permission.CALL_PHONE"/>
上面的权限可以让我们使用 Linking.openUrl('tel:xxx')
来拨打电话。如果你在使用 Linking.openUrl
时发现没有任何反应,那么可能是由于你没有添加对应的权限。你可以按照如下方式来判断这个问题:
Linking.canOpenURL('tel:xxx').then(supported => {
if (supported) {
Linking.openURL('tel:xxx');
} else {
console.log(`Can't handle url: tel:xxx');
}
});
如果你遇到问题,则需要通过修改 AndroidManifest.xml
文件来添加对应的权限。
在使用 Linking.openUrl
时,我们需要先判断对应的 App 是否存在:
Linking.canOpenURL(url).then(supported => {
if (supported) {
Linking.openURL(url);
} else {
console.log(`Can't handle url: ${url}`);
}
});
如果你在调用 Linking.openUrl
时没有先检查对应的 App 是否存在,那么可能会遇到 UnhandledPromiseRejectionWarning
或者其他类似错误。