能否在苹果App Extension中使用Flutter实现Share Extension?
问题根因
你遇到的linking against a dylib which is not safe for use in application extensions警告属于预期报错,原因是默认编译的Flutter.framework未启用App Extension安全编译标记,且早期Flutter版本内部存在调用App Extension禁止的API的逻辑,直接使用无法通过苹果审核。
可过审的无hack实现方案
方案1:官方推荐的主App承接方案(最稳妥)
该方案不需要修改Flutter底层编译配置,100%符合苹果审核规则,是目前行业主流的实现方式:
- 给主App和Share Extension开启同一个App Group权限,作为跨进程数据共享的通道
- Share Extension仅保留最小原生逻辑:接收系统传入的共享内容(文本、图片、链接等),将数据存入App Group对应的共享存储区域,唤醒主App后直接结束Extension进程
- 主App被唤醒后从App Group读取共享数据,跳转对应Flutter页面完成后续处理逻辑即可
方案2:Extension内直接运行Flutter(适合强需求场景)
Flutter 3.10及以上版本已经支持编译Extension安全的二进制文件,通过修改工程配置即可实现无hack的合规接入:
- 在iOS工程的Podfile中添加如下编译配置,强制所有依赖以App Extension安全模式编译:
post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) target.build_configurations.each do |config| # 启用Extension安全API限制 config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'YES' config.build_settings['LD_NO_PIE'] = 'NO' end end end
- 为Share Extension单独初始化独立的FlutterEngine实例,不可复用主App的Engine(Extension与主App属于完全独立的进程)
- 确保你使用的所有Flutter插件都适配了App Extension规则,没有调用苹果禁止的Extension API,否则仍会被审核驳回
注意事项
- 苹果对App Extension的内存限制远低于主App(通常仅为30~50MB),如果选择在Extension内运行Flutter,必须严格控制页面内存占用,避免进程被系统强制杀掉
- 目前Flutter官方暂无针对App Extension的完整适配计划,方案2的适配逻辑需要开发者自行维护插件的兼容性
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

