iOS Widget Extension开发拾遗

2022-12-01 11:10:02 浏览数 (1)

1. 新建Extension

点击菜单中的File->New->Target,然后选择Widget Extension,创建一个新的Target,填写Widget 名字为QGWidget

新建Extension新建Extension

2. 申请APP ID和描述文件

登录开发者账号和keystore分别申请开发环境和发布环境的APP ID和描述文件,这里注意在申请APP ID时勾选APP Groups能力。

勾选APP Groups勾选APP Groups
申请APP ID申请APP ID

3. 在工程中配置APP ID和描述文件

因为历史原因,工程中的编译环境较多,而且没有采用自动管理,所以需要配置的地方比较多

  • 分别配置Debug和Release的Bundle IndentifierProvisioning Profile,这里是在Build Settings里修改的,如果环境不多,可以直接在Signing & Capabilities里进行修改。
修改签名配置修改签名配置
  • 在主Target和Widget Target中添加App Groups能力,路径为Signing & Capabilities-> Capability,并填写相同的Group ID,这里如果没有登陆对应的开发者账号则Group ID为红色,但证书和描述文件正确即可正常使用。
添加App Groups能力添加App Groups能力
  • 添加.entitlements能力描述文件,并指定环境对应的entitlemens文件

注意这里不登陆开发者账号是没办法直接在Signing & Capabilities里进行修改的,这时候需要手动指定entitlements文件并在文件中添加环境对应的group ID。

添加.entitlements能力描述文件添加.entitlements能力描述文件
  • 修改构建脚本读取的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];;

0 人点赞