首页 > 代码库 > iOS8 NotificationCenter Extension 简介

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

 

今天,我们只聚焦于TodayExtensionNotification Center是在iOS5的时候推出的,在推出之时,开发者就在想是否可以进行定制,是否可以在上面添加一些应用相关的资讯,三年后,iOS8的推出终于完成了这个使命。

 

 

ExtensionApp不一样,他相当于一个轻量的App。在每个程序的安装包里面都可以带上多个Extension,每一个Extension是一个target

 

Extension的生命周期是比较短的,基本如下同所示:

 

 

 

 

 

对于一个NoficationCenter Extension而言,当用户拉下NoficationCenter的时候开始运行,当用户关闭NoficationCenter的时候会结束,所以必须保证每一个Extension必须是轻量而且快。所以在你完成你的更新操作之后,系统会使用上一次退出时的截图来做显示,这个逻辑和App是一样的。

 

ExtensionApp之间的通信只能通过OpenURLShared Resources的方式来通信,因为往往在运行Extension的时候App可能没有在运行,所以只能通过一共享资源池的文件进行交互,如下图:

 

 

 

二、一个简单的DEMO

 

 

下面我们来写一个简单的Extension:

第一步,我们来创建一个新的Target,然后选择Extension,再选择Today:

 

 

我们可以看到,基本上一个Extension就是一个ViewController,所以ViewController中的ViewWillAppear等的回调在这里也是生效的,完全可以当做一个ViewController来处理.

 

我们运行一下并且在NotificationCenter添加我们的Extension后可以看到,系统创建了Hello World的内容了:

 

 

如果你需要定制化你的ViewController的高度的话,可以使用AutoLayout或者调用ViewControllerpreferredContentSize来设置你需要的大小。

 

 

第二步,获取内容

 

仅仅是这样一个Extension并不能做些什么,所以我们需要一些必须的数据做展示,而数据的内容可以通过Extension自身去网络获取,也可以通过App来获取,这里说一下App获取怎么做。

 

首先,要通信的AppExtension必须在同一个App Group里面,在Xcode的项目配置里面的Capabilities里面找到App Group这一项,打开,并且通过开发账户登录来生成一个App Group,并且将AppExtension都加入这同一个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