iOS端Flutter用AppAvailability启动App提示‘App not found’求助
解决iOS上Flutter跨应用启动/检测失败的问题
看起来你遇到的是iOS平台特有的应用跳转限制问题,Android因为机制不同所以能正常工作,咱们来一步步解决:
核心原因
iOS 9及以后,苹果为了隐私安全,做了两个关键限制:
- 你的App(App2)要查询或启动其他App(App1),必须在Info.plist里声明要访问的App的URL Scheme,否则系统会直接返回"App not found"。
- 被启动的App(App1)必须配置自己的URL Scheme,否则其他App无法通过系统唤起它。
你能正常识别日历App,是因为系统默认允许访问系统应用的Scheme(比如日历的calshow://),而自定义Flutter App没有这个默认权限。
具体解决步骤
1. 给App1配置URL Scheme
打开App1的iOS项目(Runner.xcworkspace),通过Xcode操作更直观:
- 选中
RunnerTarget → 切换到Info标签页 → 找到URL Types区域 - 点击
+添加一个URL Type:- Identifier:填App1的Bundle ID,也就是你设置的
com.flutter.example - URL Schemes:填一个自定义的字符串(比如
flutterapp1,注意不要和其他App重复)
- Identifier:填App1的Bundle ID,也就是你设置的
- 保存后,App1就有了可被外部唤起的入口。
2. 在App2的Info.plist中添加查询白名单
同样打开App2的iOS项目:
- 找到
Info.plist,添加一个名为LSApplicationQueriesSchemes的数组类型键 - 在数组里添加刚才给App1设置的URL Scheme(比如
flutterapp1) - 这一步是告诉iOS:"App2有权查询这个Scheme对应的App是否存在"
3. 修改App2的代码逻辑
flutter_appavailability在iOS上的实现依赖URL Scheme而非Bundle ID,所以你之前用com.flutter.example去检测肯定会失败,需要改成Scheme:
// 检测App1是否安装 bool isInstalled = await AppAvailability.checkAvailability("flutterapp1://"); // 启动App1 try { await AppAvailability.launchApp("flutterapp1://"); } catch (e) { // 弹出启动失败提示 }
备选方案:改用更稳定的url_launcher包
flutter_appavailability的维护状态可能不如官方推荐的url_launcher,你也可以换用这个包:
- 在
pubspec.yaml引入url_launcher - 代码示例:
import 'package:url_launcher/url_launcher.dart'; // 检测是否能打开App1 final uri = Uri.parse("flutterapp1://"); if (await canLaunchUrl(uri)) { await launchUrl(uri); } else { // 提示App未安装 }
同样需要完成上面的Scheme配置和白名单添加步骤。
验证要点
- 确保App1和App2都安装在同一台iOS设备/模拟器上
- 检查App1的
CFBundleIdentifier确实是com.flutter.example - 确认App2的
LSApplicationQueriesSchemes数组里包含正确的Scheme
这样调整后,应该就能正常检测和启动App1了!
内容的提问来源于stack exchange,提问作者Laura Larez
相关产品推荐
相关产品推荐

