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

问题描述 投票:0回答:6

最近将我们的构建目标切换到 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 reactjs react-native linker native
6个回答
65
投票

答案在于新的 Android 安全功能:Package Visibility。这与 iOS 的

LSApplicationQueriesSchemes
类似。

针对 Android 11 (SDK 30) 需要您更新

AndroidManifest.xml
并包含您正在查询的应用程序列表。例如。这是我用来在我自己的应用程序中检查 Google 地图导航的代码。它还包括 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>

对于符合特定条件的应用程序(例如防病毒应用程序、文件管理器或浏览器),您可以使用

QUERY_ALL_PACKAGES
权限来允许查询与早期 Android 版本类似的任何随机包:

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

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


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

请参阅
使用广泛的包(应用程序)可见性(QUERY_ALL_PACKAGES)权限


39
投票
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)

返回

true
对于
https://...
URL。
    


8
投票

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

谷歌说:

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

关于 Google Play 的
政策更新


2
投票
https://github.com/chirag04/react-native-mail/pull/175/files

)添加到您的清单文件中:

在根文件夹中创建一个名为“android-manifest.plugin.js”的新文件,其中包含下一个代码。
  1. const { withAndroidManifest } = require("@expo/config-plugins") module.exports = function androiManifestPlugin(config) { return withAndroidManifest(config, async config => { let androidManifest = config.modResults.manifest androidManifest["queries"].push({ "intent": [{ "action": [{ "$": { "android:name": "android.intent.action.SEND_MULTIPLE" } }], "data": [{ "$": { "android:mimeType": "*/*" } }] }] }); return config; }) }
将上面的插件添加到您的expo配置文件中
    app.json
  1. 
    
  2. { "expo": { ..., "plugins": [ "./android-manifest.plugin.js" ] } }
使用 
    eas build
  1. 重建,或者您可以使用经典 (
    expo build
    ),但请记住它很快就会被弃用
    
    
  2. 就是这样。您的 apk 应该具有正常的清单以及上面链接中提到的部分。您还可以使用此方法根据您的意愿设置清单。您还可以使用此工具验证您的清单是否已成功修改(
如何从APK文件查看AndroidManifest.xml?


0
投票

const { withAndroidManifest, createRunOncePlugin } = require('expo/config-plugins'); const queries = { intent: [ { action: { $: { 'android:name': 'android.intent.action.VIEW', }, }, category: { $: { 'android:name': 'android.intent.category.BROWSABLE', }, }, data: { $: { 'android:scheme': 'https', 'android:host': '*', }, }, }, ], }; /** * @param {import('@expo/config-plugins').ExportedConfig} config */ const withAndroidManifestService = (config) => { return withAndroidManifest(config, (config) => { config.modResults.manifest = { ...config.modResults.manifest, queries, }; return config; }); }; module.exports = createRunOncePlugin( withAndroidManifestService, 'withAndroidManifestService', '1.0.0' );



-3
投票

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

谢谢大家的支持。

© www.soinside.com 2019 - 2024. All rights reserved.