iOS Extension(应用扩展)-----Widget开发(附Demo)

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
 

猜你喜欢

转载自blog.csdn.net/lixianyue1991/article/details/82776059