extension是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制。
extension的出现,为用户提供了在其它应用中使用我们应用提供的服务的便捷方式,比如用户可以在Today Extension中查看应用展示的简略信息,而不用再进到我们的应用中,同样可以快捷操作app的功能,这将是一种全新的用户体验。
现在新建一个项目,命名为TodayWidth(tip:英文写错了本来是想创建TodayWidget /捂脸) 不过也不影响什么就是看着别扭点
在此基础上,想要使用Today Extension,我们需要创建一个新的target,File-->New-->Target-->Today Extention,如图
选中iOS->TodayExtension 点击Next 我们命名为TodayWidget 在弹出框中选择Activate,激活这个scheme 如图
激活之后,项目中就会多出一个TodayWidget的扩展如图 忽略部分等会 会讲解 因为项目是我刚才做完的
到这里一个简单的通知中心扩展已经完成了
但是如何在扩展和宿主App之间共享数据
因为这是个简单的测试App,所以我也没有用到CoreData,sqlite之类的数据库,而是直接使用的NSUserDefaults来存储,这个也是我后面要介绍的如何共享数据。
扩展与宿主App之间共享数据有两种方式:
1.通过NSUserDefaults,这也是我现在介绍的方式
2.通过一个扩展与App都可以访问的共享容器来存放文件,数据(CoreData,Sqlite等都可以存放在这个共享的容器中)
首先我们需要创建一个App Group,选中项目的Target ->Capabilities -> App Groups,打开,选择+号,填入group的名称(复制这个名称,因为后面要用到),因为我已经创建好了 所以我这边还是演示了下 如下图 Tips:Targets下的工程和Extension都需要创建App Group
然后项目中就会多出两个文件如图
我写的是首页展示保存的内容 如图吧 点击+好 进入简单界面 首页展示的就是输入框保存的内容
我们新增一条数据之后,我们将这条数据保存到共享的NSUserDefaults中去
- (void)saveClick{
_textF.text = [_textF.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
if (_textF.text.length){
NSArray *arr = [[[NSUserDefaults alloc] initWithSuiteName:@"group.com.msd.app"] valueForKey:@"TextF"];
NSMutableArray *widgetArray = [NSMutableArray array];
for (int i=0; i<arr.count; i++) {
[widgetArray addObject:arr[i]];
}
[widgetArray addObject:_textF.text];
// NSUserDefaults *def = [[NSUserDefaults alloc]initWithSuiteName:@"group.com.msd.app"];
// [def setValue:widgetArray forKey:@"TextF"];
// [def synchronize];
[[[NSUserDefaults alloc]initWithSuiteName:@"group.com.msd.app"]setValue:widgetArray forKey:@"TextF"];
[self.navigationController popViewControllerAnimated:YES];
}
}
- (void)saveClick{
_textF.text = [_textF.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
if (_textF.text.length){
NSArray *arr = [[[NSUserDefaults alloc] initWithSuiteName:@"group.com.msd.app"] valueForKey:@"TextF"];
NSMutableArray *widgetArray = [NSMutableArray array];
for (int i=0; i<arr.count; i++) {
[widgetArray addObject:arr[i]];
}
[widgetArray addObject:_textF.text];
// NSUserDefaults *def = [[NSUserDefaults alloc]initWithSuiteName:@"group.com.msd.app"];
// [def setValue:widgetArray forKey:@"TextF"];
// [def synchronize];
[[[NSUserDefaults alloc]initWithSuiteName:@"group.com.msd.app"]setValue:widgetArray forKey:@"TextF"];
[self.navigationController popViewControllerAnimated:YES];
}
}
这样就已经将数据存在一个可共享的地方,宿主App和扩展都是从一个地方取数据,现在我们在App中添加一条数据,然后就可以下拉打开通知中心查看了
如何在扩展和宿主App之间共享代码(framwork创建)
上面的一条blog已经介绍的很清楚 blog名为:iOS 封装生成.framework
创建的ShareTable.framework导入时Add to targets都选中
如果只选中1个的话,没选中的就用不了头文件 编译爆红 可以通过下面的方法解决 点击.framework库
widget基本上介绍完了
Demo地址:https://download.csdn.net/download/lixianyue1991/10679162
感谢水哥提供的参考:https://www.jianshu.com/p/34f605dd72e9?open_source=weibo_search