在 React Native 上定位 android 30 sdk 时,Linking.canOpenURL 返回 false

Posted

技术标签:

【中文标题】在 React Native 上定位 android 30 sdk 时,Linking.canOpenURL 返回 false【英文标题】:Linking.canOpenURL returning false when targeting android 30 sdk on React Native 【发布时间】:2021-02-18 07:29:53 【问题描述】:

最近将我们的构建目标切换到 android 30 以添加对 Android 11 的支持,现在方向和电话呼叫不起作用。

文档中提到了本机深度链接和/或使用 npm 包。 这会在本地完成吗?还是包是一个选项?

https://reactnative.dev/docs/linking

在运行 android 30 时检查是否支持 Linking.canOpenURL 现在返回 false。

Linking.canOpenURL(url)
.then((supported: boolean) => (supported ? Linking.openURL(url) : Alert.alert("Error", "There was an error attempting to opening the location.")))
.catch(() => Alert.alert("Error", "There was an error attempting to opening the location."));

【问题讨论】:

你能给我们你要打开的网址吗? 这解决了吗?我什至无法在 android 11 上打开 https://www.google.com 电话联系方式如下:***.com/a/68659891/8750763邮箱联系方式:***.com/questions/66588577/… 【参考方案1】:

答案在于一项新的 Android 安全功能:Package Visibility。这与 iosLSApplicationQueriesSchemes 类似。

定位到 Android 11 (SDK 30) 要求您更新您的 AndroidManifest.xml 并包含您要查询的应用程序列表。例如。这是我用来在我自己的应用程序中检查谷歌地图导航的代码。它还包括 HTTP 和 HTTPS 的权限:

<manifest package="com.example.game">
  <queries>
    <intent>
      <action android:name="android.intent.action.VIEW" />
      <data android:scheme="http"/>
    </intent>
    <intent>
      <action android:name="android.intent.action.VIEW" />
      <data android:scheme="https"/>
    </intent>
    <intent>
      <action android:name="android.intent.action.VIEW" />
      <data android:scheme="geo" />
    </intent>
    <intent>
      <action android:name="android.intent.action.VIEW" />
      <data android:scheme="google.navigation" />
    </intent>
  </queries>
  ...
</manifest>

对于applications matching certain criterias(例如防病毒应用程序、文件管理器或浏览器),您可以使用QUERY_ALL_PACKAGES permission 允许查询任何类似于早期Android 版本的随机包:

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />

但是,请注意,如果您不符合下列任何应用类型的条件或以未经授权的方式使用 QUERY_ALL_PACKAGES,您的应用将被 Google Play 拒绝: p>

许可使用涉及必须发现设备上所有已安装应用的应用,出于认知或互操作性目的,这些应用可能有资格获得许可。允许的使用包括设备搜索、防病毒应用程序、文件管理器和浏览器。被授予访问此权限的应用程序必须遵守用户数据政策,包括显着披露和同意要求,并且不得将其使用扩展到未披露或无效的目的。

见Use of the broad package (App) visibility (QUERY_ALL_PACKAGES) permission

【讨论】:

电话应用和电子邮件怎么样? @AnkitJayaprakash 您需要找出您正在寻找的应用程序的 URL 方案并将它们添加到意图列表中。应该为您正在寻找的特定应用程序记录它们。有关共同意图,请查看developer.android.com/guide/components/intents-common。例如,电话拨号器使用 android:name="android.intent.action.DIAL" 和 android:scheme="tel"。 有人知道如何为非裸(博览会)工作流程执行此操作吗? 裸应用程序设计为不使用配置文件,它可以在纯 javascript 基础上运行。所以我认为世博会是不可能的。可能他们很快就会发布与 android 11 相关的版本,然后您可以将您的 expo SDK 升级到最新版本。【参考方案2】:

如果您决定使用,请小心

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />

谷歌说:

许可使用涉及必须发现设备上所有已安装应用的应用,出于认知或互操作性目的,这些应用可能有资格获得许可。允许的使用包括设备搜索、防病毒应用程序、文件管理器和浏览器。 被授予访问此权限的应用程序必须遵守用户数据政策,包括显着披露和同意要求,并且不得将其使用扩展到未披露或无效的目的。

在policy update from Google Play

【讨论】:

我相信这个更好地表述为对最佳答案的编辑。【参考方案3】:

就我而言,我需要像这样将android:host="*" 添加到data 标记中:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          package="com.acme">
...
    <queries>
        <intent>
            <action android:name="android.intent.action.VIEW" />
            <data android:scheme="https" android:host="*" />
        </intent>
    </queries>
</manifest>

对于Linking.canOpenURL(url),为https://... URL 返回true

【讨论】:

这为我解决了!谢谢!【参考方案4】:

通过在清单中添加此问题解决了问题

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />

感谢大家的支持。

【讨论】:

注意:这仅适用于某些类型的应用程序(防病毒、浏览器、文件管理器等)

以上是关于在 React Native 上定位 android 30 sdk 时,Linking.canOpenURL 返回 false的主要内容,如果未能解决你的问题,请参考以下文章

在 React Native 上定位 android 30 sdk 时,Linking.canOpenURL 返回 false

React Native:如何检查是不是已授予地理定位权限

react native项目目录结构的react native区别

使用 React Native 的 Android 上的 GPS 定位精度差/差

React-native 地理定位

我无法在带有 redux 的 react-native 中使用地理定位