如何在Swift Package Manager(SPM)目标中设置APPLICATION_EXTENSION_API_ONLY?
让SPM模块实现
APPLICATION_EXTENSION_API_ONLY的等效行为 要实现和Xcode原生框架开启APPLICATION_EXTENSION_API_ONLY完全一致的效果,按以下步骤配置即可:
1. 配置SPM模块,强制检查扩展禁用API
在你的Package.swift中,给共享模块目标添加APPLICATION_EXTENSION_API_ONLY编译宏。这会让模块在编译时自动检测是否使用了App扩展不允许的API(比如UIApplication.shared),一旦违规直接触发编译错误,和原Xcode框架的行为完全对齐。
示例配置:
let package = Package( name: "YourPackage", products: [ .library(name: "SharedCore", targets: ["SharedCore"]), ], targets: [ .target( name: "SharedCore", dependencies: [], swiftSettings: [ .define("APPLICATION_EXTENSION_API_ONLY") ] ), // 测试目标可按需配置 ] )
2. 给每个App扩展目标添加链接器标志,消除引用警告
打开Xcode项目,找到每个App扩展的目标:
- 进入Build Settings → 搜索Other Linker Flags
- 添加
-application_extension标志
这个操作会告诉Xcode该扩展仅使用支持App扩展的模块,从而消除对SPM共享模块的“未标记为App扩展安全”警告。
3. 主App目标保持默认配置
主App的编译设置不需要做任何修改,这样既不会触发第三方框架的扩展兼容性警告,同时能正常使用SPM共享模块的全部功能。
效果验证
- 若SPM模块中使用了
UIApplication.shared等扩展禁用API,编译时会直接报错,和原Xcode框架开启APPLICATION_EXTENSION_API_ONLY的行为一致。 - 各App扩展引用该模块时,不会再出现批量警告。
- 主App引用模块时无额外警告,功能正常。
内容的提问来源于stack exchange,提问作者KPM
相关产品推荐
相关产品推荐

