兼容iOS 10的纯Objective-C项目如何使用LiveActivity API?
在兼容iOS 10的纯Objective-C项目中用LiveActivity API的解决办法
先理清核心矛盾
LiveActivity要求最低iOS 16.1,但你的主项目要兼容iOS 10,主项目和LiveActivity扩展的部署目标不一致,直接跨目标引用代码肯定出问题,得绕开直接引用的方式。
解决Swift文件导入的版本报错问题
- 别在主项目的Swift文件里直接导入LiveActivity扩展的Swift类,主项目iOS 10的部署目标根本达不到LiveActivity的要求,报错是必然的。
- 正确做法是用App Group共享数据:
- 给主项目和LiveActivity扩展配置同一个App Group(Xcode里选目标→Signing & Capabilities→添加App Group)。
- 主项目里用
[[NSUserDefaults alloc] initWithSuiteName:@"你的AppGroupID"]更新共享数据,比如要展示的实时状态。 - LiveActivity扩展里的
ActivityAttributes类监听共享数据变化,自动更新LiveActivity的UI,所有LiveActivity相关的API调用都放在扩展里,别碰主项目代码。
解决Objective-C找不到Widget-Swift.h的问题
Widget-Swift.h是Widget扩展自己生成的桥接头文件,只属于扩展这个编译目标,主项目的OC文件本来就看不到它,别白费功夫导这个。- 要在主项目OC里和LiveActivity交互,就用间接方式:
- 触发LiveActivity的话,主项目里先做版本判断,再通过共用的Framework或者URL Scheme来调用:
if (@available(iOS 16.1, *)) { // 这里写触发LiveActivity的逻辑,比如调用Framework里封装好的方法 } - 如果有共用逻辑,把代码抽成一个独立的Framework,设置Framework的最低部署目标为iOS 10,里面对LiveActivity相关代码加
@available(iOS 16.1, *)标记,主项目和扩展都依赖这个Framework,这样主项目OC就能通过Framework的桥接头文件调用兼容的代码了。
- 触发LiveActivity的话,主项目里先做版本判断,再通过共用的Framework或者URL Scheme来调用:
必踩的坑要注意
- LiveActivity的所有API调用、UI渲染必须放在扩展目标里,主项目只负责传数据和触发,绝对不能在主项目里直接写LiveActivity的代码,不然iOS 10设备直接崩溃。
- 扩展的Info.plist一定要配置对:
NSExtension的NSExtensionPointIdentifier设为com.apple.widgetkit-extension,还要加WKSupportsLiveActivities并设为YES,否则LiveActivity跑不起来。
内容的提问来源于stack exchange,提问作者Mars
相关产品推荐
相关产品推荐

