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

时间: 2024-08-02 09:35:39

iOS8 NotificationCenter Extension 简介的相关文章

iOS8扩展插件简介

一.iOS8扩展插件概述 WWDC14除了发布了OS X v10.10和switf外,iOS8.0也开始变得更加开放了.说到开放,当然要数应用扩展(App Extension)了.顾名思义,应用扩展允许开发者扩展应用的自定义功能和内容,能够让用户在使用其他应用程序时使用该项功能,从而实现各个应用程序间的功能和资源共享.可以将扩展理解为一个轻量级(nimble and lightweight)的分身. 以下为常见的三类插件: Target Type Extension point identifi

iOS 8 Share Extension Safari URL Example(在iOS中分享url的例子)

ios8 的Extension给我们提供了很多神奇的功能,以后分享内容再也不用进入app了,让我们的手机更安全,下面我们以在safari 浏览器中分享一个web url 来讲述Share Extension的工作原理 1 新建一个Share Extension target 参考http://blog.csdn.net/wjsxiaoweige/article/details/39524291phone Extension的建立 2  配置info.plist  在NSExtensionActi

WWDC2014 IOS8 APP Extensions

本文转载至 http://blog.csdn.net/jinkaiouyang/article/details/35558623  感谢撰文作者的分享 WWDC14 最令人兴奋的除了新语言switf外,无疑就是整个APPLE平台的开放了.说到开放,当然就是属于Extension了.Extension实现了各个应用程序间功能和资源的共享. 下面我们来看看Extension具体有哪些 Today -- 在 iOS 系统的“通知中心”里,支持第三方应用集成的“小工具.小部件”,比如 eBay 提供的价

【IOS 开发】Object - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射

一. Object-C 对象简单处理 1. 包装类 (1) 包装类简介 NSValue 和 NSNumber : -- 通用包装类 NSValue : NSValue 包装单个 short, int, long, float, char, id, 指针 等数据; -- NSNumber 包装类 : 用于包装 C 语言数据类型; NSNumber 方法 : -- "+ numberWithXxx :" : 将特定类型的值包装成 NSNumber; -- "- initWithX

The Best Tools for Developers, 2014

http://theneodesign.com/the-best-tools-for-developers-2014/ Tools, apps, software are the resources that claim to help people complete their assigned tasks without any hassle, in comparatively much lesser time and provide the ease of workflow. We at

iOS8新特性扩展(Extension)应用之一——Today扩展

iOS8新特性扩展(Extension)应用之一--Today扩展 一.理解扩展 1.简介 基于iOS系统的安全性考虑,其应用的数据存储是通过沙盒模式进行的,要实现应用之间的数据共享十分困难,功能共享就更加棘手.在iOS8系统中,apple为我们提供了一个革命性的功能:扩展.我们可以通过扩展来使app间数据甚至功能进行共享. 2.几种扩展模式 (1)今日视图扩展:today 这个扩展也被叫做 widget.该扩展可以将今日发生的简短消息放到消息中心的「今日」视图里.这个功能类似于安卓系统中的小控

iOS8新特性扩展(Extension)应用之三——照片编辑插件

iOS8新特性扩展(Extension)应用之三--照片编辑插件 通过前几篇博客的介绍,我们了解到扩展给app提供的更加强大的交互能力,这种强大的交互能力另一方面体现在照片编辑插件的应用. 和通常一样,我们先创建一个工程,然后新建一个Target,选择photo editing: 从模板中,我们可以看到系统为我们创建了一个controller,这个controller就是用于处理照片的controller,其中方法如下: - (BOOL)canHandleAdjustmentData:(PHAd

App Extension编程指南(iOS8/OS X v10.10):常见问题的处理方案

本节由CocoaChina翻译组成员DevTalking (博客)翻译自苹果官方文档App Extension Programming Guide--Handling Common Scenarios一节,敬请勘误.欢迎加入我们的翻译小组,详情请参看:CocoaChina编辑和译者招募! 当编写自定义代码以执行app扩展任务时,你可能需要处理一些其他多种类型扩展也会出现的情况.在这一章节中,我们将帮助你如何应对和处理这些常见的问题. 使用内嵌框架共享代码 你可以创建一个内嵌框架,用于在应用扩展和

iOS8新特性扩展(Extension)应用之二——分享插件

iOS8新特性扩展(Extension)应用之二--分享插件 在上一篇博客中,介绍了iOS8新特性扩展功能之一的Today功能:http://my.oschina.net/u/2340880/blog/485533,这里我们再介绍一下分享的扩展功能. 在iOS8之前,除了一些主流的社交平台,例如苹果支持内容分享外,其他开发者的应用若要加入分享的功能,将会十分的复杂.在iOS8的新特性中,apple为我们准备了这样的扩展功能. 首先创建工程,在我们的工程中新建一个Target: 之后,模板中会为我