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);



0 0
原创粉丝点击