iOS开发之App Extension(应用扩充)之 — Today Extension

近来在做一个记事类的App,其中有一个想实现的效率就是期望可以在通报中央查看自己的有的记载内容。正好也是前面写了一篇有关利用扩大的介绍之后,一直再忙,一拖到现行可以久了。所以那两天把这个效能完成之后,就把这篇作品补上了。

因为自己要好对利用扩张一直也不是很熟识,只是有一个询问,在这一次完成这几个文告中心扩大之后,有诸多点自己认为对于学习应用扩展是很要紧的,所以为了将来在做其他扩充的时候可以有个查阅的资料,也终究自己的一个记下了吗。

对此扩张的一些介绍,我事先写过一篇文章,倘若对iOS中的App
Extension还不是很领会的能够先看一下汇聚常见扩张的介绍:
iOS开发之App Extension (应用扩展)-
入门介绍篇

这篇著作我紧要介绍几点,倘诺有只想精通某一个地点的,可以跳着看。

1. 什么样成立Today Extension
2. 怎么在扩展和宿主App之间共享数据
3. 什么在壮大和宿主App之间共享代码(framwork创立)
4. 什么样从扩展中开拓宿主App

末尾形成的是一个相当简单的记叙demo,效果图如下:

效果图.gif

1. 什么创设Today Extension

先是,我们先创建一个最中央的连串,项目开创完成未来,选中项目文件,选择xcode ->Editor ->Add Target,如下图,选中Today
Extension项,然后点击Next,命名(本文中为TodayWidget),在弹出框中挑选Activate,激活这些scheme。

创建Target.png

创建Target.png

激活之后,项目中就会多出一个TodayWidget的扩张,还有如下图左边的TodayWidget文件夹。

TodayWidget.png

文本夹中的MainInterface.storyboard和TodayViewController这一个类就是我们要在通告核心突显的界面的控制器。你可以点开storyborad看一下,里面已经有一个很小的界面,其中饱含了一个label,假设你挑选这一个viewcontroller,将它的万丈调高,然后将中间label的文字颜色调一下

运行Extension.png

如上图,选中TodayWidget为Target后从来运行,你就会见到上边的界面(假若起先没有出现那个界面,不是项目有题目,可以来回滑动切换来首页和这多少个页面,多试几遍,因为它需要刷新,真机上如果不显得,可能是因为扩充的Target中
iOS Deployment Target默认的都是最高,需要调到与真机一致或者更低)

模拟器直接运行extesnion.png

到此地,一个最简便易行的关照主题扩张已经做到了,是不是深感很简单,很酷炫。

2. 怎样在增加和宿主App之间共享数据

明天让我们来形成这些大概记事app最核心的效能,由于这个app非常简单,一个粗略的tableview映现数据,一个粗略的新增记事页面来添加一条记事,所以我就不详细写了,最后的意义如下。

简言之记事.gif

唯一要提出的一些是,因为那一个是概括记事,所以我也未曾用到CoreData,sqlite之类的数据库,而是径直行使的NSUserDefaults来存储,这么些也是自我背后要介绍的怎么共享数据。

记载效用完成将来,我们现在要做的就是什么在App中新增一条记事之后,在公告核心增添中可以查阅到这条记事,甚至当大家先后退出之后,可以在通报中央扩大中查看到我们如今的记载。

扩大与宿主App之间共享数据有二种艺术:
1.由此NSUserDefaults,这也是本文介绍的主意
2.透过一个恢弘与App都足以访问的共享容器,来存放文件,数据(Core Data, Sqlite等都得以存放在那多少个共享的器皿中)。

率先,我们需要创立一个app group,如下图,选中项目标Target ->
Capabilities -> App
Groups,打开,假诺你从前创立过group,会自行列出来。选用+号,填入group的称号(复制这一个称呼,因为前面要动用)

创建Group.png

group名称.png

创建完成之后,采取扩充的Target,打开,本次直接选拔我们刚刚所创办的group,如下图。

extension选择group.png

在group创设完成之后,项目中会多出多少个公文,如下图

创造group生成的文件.png

在我们新增一条数据之后,我们将这条数据保存到共享的NSUserDefaults中去

   if (_noteField.text.length > 0) {
    //先查找是否已存在数据 suiteName就是我们创建的group名称
    NSArray *myNote = [[[NSUserDefaults alloc] initWithSuiteName:@"group.todayextension.widget"] valueForKey:@"MyNote"];
    NSMutableArray *note = [NSMutableArray arrayWithArray:myNote];
    if (!note) {
        note = [NSMutableArray arrayWithCapacity:0];
    }
    [note insertObject:_noteField.text atIndex:0];
    //存入数据
    [[[NSUserDefaults alloc] initWithSuiteName:@"group.todayextension.widget"] setValue:note forKey:@"MyNote"];
    [self.navigationController popViewControllerAnimated:YES];
}

