📜  como arreglar el error de Linking.openUrl no funciona react native - Javascript (1)

📅  最后修改于: 2023-12-03 15:30:04.108000             🧑  作者: Mango

如何解决 Linking.openUrl 在 React Native 中不起作用的问题

在 React Native 中,我们经常使用 Linking.openUrlAPI 来打开一个链接或者跳转到其他 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
问题二:未设置 URL Scheme

在 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 文件来添加对应的权限。

问题四:未检查 App 是否存在

在使用 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 或者其他类似错误。