iOS开发-widget基础
来源:互联网 发布:java学员信息管理系统 编辑:程序博客网 时间:2024/06/14 22:26
扩展如何运作、Extension和Containing App、host app之间的关系、Containing App与扩展共享数据、开启App Groups
Containing App 包含widget的app
host app 宿主app,对于today widget来说,host app就是todday
一、创建widget项目
Xcode默认创建MainInterface.storyboard来构建UI。
采用Xcode默认模板创建Widget时会自动把ViewController文件命名设置为“TodayViewController”.当然这个ViewController命名其实是可以修改的,唯一值得注意的修改该ViewController文件命名后还需要设置NSExtensionPrincipalClass的值与其保持一致即可.不然Widget编译时会报找不到对应入口.
如果想纯代码编写UI,可以删除storyboard文件采用纯代码方式来进行构建,删除完后之后注意需要找到Supporting Files下面的Info.plist中NSExtension字段做如下两个操作:
A:直接删除NSExtensionMainStoryboard字段
B:添加NSExtensionPrincipalClass字段 并设为TodayViewController
二、调整布局
Widget里面的视图默认居左居下都会有一定距离的间隔,可以采用如下方式取消间隔,使布局区域填充整个Widget
// 一般默认的View是从图标的右边开始的...如果你想变换,就要实现这个方法
- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets {
// 系统默认的布局是 UIEdgeInsetsMake(0.0,48, 39, 0);
NSLog(NSStringFromUIEdgeInsets(defaultMarginInsets));
returnUIEdgeInsetsZero;
}
三、唤醒程序
通过Widget中唤起主应用程序方式目前只支持url scheme方式来实现.同时也是Widget向主应用程序反馈数据和交互的渠道之一
NSString *urlStr = [NSStringstringWithFormat:@"widget://?type=%d",indexPath.row];
NSURL *url = [NSURLURLWithString:urlStr];
[self.extensionContextopenURL:url completionHandler:^(BOOL success) {
}];
四、widget生命周期
如果用户是第一次下拉查看Widget其实就是执行整个ViewController生命周期调用过程
系统为了保证Widget上数据是及时更新的,默认会截取上次显示成功Widget的快照.这个快照会一直保存到新的数据或UI被更新才回被替换,那这就会带来一个问题,当你拖拽通知中心(Notification Center)下拉过于频繁时,Debug跟踪代码执行路径你会发现整个Widget生命周期执行过程和第一次下拉执行的路径发生了变化.
第一次下拉执行路径是viewDidLoad->viewWillAppear,而如果下拉过于频繁你就会发现代码执行路径直接只会执行viewWillAppear方法,这个就是系统默认保存上次快照而导致的执行路径上变化.这对我们选择NSTimer更新时机以及后面会提到的Widget横竖屏处理都会有影响.
五、设置containingApp 和 widget的boundIdentifier
1、containingApp 和widget boundIdentifier对比
containingApp com.zgzd.widget
widget com.zgzd.widget.today
containingApp 的boundIdentifier比widget 多一个单词(应该是默认的命名规则)
六、开启appGroups
开发者账号内会创建具有appGroups功能的appID
如果想要将带有Extension的应用上传到App Store,你需要为extension单独的申请一个AppID(Bundle ID要对应XCode里面extension的Bundle ID,千万别直接复制,会漏掉后面无法复制到呈灰白的字段),同时配备相对应的distribution profile.
七、共享数据
存入
NSUserDefaults *shared = [[NSUserDefaultsalloc] initWithSuiteName:@"group.com.zgzd.widget"];
[shared setObject:[NSNumbernumberWithInt:indexPath.row]forKey:@"number"];
[shared synchronize];
取出
NSUserDefaults *shared = [[NSUserDefaultsalloc] initWithSuiteName:@"group.com.zgzd.widget"];
NSString *string=[NSStringstringWithFormat:@"%@",[sharedobjectForKey:@"key"]];
NSLog(@"插件获取共享数据==%@",string);
- iOS开发-widget基础
- iOS Widget开发
- iOS widget开发
- iOS Widget开发
- iOS Widget开发
- iOS开发之构建Widget
- iOS开发之构建Widget
- iOS开发之构建Widget
- iOS开发之widget实现
- ios 开发之widget实现
- iOS Widget && Today Extension 开发
- widget开发之helloworld(基础篇)
- ios 10 开发-widget实现
- iOS Today Extension开发(Widget)
- iOS -- Widget 开发之 Today Extension
- iOS 10 —— widget开发详解
- iOS之widget开发(Today Extension)
- iOS 开发之Widget的开发及使用(上)
- 类模板示例及类中成员函数的模板化
- OFBiz学习笔记(一)
- OpenVPN 的握手协议分析
- Android 手机屏幕px转dp和dp转px工具类
- 分页查询
- iOS开发-widget基础
- eclipse搭建Python, Ruby开发环境
- ZigZagConversion
- 关于new Handler().postDelayed()
- 修改 OpenVPN 实现加密算法的自动协商
- 第三章第41题
- java string类型转换boolean类型
- SharePoint 2013 开发——构建工作流开发环境
- OpenVPN 的握手协议分析