下一场在TodayViewController中,我们需要从这里面取数据

[_noteList removeAllObjects];
NSArray *myNote = [[[NSUserDefaults alloc] initWithSuiteName:@"group.todayextension.widget"] valueForKey:@"MyNote"];
if (myNote) {
    [_noteList addObjectsFromArray:myNote];
}

如此这般就曾经将数据存在一个可共享的位置,宿主App和扩充都是从一个地点取多少,现在大家在App中添加一条记事,然后就足以下拉开拓通告中央查看了

展现更多.png

倘诺需要仓储更多的数额,可以经过文件或者数据库(Core Data,
Sqlite等)。这多少个时候共享数据的办法就是要开创一个共享的公文夹

NSURL *groupURL = [[NSFileManager defaultManager]  containerURLForSecurityApplicationGroupIdentifier: @"group.todayextension.widget"];

透过下边的章程,扩充和App就都得以访问那一个共享的文件夹了,将数据库,文件等储存在这些文件夹中,也一如既往的直达多少共享的目的。

3. 怎么在扩大和宿主App之间共享代码(framwork创立)

在大家以此App中,记事列表的cell相对相比较简单,不过假设我们需要运用更扑朔迷离的cell,而相似在布告中央扩张中,我们的UI有很大部分是跟App相同的,可是我们的恢弘和App并不在一个Target当中,这也就表示着平等的代码,在增添和App中我们需要分开两份,这样明确是很不客观的一种模式。所以,很多时候,我们需要在扩展和App之间共享代码,也就是将持有公用的文书添加到一个framework中,这样大家尽管在扩张中引入这多少个framework,就足以采纳其中的代码了。

在这么些大概的记事App中,并从未异常复杂的自定义cell,为了诠释什么共享代码,我将App中列表的datasource和扩大中列表的datasource抽出来改成一个NoteListDelegate类,因为扩大和App都是一致份数据,所以自己一旦在这一个NoteListDelegate类中实现一遍tableview的datasource代理方法,然后生成一个framework,在App和扩大中引入就可以而且使用了。

先是,我们创造一个framwork,取名Table基特(Kit),如下图

创建framework.png

framework1.png

framework2.png

选中.h文件,左边Target Membership选中我们所创办的framwork,如下图

framework3.png

选中.m文件,左侧Target
Membership先裁撤TodayExtension的Target,然后选中我们所创制的framwork,如下图

framework4.png

只要你有不少公用的类想要生成framwork,依照上述的步子,将享有的文本Target都进入到所创立的framwork就行了。

完了上述手续之后,就可以在扩张和App中引入Table基特(Kit),使用其中的类了。

多说一句:
即使需要共享资源文件,比如图片什么的,可以像下面一样选中文件,在左边Target
Membership中勾选中Extension的Target,就足以了。

4. 怎样从扩展中打开宿主App

一般在扩大中,我们会直接与宿主App举行通信,比如本文中的记事App,我索要在壮大中直接能添加新的记载,或者点击扩展中的某条记事直接打开我们的App。
经过其余App打开我们协调的App,我们需要先安装URL
Types,如下图,添加一个新的URL Type,然后设置URL
Schemes,命名为todaywidget,通过那一个Schemes,就可以在其它App中调用下边方法:

 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"todaywidget://"]];

来开辟这些App了。

URL Types

不过很遗憾的是,扩张不是一个一体化的主次,所以它并没没有[UIApplication
sharedApplication] 这一个目的。
故而Apple给各样UIViewController加了一个extensionContext性能,在我们的宿主App中,这些特性是nil,而在壮大中,我们就可以经过下边的不二法门:

//打开首页
[self.extensionContext  openURL:[NSURL URLWithString:@"todaywidget://home" ]completionHandler:nil];
//打开添加新记事页面
[self.extensionContext openURL:[NSURL URLWithString:@"todaywidget://add"] completionHandler:nil];

来打开宿主App。

然后我们可以在AppDelegate的openURL代理方法中,通过URL前边的参数不同,来打开不同的页面,下边是直接打开
“添加新记事的页面”

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {

if ([url.absoluteString hasPrefix:@"todaywidget"]) {
    if ([url.absoluteString hasSuffix:@"add"]) {//判断是否是直接跳入到添加页面
        UIViewController *addVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"AddVC"];
        UINavigationController *rootNav = (UINavigationController*)self.window.rootViewController;
        [rootNav pushViewController:addVC animated:YES];
    }
}
return YES;

}

Demo代码下载

总结:

现今iOS中的增添越来越多,以后一定会接触越来越多的。通告中央的扩大绝对来说是相比简单的,所以这篇作品中我从来不介绍太多的规律,重点是在流程方面了。即便急需对规律了解的更多,可以去网上查一下资料。后边我应当还会补充更多品种的扩展介绍,不过目前相比忙,希望可以迅速吧。

网站地图xml地图