iOS8 NotificationCenter Extension 简介
在最新的WWDC14上面,苹果发布了iOS8的一些新特性,而其中最让程序员兴奋的特性莫过于Extension,或者称之为Widget。
下面就来尝鲜试验一把。
一、Extension简介
首先,苹果只支持下面这种类型的Extension Point,也不支持第三方应用自己设置Extension Point 。
Extension point |
Example extension that helps users: |
Today (iOS and OS X) |
Get a quick update or perform a quick task in the Today view of Notification Center (A Today extension is called a widget) |
Share (iOS and OS X) |
Post to a sharing website or share content with others |
Action (iOS and OS X) |
Manipulate or view content within the context of another app |
Photo Editing (iOS) |
Edit a photo or video within the Photos app |
Finder (OS X) |
Use a remote file storage service in OS X |
Storage Provider (iOS) |
Choose a document from among the set of documents the current iOS app can access |
Custom keyboard (iOS) |
Replace the iOS system keyboard with a custom keyboard for use in all apps |
今天,我们只聚焦于Today的Extension。Notification Center是在iOS5的时候推出的,在推出之时,开发者就在想是否可以进行定制,是否可以在上面添加一些应用相关的资讯,三年后,iOS8的推出终于完成了这个使命。
Extension和App不一样,他相当于一个轻量的App。在每个程序的安装包里面都可以带上多个Extension,每一个Extension是一个target。
Extension的生命周期是比较短的,基本如下同所示:
对于一个NoficationCenter Extension而言,当用户拉下NoficationCenter的时候开始运行,当用户关闭NoficationCenter的时候会结束,所以必须保证每一个Extension必须是轻量而且快。所以在你完成你的更新操作之后,系统会使用上一次退出时的截图来做显示,这个逻辑和App是一样的。
而Extension和App之间的通信只能通过OpenURL和Shared Resources的方式来通信,因为往往在运行Extension的时候App可能没有在运行,所以只能通过一共享资源池的文件进行交互,如下图:
二、一个简单的DEMO
下面我们来写一个简单的Extension:
第一步,我们来创建一个新的Target,然后选择Extension,再选择Today:
我们可以看到,基本上一个Extension就是一个ViewController,所以ViewController中的ViewWillAppear等的回调在这里也是生效的,完全可以当做一个ViewController来处理.
我们运行一下并且在NotificationCenter添加我们的Extension后可以看到,系统创建了Hello World的内容了:
如果你需要定制化你的ViewController的高度的话,可以使用AutoLayout或者调用ViewController的preferredContentSize来设置你需要的大小。
第二步,获取内容
仅仅是这样一个Extension并不能做些什么,所以我们需要一些必须的数据做展示,而数据的内容可以通过Extension自身去网络获取,也可以通过App来获取,这里说一下App获取怎么做。
首先,要通信的App和Extension必须在同一个App Group里面,在Xcode的项目配置里面的Capabilities里面找到App Group这一项,打开,并且通过开发账户登录来生成一个App Group,并且将App和Extension都加入这同一个App Group。
然后,在本地创建一个纯文本,里面打上需要在Extension上面显示文字,然后在启动的时候加入下面的代码,其中的GroupIdentifier是创建的App Group的标识符。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
NSURL * fileURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.notificationcenter.extension.com" ] ;
NSURL * sourceURL = [NSURL fileURLWithPath: [[ NSBundle mainBundle ] pathForResource:@"helloextension" ofType:@"txt"] ] ;
NSURL * targetURL = [ NSURL URLWithString:[ [fileURL absoluteString] stringByAppendingString : @"helloextension.txt" ] ] ;
[[ NSFileManager defaultManager] moveItemAtURL:sourceURL toURL:targetURL error:nil ] ;
return YES;
}
然后在Extension里面加入以下代码:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
NSURL * fileURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.notificationcenter.extension.com" ] ;
NSURL * targetURL = [ NSURL URLWithString:[ NSString stringWithFormat:@"%@/helloextension.txt" , [fileURL absoluteString] ] ] ;
NSString* nsString = [ NSString stringWithContentsOfURL:targetURL encoding:NSUTF8StringEncoding error:nil] ;
_label.text = nsString ;
[_label sizeToFit ] ;
}
运行就得到如下效果:
三、总结
当然,这个DEMO只是简单地描述了怎么去完成一个Extension,在实际过程中需要面对如何复用Framework,如何处理多进程同时读写同一个文件,和一些安全认证的问题,这里只是简单地试验了一把。
【参考资料】
1.App Extension Programming Guide
iOS8 NotificationCenter Extension 简介的更多相关文章
- SSD Buffer Pool Extension
SSD Buffer Pool Extension 简介 SQL Server 2014中另一个非常好的功能是,可以将SSD虚拟成内存的一部分,来供SQL Server数据页缓冲区使用.通过使用SSD ...
- iOS 8 Share Extension Safari URL Example(在iOS中分享url的样例)
ios8 的Extension给我们提供了非常多奇妙的功能.以后分享内容再也不用进入app了,让我们的手机更安全,以下我们以在safari 浏览器中分享一个web url 来讲述Share Exten ...
- WWDC2014 IOS8 APP Extensions
本文转载至 http://blog.csdn.net/jinkaiouyang/article/details/35558623 感谢撰文作者的分享 WWDC14 最令人兴奋的除了新语言sw ...
- EAC3 spectral extension原理
1.Spectral extension简介 Spectral extension是通过低频的transform coefficients合成高频transform coefficients的过程. ...
- 【IOS 开发】Objective - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射
一. Objective-C 对象简单处理 1. 包装类 (1) 包装类简介 NSValue 和 NSNumber : -- 通用包装类 NSValue : NSValue 包装单个 short, i ...
- 十、无事勿扰,有事通知(1)——NSNotification
概述 很久很久以前,有一只菜鸟正在美滋滋的撸着他的嵌入式C代码.然而有一天,老板对菜鸟说:“别撸C了,从现在开始你就写swift开发ios了.”菜鸟一脸懵逼,但还是照做了. 又有一天,菜蛋谄媚的对菜鸟 ...
- [SQL Server 2014] SQL Server 2014新特性探秘
SQL Server 2014新特性探秘(1)-内存数据库 简介 SQL Server 2014提供了众多激动人心的新功能,但其中我想最让人期待的特性之一就要算内存数据库了.去年我再西雅图参加SQ ...
- Swift中Notification.Name这么难用怎么办
Swift中Notification.Name这么难用怎么办 以前的发送通知的参数就是一个简单的字符串: NSNotificationCenter.defaultCenter().post(" ...
- App Extension编程指南(iOS8/OS X v10.10)中文版
http://www.cocoachina.com/ios/20141023/10027.html 当iOS 8.0和OS X v10.10发布后,一个全新的概念出现在我们眼前,那就是应用扩展.顾名思 ...
随机推荐
- C++中求类的大小
今天刷题时看到一题,是求类的大小的,其中涉及了内存的一些知识,记录一下. 正确答案是12和9 首先是内存对齐原则,可以参考这篇博文:http://www.cppblog.com/snailcong/a ...
- beego学习笔记(4):开发文档阅读(5)
controller的逻辑: 我们看下面的代码,就知道怎么传值的: import ( "github.com/astaxie/beego" ) type MainControlle ...
- WMI技术介绍和应用——WMI概述
https://blog.csdn.net/breaksoftware/article/details/8424317
- 【LOJ】 #2009. 「SCOI2015」小凸玩密室
题解 神仙dp啊QAQ 我们发现我们需要枚举一个起点,遍历完它所有的儿子然后向上爬 设\(f[i][j]\)表示第i个点的子树全部处理完之后到达i深度为j的祖先的兄弟处 我们只需要对叶子节点和只有一个 ...
- ubuntu怎么连接centos远程桌面
1.系统软件设置CentOS端:查看是否安装了vnc软件# rpm -q vnc vnc-serverpackage vnc is not installedvnc-server-4.1.2-14.e ...
- 井字棋游戏升级版 - TopTicTacToe项目 简介
一.游戏简介 井字棋是一款世界闻名的游戏,不用我说,你一定知道它的游戏规则. 这款游戏简单易学,玩起来很有意思,不过已经证明出这款游戏如果两个玩家都足够聪明的话, 是很容易无法分出胜负的,即我们得到的 ...
- 用三个线程循环输出ABC
前两天看Java吧有人求助这个问题.想了想并不是很难.今天就顺手实现了一下. 我自己想到的有两种方法,一个是使用synchronized,一个是使用lock. 一.synchronized packa ...
- 深入理解javascript函数系列第一篇
前面的话 函数对任何一门语言来说都是核心的概念.通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行.在javascript里,函数即对象,程序可以随意操控它们.函数可以嵌套在其他函数中 ...
- 【BZOJ 4180】 4180: 字符串计数 (SAM+二分+矩阵乘法)
4180: 字符串计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 164 Solved: 75 Description SD有一名神犇叫做Oxe ...
- luogu 11月月赛 斐波那契数列
本来想作为水题刷,很快就想出了做法,结果细节实现太差改了好久... 根据题意你会发现其实就是求方程 ax+by=k解的个数. 此时 a=f[i],b=f[i+1],而(x,y)就是你要求的数对. 于是 ...