在 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。这与 ios 的 LSApplicationQueriesSchemes
类似。
定位到 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区别