React Native/Expo升级Android SDK 30后No matching activity错误如何解决?
问题根因
no matching activity errors报错确实由Android 11(对应API 30)新增的包可见性限制导致:从SDK 30开始,Android系统对应用的包查询权限做了收紧,默认状态下应用无法检索到设备上安装的全部第三方应用。如果未声明对应查询权限,调用系统浏览器打开HTTP/HTTPS链接时,系统会返回无匹配Activity的错误。- 后续的
browser has already been launched报错属于Expo WebBrowser模块的状态异常问题:首次调用浏览器触发匹配失败后,模块内部的启动状态标记没有被正确重置,后续所有调用请求都会被判定为重复启动,直接抛出该错误。 - SDK 29及以下版本无包可见性限制,因此运行完全正常。
解决方案
场景1:Expo托管工作流(未执行eject)
在项目根目录的app.json或app.config.js中添加Android查询配置:
{ "expo": { "android": { "queries": { "intent": [ { "action": "android.intent.action.VIEW", "data": { "scheme": "https" } }, { "action": "android.intent.action.VIEW", "data": { "scheme": "http" } } ] } } } }
配置添加完成后重新构建应用包即可生效。
场景2:Expo裸工作流(已执行eject,存在原生Android项目)
修改原生项目路径下的android/app/src/main/AndroidManifest.xml文件,在Manifest根节点下添加
<queries> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="https" /> </intent> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="http" /> </intent> </queries>
如果应用需要拉起其他Scheme的链接,可在上述配置中追加对应Scheme的intent声明。
临时验证方案(不可用于上架)
仅用于本地快速验证问题时,可临时将android/build.gradle中的targetSdkVersion降回29,该方案不符合Google Play的上架要求,不可用于生产版本发布。
内容的提问来源于stack exchange,提问作者Steven Matthews
相关产品推荐
相关产品推荐

