Ionic Cordova中AppAvailability插件始终返回false求助
我之前也踩过这个坑,结合iOS和Android的平台限制,以及插件的使用细节,给你几个排查和解决的方向:
一、iOS平台:必须声明URL Scheme白名单
从iOS 9开始,苹果限制了应用可查询的URL Scheme范围,必须在Info.plist中显式声明允许查询的Scheme,否则系统会直接拦截请求,导致检测结果始终为false。
你需要在项目的ios/App/Info.plist中添加以下配置:
<key>LSApplicationQueriesSchemes</key> <array> <string>fb</string> <string>twitter</string> </array>
这个配置会告诉iOS系统,你的应用需要查询这两个Scheme对应的第三方应用。
二、Android平台:处理包可见性限制
Android 11(API 30)及以上版本引入了包可见性机制,默认情况下应用无法检测到其他应用的存在,必须在AndroidManifest.xml中声明需要访问的目标应用包名。
在android/app/src/main/AndroidManifest.xml的<manifest>标签内添加:
<queries> <package android:name="com.twitter.android" /> <package android:name="com.facebook.katana" /> </queries>
如果你的应用需要兼容更低版本的Android,这个配置也不会有副作用,旧版本系统会自动忽略该标签。
三、修正代码中的Promise处理逻辑
你原来的代码里,错误回调的参数类型存在问题——AppAvailability插件的check方法失败时返回的是错误对象,而非布尔值false,这会导致变量无法被正确赋值。
可以改成用async/await让逻辑更清晰,同时正确捕获错误:
async checkInstalledApps() { let twitter = ''; let facebook = ''; if (this.plt.is('ios')) { twitter = 'twitter://'; facebook = 'fb://'; } else if (this.plt.is('android')) { twitter = 'com.twitter.android'; facebook = 'com.facebook.katana'; } // 检测Twitter try { await this.appAvailability.check(twitter); this.isTwitterAvailable = true; } catch (err) { this.isTwitterAvailable = false; } // 检测Facebook try { await this.appAvailability.check(facebook); this.isFacebookAvailable = true; } catch (err) { this.isFacebookAvailable = false; } }
记得要在平台就绪后调用这个方法,比如放在platform.ready().then(() => { this.checkInstalledApps(); })或者页面的ionViewDidEnter生命周期钩子中。
四、验证插件兼容性和安装状态
- 确保安装的是最新版本的
cordova-plugin-appavailability,可以重新安装一次:ionic cordova plugin remove cordova-plugin-appavailability ionic cordova plugin add cordova-plugin-appavailability - 检查Ionic版本和插件的兼容性,比如Ionic 6+需要对应支持的Cordova版本,避免版本不匹配导致的异常。
完成以上步骤后,重新编译打包应用,在真实设备上测试应该就能得到正确的检测结果了。
内容的提问来源于stack exchange,提问作者AleCat83

