iOS之Widget开发总结

上月底,给crm项目加了个widget,在Today这里展示。

首先打开project,创建target,选择Today Extension,选择关联的project和target。扩展只能依托一个某个target才能存在。

创建好这一切后,我是比较偷懒,直接将需要的代码关联这个target,并没有使用framework去弄。

关联完毕后,有些地方代码需要做target判断,注意一点UIApplication无法在这里面使用需要用self.extensionContext。他只有上下文,比如通过extension打开主应用.

[self.extensionContext openURL:[NSURL URLWithString:@"iOSWidgetApp://123"] completionHandler:^(BOOL success) {
    NSLog(@"open url result:%d",success);
}];

extension是在你手指下拉出这个面板才回刷新数据

- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler {
    completionHandler(NCUpdateResultNewData);
    [self loadData];
    }

还有一个问题就是共享数据,选择主target,标签Capabilities,找到App Groups,打开开关,添加一个group,举例叫group.icrm,保存。
在extension的这个位置打开开关,勾选group.icrm
配置完成后再程序中使用路径的位置,对于crm项目是db索索在位的初始化修改一下:

     NSURL *storeURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.icrm"];
storeURL = [storeURL URLByAppendingPathComponent:@"icrm.db"];

这样在exension中也能访问到db。因为Today Extension是继承自UIViewController,UIKit的用法都差不多。

几个配置地方,我习惯代码开发,所以需要修改info.plist

<dict>
	<key>NSExtensionPointIdentifier</key>
	<string>com.apple.widget-extension</string>
	<key>NSExtensionPrincipalClass</key>
	<string>TodayViewController</string>
</dict>

target general的Main interface也置为空。

UITableView的size问题,因为todo都是列表,动态高度使用下方这种方式,在loadData时设置widget在面板上的size大小。

    self.preferredContentSize = CGSizeMake(self.view.bounds.size.width, _dataArray.count * 50.0f);

URLScheme,在主target中设置好了才能在extension中使用openURL打开主App。

<key>CFBundleURLTypes</key>
<array>
	<dict>
		<key>CFBundleTypeRole</key>
		<string>Todo</string>
		<key>CFBundleURLName</key>
		<string>com.highwe.icrm</string>
		<key>CFBundleURLSchemes</key>
		<array>
			<string>iOSWidgetApp</string>
		</array>
	</dict>
</array>

发表评论

电子邮件地址不会被公开。 必填项已用*标注