You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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操作更直观:

  • 选中Runner Target → 切换到Info标签页 → 找到URL Types区域
  • 点击+添加一个URL Type:
    • Identifier:填App1的Bundle ID,也就是你设置的com.flutter.example
    • URL Schemes:填一个自定义的字符串(比如flutterapp1,注意不要和其他App重复)
  • 保存后,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,你也可以换用这个包:

  1. 在pubspec.yaml引入url_launcher
  2. 代码示例:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:28:53