Swift Package Manager标记库为App扩展不安全,如何排查原因?
排查SPM库不适用于App扩展的问题步骤
检查代码中是否直接/间接调用App Extension禁用API
即便依赖的都是安全框架,代码里仍可能调用了Extension不允许的API(比如UIApplication.shared、openURL、beginBackgroundTask这类方法,或是某些私有API)。可以通过以下方式排查:- 选中SPM库的目标,执行
Product > Analyze,在分析结果里筛选App Extension API Usage相关警告,Xcode会直接标出违规API - 手动搜索代码中的敏感API关键词,定位可能的违规调用
- 选中SPM库的目标,执行
验证SPM目标的编译配置
确认Package.swift里主库目标的编译规则是否符合Extension要求:- 为目标添加
-fapplication-extension编译标志,确保编译时按Extension规则检查API:targets: [ .target( name: "YourMainLibrary", swiftSettings: [ .unsafeFlags(["-fapplication-extension"]) ] ) ] - 检查是否存在冲突的编译标志,比如误设置了
-no_application_extension
- 为目标添加
检查编译后的符号与权限
进一步验证库的编译产物是否存在违规内容:- 用
nm -U <你的库路径>列出所有导出符号,搜索是否包含Extension禁用的API符号(比如_OBJC_CLASS_$_UIApplication) - 用
codesign -d --entitlements - <你的库路径>检查库的权限配置,确认是否包含Extension不允许的权限(一般SPM库不会带额外权限,但可排查)
- 用
检查项目对SPM库的引用配置
确认项目中库的引用逻辑是否正确:- 打开项目
Package Dependencies,选中你的库,查看本地缓存的库文件是否正常 - 检查Extension目标的
Build Phases > Link Binary With Libraries中,库的引用状态是否正常,没有标记错误 - 确认Extension目标的
Build Settings里,Require Only App-Extension-Safe API确实为YES,且未针对该库单独设置例外
- 打开项目
清理缓存并重新编译
Xcode缓存可能残留旧配置,导致问题:- 删除
DerivedData文件夹(路径:Xcode > Settings > Locations > Derived Data) - 删除SPM本地缓存(路径:
~/Library/Caches/org.swift.swiftpm) - 执行
Shift+Cmd+K清理构建文件夹,之后重新更新SPM依赖并编译
- 删除
测试最小化案例
创建空白iOS项目+空白App Extension(比如今日小组件),开启Require Only App-Extension-Safe API = YES后仅添加你的SPM主库,观察是否仍报错。若报错,逐步移除库中的代码模块,直到定位到触发问题的代码部分。
内容的提问来源于stack exchange,提问作者Darren
相关产品推荐
相关产品推荐

