1. 新建Extension
点击菜单中的File->New->Target,然后选择Widget Extension,创建一个新的Target,填写Widget 名字为QGWidget
2. 申请APP ID和描述文件
登录开发者账号和keystore分别申请开发环境和发布环境的APP ID和描述文件,这里注意在申请APP ID时勾选APP Groups能力。
3. 在工程中配置APP ID和描述文件
因为历史原因,工程中的编译环境较多,而且没有采用自动管理,所以需要配置的地方比较多
- 分别配置Debug和Release的
Bundle Indentifier
和Provisioning Profile
,这里是在Build Settings
里修改的,如果环境不多,可以直接在Signing & Capabilities
里进行修改。
- 在主Target和Widget Target中添加App Groups能力,路径为
Signing & Capabilities
->Capability
,并填写相同的Group ID,这里如果没有登陆对应的开发者账号则Group ID为红色,但证书和描述文件正确即可正常使用。
- 添加.entitlements能力描述文件,并指定环境对应的entitlemens文件
注意这里不登陆开发者账号是没办法直接在
Signing & Capabilities
里进行修改的,这时候需要手动指定entitlements文件并在文件中添加环境对应的group ID。
- 修改构建脚本读取的plist
目前构建读取描述文件时使用的是工程中新建的plist文件,因此新增target后需要在plist中添加描述文件,至此工程配置已全部修改完毕。
)
5. 数据传递
在主App里写入数据到UserDefaults中,在widget中读取数据
代码语言:txt复制/// 在主App中写入数据到UserDefaults中
NSString *suiteName = [NSString stringWithFormat:@"group.%@", [[NSBundle mainBundle] bundleIdentifier]];
NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:suiteName];
[userDefaults setObject:data forKey:dataKey];
[userDefaults synchronize];
/// 通知Widget刷新数据
@available(iOS 14, *)
@objc func receiveNotice(_ notification: NSNotification) {
#if arch(arm64) || arch(i386) || arch(x86_64)
WidgetCenter.shared.reloadTimelines(ofKind: "QGFocusWidget")
#endif
}
/// widget中读取数据
self.userDefaults = [[NSUserDefaults alloc] initWithSuiteName:[[NSString stringWithFormat:@"group.%@", [[NSBundle mainBundle] bundleIdentifier]] stringByReplacingOccurrencesOfString:@".anchorrec" withString:@""]];
self.defaultPacketData = [self.userDefaults objectForKey:dataKey];;