OS X v10.10 已os x的启动安装u盘在这台电脑上。

常见问题的处理方案 -- iOS8/OS X v10.10应用扩展编程指南 – 程序员说
欢迎关注Dev Talking微信订阅号
当你在开发一个应用扩展,让其执行某个任务时,你可能会遇到一些常见的,或者说在多种扩展中都会出现的通用的问题,并且必须要处理这些问题。在这一章节中,我们将帮助你如何应对和处理这些常见的问题。
使用内嵌框架共享代码
你可以创建一个内嵌框架,用于在应用扩展和它的载体应用之间共享代码。比如,你开发了一个图片滤镜的照片编辑扩展,同时该扩展的载体应用也有这个功能,那么你就可以将实现该功能的代码封装成一个框架,让扩展target和载体应用target都使用这个框架。
你要确保你创建的内嵌框架不包含应用扩展不能使用的API。这类API一般使用unavailability宏来标记,比如像NS_EXTENSION_UNAVAILABLE。
如果你创建的内嵌框架中包含应用扩展不能使用的API,那么你将其Link到载体应用没关系,载体应用可以正常使用框架中的API,但是不能与应用扩展共享代码,也就是应用扩展不能使用该框架提供的所有API,继而无法做到代码共享。如果你上传App Store的应用扩展中有这种框架,或者应用扩展中使用了不允许使用的API,那么审核时会被拒绝。
如果我们要想应用扩展使用内嵌框架,那么首先要配置一下。将target的Require Only App-Extension-Safe API选项设置为Yes。如果你不这样设置,那么Xcode会向你提示警告:linking against dylib not safe for use in application extensions。
重要提示:如果载体应用要使用内嵌框架,那么必须要支持arm64架构,否则在上传App Store时会被拒绝。(如“创建应用扩展”章节中介绍的,所有应用扩展都要支持arm64架构。)
在配置你的Xcode项目时,在Build Phases选项卡的Copy Files项中一定要将Destination设置为Frameworks。
重要提示:我们要始终将Destination设置为Frameworks,如果你将其设置为SharedFramework,那么上传App Store时会被拒绝的。
你可以让载体应用支持iOS7或更早的版本,但当在iOS8或更新的版本中运行时,要特别注意内嵌框架的安全性。详细内容可以参阅。
有关创建和使用内嵌框架的更多内容,请观看“Building Modern Frameworks”。
与载体应用共享数据
虽然应用扩展的包内嵌在载体应用中,但是应用扩展和载体应用的安全域还是不一样的。默认情况下,应用扩展和载体应用是不能直接访问对方内容的。
不过你可以通过数据共享来实现这个愿望。比如,你希望应用扩展和它的载体应用共享一个单一的大数据集。比如prerendered assets。
要实现数据共享,我们要使用Xcode或者开发者门户网站允许应用扩展和它的载体应用成为一个应用组,然后在开发者门户网站中注册应用组,并指明在载体应用中使用该应用组。关于应用组的知识请查阅文档的章节。
当你设置好应用组后,应用扩展和它的载体应用就可以通过API共享访问用户的信息。我们可以使用方法实例化一个NSUserDefaults对象,然后传入共享组的标示符。比如一个共享扩展,它或许会更新用户最近经常使用的共享账号,那么我们可以这样来写:
// Create and share access to an NSUserDefaults object.
NSUserDefaults *mySharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@&com.example.domain.MyShareExtension&];
// Use the shared user defaults object to update the user's account.
[mySharedDefaults setObject:theAccountName forKey:@&lastAccountName&];
下图向我们展示了应用扩展和它的载体应用是如何通过共享容器实现数据共享的:
重要提示:如果你的应用扩展使用类执行后台的上传下载任务时,你必须要设置一个共享容器。这样扩展和载体应用就可以访问到转换传输的数据。后台上传下载的更多知识请参阅。
如果你设置了共享容器,那么载体应用和它包含的扩展就可以对共享容器里的内容进行读写操作了。同时你还必须要对数据的操作进行同步,以避免数据损坏或出错。使用类、Core Data或者SQLite可以帮助定位、协调操作共享容器中的内容。
在分享扩展(iOS与OS X平台)和Action扩展(iOS平台)中,一般都允许用户使用Safari浏览器执访问网页并通过执行JavaScript脚本将结果返回到扩展中。你也可以在你的扩展运行之前或执行完任务之后通过JavaScript文件修改网页内容。比如分享扩展,它可以帮助用户将网页上的内容分享到用户的社交网站上,或者iOS上的Action扩展可能会显示当前网页的指定翻译内容。
如果要通过应用扩展访问网页并操作网页内容,那么需要遵循下面几个步骤:
创建一个JavaScript文件,并申明一个全局对象,名为ExtensionPreprocessingJS并将其实例化。
在应用扩展的属性列表文件中添加关键字NSExtensionJavaScriptPreprocessingFile,给Safari浏览器指明使用哪个JavaScript文件。
在NSExtensionActivationRule字典中,将NSExtensionActivationSupportsWebURLWithMaxCount赋值一个非零的值。(更多关于NSExtensionActivationRule字典的知识请参阅。)
当你的应用扩展开始运行时,使用类从JavaScript文件的返回值中获取结果。
在iOS系统的应用扩展中,如果你希望当应用扩展执行完任务后实时更新网页内容,那么你要向JavaScript文件中传入内容。(在这一步中也使用NSItemProvider类。)
为了告知Safari你的应用扩展中包含一个JavaScript文件,你需要在应用扩展的Info.plist文件中,向NSExtensionAttributes字典添加NSExtensionJavaScriptPreprocessingFile关键字来指明你的JavaScript文件。这个关键字的值就是你希望当你的应用扩展运行前,Safari要加载的JavaScript文件的名称。比如:
&key&NSExtensionAttributes&/key&
&key&NSExtensionJavaScriptPreprocessingFile&/key&
&string&MyJavaScriptFile&/string&
在iOS和OS X平台中,在你自定义的JavaScript类中可以定义一个run()函数,该函数就是Safari加载JavaScript文件的入口。在run()函数中,Safari提供了一个名为completionFunction的参数,你可以使用键值对象的形式将结果传给应用扩展。
在iOS平台中,你还可以定义一个finalize()函数,当应用扩展在任务结束阶段调用completeRequestReturningItems:expirationHandler:completion:方法时Safari会调用finalize()函数。在该函数中,可以通过向completeRequestReturningItems:expirationHandler:completion:方法传值,来改变网页内容。
比如,你的iOS应用扩展需要基于一个网页URI启动,并且当它结束运行时改变网页的背景色,那么你需要这样写JavaScript代码:
var MyExtensionJavaScriptClass = function() {};
MyExtensionJavaScriptClass.prototype = {
run: function(arguments) {
// Pass the baseURI of the webpage to the extension.
arguments.completionFunction({&baseURI&: document.baseURI});
// Note that the finalize function is only available in iOS.
finalize: function(arguments) {
// arguments contains the value the extension provides in [NSExtensionContext completeRequestReturningItems:expirationHandler:completion:].
// In this example, the extension provides a color as a returning item.
document.body.style.backgroundColor = arguments[&bgColor&];
// The JavaScript file must contain a global object named &ExtensionPreprocessingJS&.
var ExtensionPreprocessingJS = new MyExtensionJavaScriptClass;
在iOS和OS X平台中,你需要编写代码来处理fun()函数返回的值,为获取到字典中的值,我们需要指定kUTTypePropertyList类型作为标示符传入NSItemProvider类的方法。在该字典中使用NSExtensionJavaScriptPreprocessingResultsKey作为key来取值。比如下面例子中我们想要获取将URI传入run()的返回值:
[imageProvider loadItemForTypeIdentifier:kUTTypePropertyList options:nil completionHandler:^(NSDictionary *item, NSError *error) {
NSDictionary *results = (NSDictionary *)item;
NSString *baseURI = [[results objectForKey:NSExtensionJavaScriptPreprocessingResultsKey] objectForKey:@&baseURI&];
finalize()函数是在当应用扩展执行完任务后传参并调用的,创建一个含有我们需要处理的值的字典,然后用NSItemProvider的initWithItem:typeIdentifier:方法来封装该字典。比如当扩展执行完任务后我们想让网页变为红色,我们可以这样写:
NSExtensionItem *extensionItem = [[NSExtensionItem alloc] init];
extensionItem.attachments = @[[[NSItemProvider alloc] initWithItem: @{NSExtensionJavaScriptFinalizeArgumentKey: @{@&bgColor&:@&red&}} typeIdentifier:(NSString *)kUTTypePropertyList]];
[[self extensionContext] completeRequestReturningItems:@[extensionItem] expirationHandler:nil completion:nil];
执行上传下载任务
用户一般的操作习惯都倾向于当使用你的应用扩展完成某个任务后,可以将结果立即反馈在使用扩展的应用中。如果一个扩展要处理的任务包含较长时间的上传下载操作时,你要确保当你的应用扩展关闭后能继续完成该任务。为实现这个功能,我们需要使用类创建一个URL会话并创建后台的上传下载任务。
提示:你可以回想一下其他类型的后台任务,比如后台支持VoIP、后台播放音乐,这些是不能用应用扩展去实现的。更多信息请参阅。
当你的应用扩展准备好上传下载任务后,扩展会完成调用它的应用发出的请求,并在不影响上传下载任务的前提下终止扩展。更多关于扩展处理主叫应用请求的知识请参阅。在iOS系统中,如果你的应用扩展在执行完后台任务时并没有在运行,那么系统会自动在后台运行扩展的载体应用,并调用代理方法。
重要提示:如果你的应用扩展在后台创建了任务,那么你必须要设置一个共享容器,以确保扩展和载体应用实现数据共享。我们可以在NSURLSessionConfiguration类中使用属性来指定一个共享容器的标示符,然后我们就可以通过该标示符获取到共享容器。
请参阅文档来设置共享容器。
下面的例子展示了如何配置一个URL会话,并创建一个下载任务:
NSURLSession *mySession = [self configureMySession];
NSURL *url = [NSURL URLWithString:@&/LargeFile.zip&];
NSURLSessionTask *myTask = [mySession downloadTaskWithURL:url];
[myTask resume];
- (NSURLSession *) configureMySession {
if (!mySession) {
NSURLSessionConfiguration* config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@“com.mycompany.myapp.backgroundsession”];
// To access the shared container you set up, use the sharedContainerIdentifier property on your configuration object.
config.sharedContainerIdentifier = @“com.mycompany.myappgroupidentifier”;
mySession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
return mySession;
因为在单位时间内只能由一个进程使用后台会话,所以你需要为载体应用中的所有扩展创建不同的后台会话(每个后台会话都要有一个唯一的标示符)。在这里我们建议当载体应用在后台处理扩展的任务时,只使用一个该扩展创建的后台会话。如果你要执行其他的网络相关的任务,那么就要创建相应的URL会话。
如果你需要在后台创建URL会话之前完成主叫应用的请求,那么要确保创建和使用会话的代码是有效可执行的。当你的扩展调用方法告知主叫应用已经完成相关请求后,系统就可以随时终止你的应用扩展。
为分享和Action扩展申明支持的数据类型
在你的分享或Action扩展中,在它们的工作中可能会使用到一些数据,并且这些数据的类型各不相同。为了确保只有当用户在主叫应用中选择了你的扩展支持的数据类型时,才会展示你的扩展功能。你需要在扩展的属性列表文件中添加NSExtensionActivationRule关键字。你也可以使用该关键字指定扩展处理每种类型的最大数目。当你的应用扩展运行时,系统会用改关键字的值与扩展数据项的属性值作比较。关于NSExtensionActivationRule关键字的详细信息可以参阅文档中的章节。
比如,你可以申明你的分享扩展支持最大处理10张图片,一部影片和一个网站URL。你可以参考下面的写法:
&key&NSExtensionAttributes&/key&
&key&NSExtensionActivationRule&/key&
&key&NSExtensionActivationSupportsImageWithMaxCount&/key&
&integer&10&/integer&
&key&NSExtensionActivationSupportsMovieWithMaxCount&/key&
&integer&1&/integer&
&key&NSExtensionActivationSupportsWebURLWithMaxCount&/key&
&integer&1&/integer&
如果你想指定不支持的数据类型,那么你可以将该类型的值设置为0,或者在NSExtensionActivationRule中不添加该类型即可。
提示:如果你的分享扩展或iOS中的Action扩展需要访问网页,那你必须要确保NSExtensionActivationSupportsWebURLWithMaxCount关键字的值不为0(更多关于在应用扩展中通过JavaScript访问网页的内容请参阅)。
你也可以使用定义的子类型以便数据检测器检测文本信息,比如电话号码或通讯地址。
NSExtensionActivationRule字典中的关键字足以满足大多数应用的过滤需求。如果你需要做更复杂的过滤,比如像public.url和public.image之间的区别,那么你就得在文本中创建断言语句。如果你要创建一个断言,那么就将NSExtensionActivationRule关键字的值设置为你指定的断言字符串。(在运行时,系统会自动将该字符串编译为对象)
比如,一个应用扩展的附件属性可以指定为PDF文件,可以这样写:
{extensionItems = ({
attachments =
registeredTypeIdentifiers =
"com.adobe.pdf",
"public.file-url"
为了指定你的应用扩展可以处理PDF文件,你可以像这样创建断言字符串:
SUBQUERY(extensionItems, $extensionItem, SUBQUERY($extensionItem.attachments, $attachment, ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf").@count == 1).@count == 1
开发过程中,在你创建断言语句之前你可以使用TRUEPREDICATE常量(结果为true)测试你的代码路径。更多断言语句的语法知识请参阅。
重要提示:在将你的载体应用上传App Store之前,要确保所有的TRUEPREDICATE常量已经替换为指定的断言语句或NSExtensionActivationRule关键字,不然载体应用会被App Store拒绝。
配置载体应用以适用于老版本的iOS系统
如果你在载体应用中使用了内嵌框架,那么它就可以在iOS8.0之后的版本中使用,即便内嵌框架不支持老版本的系统也没关系。
使载体应用能做到上述这一点的是命令,它可以使你使用条件链接和加载框架包的机制。你可以使用这个命令来代替编译时链接,你可以在Xcode的General 选项或Build Phases选项中对该命令进行编辑。其原理就是只有当载体应用在iOS8.0或更高的版本中运行时,才会链接使用内嵌框架。
重要提示:如果你的载体应用使用了内嵌框架,那么就必须要支持arm64架构,否则会被App Store拒绝。
设置Xcode项目中应用扩展的条件链接
将每一个应用扩展的运行系统版本设置为iOS8.0或更高,通常选中Xcode中的target,在General选项中设置Deployment info。
将你载体应用的运行系统版本设置为你想支持的最低iOS版本。
在你的载体应用中,通过方法,在运行时检查判断iOS的版本,并判断是否执行dlopen命令。只有你的载体应用在iOS8.0或更高的版本中运行时才会指定dlopen命令。
特定的iOS API通过dlopen命令使用内嵌框架。你必须选择性的使用这些API,就像使用dlopen命令时那样。这些API都是的封装类型:
还有来自类的方法:
因为你一般会将载体应用的运行系统版本配置为较低的版本,所以这些API通常都是在运行时检查,只有确保载体应用在iOS8.0或更高版本中运行时才会使用这些API。
原文地址:
& 2014 宇轩. Powered by
using the .
Please enable JavaScript to view the日常之事,不寻常的方式。
每台 Mac 中均内置多款 app,让你得以探索世界,与人沟通,并且更有效率地工作。在 OS X Yosemite 中,你的 app 呈现更简洁、更雅致的外观。我们还增加了强大的新功能,让这些 app 变得更出色。
越来越聪明。
全新 Safari 拥有简化的工具栏,不仅让你触手可及众多功能强大的工具,更为你浏览的网页释放出更多空间。你可运用手指来滚动浏览已打开的标签页,或使用全新标签视图,在一个窗口中尽览一切。你还可通过全新个人收藏视图来访问喜爱的网站,该视图可以在你所有的设备上保持同步。共享更轻松,搜索工具更出色,再加上多项节能技术,Safari 无疑是浏览网页的绝佳方式。
全新标签视图让你尽览所有打开的标签页,在你其他设备上的那些也不例外。来自同一网站的标签页会被集合在一起,因而更加易于管理。
你喜爱的网站,触手可及。
你可以随时轻松访问喜爱的网站。在智能搜索栏内点击,你的个人收藏随即出现,就像在你的 iOS 设备上那样。这些个人收藏与你的 iPad 和 iPhone 保持同步,因此无论你使用哪部设备,你的至爱收藏都能伴你左右。
分享链接更轻松
想从 Safari 共享网页,现在更简便了。共享菜单会显示你最近的共享对象,而且 Safari 还会记住你与那个人的共享方式,是通过邮件还是信息,因此你可迅速以同样的方式再次共享。此外,第三方开发者可以创建扩展,那样就能允许你使用全新服务和社交网络来定制你的共享菜单。
网络畅游,电池续航更持久。
使用 Safari 浏览网页,不仅速度惊人,而且能效更高。Safari 经过精心设计,将 Mac 的强大技术发挥得淋漓尽致。所以网站的响应更灵敏,你也可以有更长时间来浏览网页。
有了 OS X Yosemite,在 Mac 上管理电子邮件的绝佳方式得以变得更加完善。使用全新的标记功能,你可在图片或 PDF 附件上快速添加标注。你还可以填写表格,甚至附上你的签名,然后发送回复,而这一切在邮件中即可完成。此外,一项名为 Mail Drop 的新功能还可让你随意发送大附件,不必担心附件过大而被服务供应商限制的问题。
发送大附件,让 Mail Drop 轻松送件。
现在,几乎再没有任何附件,因为超大而无法通过邮件发送。当你登入 iCloud 之后,Mail Drop 可让你发送视频、演示文稿,甚至整个图像文件夹等大型文件,而无需顾虑你的服务供应商所设定的限制。只需将高达 5GB 的附件拖入你的邮件信息,剩下的一切就交给 Mail Drop 来处理。如果你的收件人也在 OS X Yosemite 中使用邮件 app,他们接收附件的方式将与现在完全一致。如果他们使用的是其他 app 或者网页电子邮件,他们将会收到你电子邮件内的链接,可以用来下载附件。使用 Mail Drop 无需付费,无论你使用哪种电子邮件服务,包括 Gmail、Yahoo 和 Microsoft Exchange,都没有问题。
标注附件,直接批注邮件。
这样的场景时有发生,有人给你发了一个附件,需要你的即时反馈。它可能是一张表格需要你填写并且签字,或是一张图片需要你在上面标出意见。通过标记功能,你不必使用另一个 app 打开文件,即可迅速回应这些请求。只需点击回复,然后直接在你回复的邮件中添加标注。你可用 Multi-Touch 触控板为图片添加形状、文本和图例。填写表格及 PDF 文件,然后直接用手指在触控板上签字,或者用 Mac 上的摄像头拍下你的签字,以此来添加你的签名。
信息让你可以通过多种方式开始对话。你可以向在 Mac 或 iOS 设备上使用 iMessage 的任何人发送不限量的文本信息。你也可以与两位或更多朋友进行群组对话。如果你使用 iPhone,无论你的朋友使用的是哪款手机,你都可以通过你的 Mac 向他们发送 SMS 文本信息1。
你 iPhone 上的一切信息,现可在你 Mac 上一一呈现。
Mac 上的信息一直都是保持联络的极好方式,但是以往没有 iMessage 的朋友无法参与对话。不过,现在他们可以了。你在你的 iPhone 上收到的所有 SMS 信息,如今均可在你的 Mac 上显示。因此,无需拿起 iPhone,你也能够给任何朋友发信息。而且在你的所有设备上,对话均会一直保持更新。
你的 Mac 始终是管理和欣赏歌曲、影片、app 和其他内容的绝佳设备。如今有了家人共享,全家最多六人可以轻松共享彼此在 iBooks 和 App Store 已下载或购买的内容,并且无需共享帐户。无论任何时候,只要一位家庭成员下载了新图书或 app,家庭群组中的每个成员都可以一同分享。你还可以共享照片、家庭日历以及更多内容,让全家人保持联系,亲密无间2。
身为一家人的好处,有了新诠释。
一旦你设置家人共享,家庭成员便可立即访问彼此的 app 和已下载的图书。只需点击一下,即可随时浏览每个人的资料库并下载你喜欢的内容。由于所有家庭成员都使用自己的 Apple ID,因此无需共享帐户或密码。
买起来也轻松,管起来也轻松。
家长拥有了更多的控制,而孩子感觉有了更多的自由。这并不是子女教育的奇迹,而是因为有了家人共享。现在,你可以尽情享受使用一张信用卡支付全家购买内容的便利。启用 "购买前询问" 功能后,子女需要经过家长批准方可在 iBooks 和 App Store 进行下载或购买。你甚至可以为 13 岁以下的子女创建 Apple ID,让他们同样也可以参与其中。
做个有条不紊的家庭,不再是什么难事。
家人共享会自动建立共享的相册、日历和提醒事项。因此,如果你想要浏览最新的假期照片,或通知大家照相日在哪一天,只需轻点一下即可。如果家里有人丢失了设备,每个人都能使用 “查找我的 iPhone” 帮忙找寻。
并于任何设备随意取用。
欢迎使用你云中的空间。你可以通过 Finder 访问到 iCloud Drive,在这里存储各种类型的文件,并以你喜欢的方式来整理它们,同时还可以从你的所有设备访问这些文件。
你的文件,如今与你如影随行。
iCloud Drive 的使用方法,与 Mac 上的其他任何文件夹如出一辙,只需将文件拖放其中即可。你在一台设备上所做的修改,将出现在你所有其他的设备上。即使你处于离线状态,也可随时在 Mac 和 iOS 设备上取用你的文件。你离线时所做的修改,也会在连上网时同步更新。
你的所有文件,按你的方式归整。
你的 Mac 上储存着各种文件,包括工作文件、学校项目、演示文稿等等。有了 iCloud Drive,保持追踪它们的进展变得轻而易举。你可以在 iCloud Drive 中创建更多文件夹,并为其添加例如 "学校" 或 "工作" 等标签,以便能够简单识别。按照你所希望的方式,重新整理所有文件。有了 iCloud Drive,你可以在 iPhone、iPad、Mac 或 PC,以及
上随时查看最新版本的文件。
每台 Mac 均内置多款精彩 App
每台 Mac 均内置六款激发创意和提升效率的强大 app:Pages、Keynote、Numbers、iPhoto、iMovie 和 GarageBand。此外,还有 Safari、邮件和 iBooks 等多款其他出色的 app,非常适用于你想要做和需要做的各种事情。当然,Mac App Store 中还有成千上万的精彩 app 等你去发现。App Extension编程指南(iOS8/OS X v10.10):扩展类型--Today
17:00&编辑:&分类:&来源:CocoaChina
招聘信息:
本节由CocoaChina翻译组成员翻译自苹果&一节,校对:唧唧歪歪()
Today 视图的中扩展被称为插件。用户可以通过插件快速访问当前重要的信息。比如,用户打开 Today 视图检查当前的股票价格和天气情况,查看日程安排或者快速执行类似标记已完成项目等操作。用户会频繁打开Today视图,并且他们期望能立即看到他们感兴趣的信息。插件也能展示在iOS设备的锁屏界面上。
要确保 Today 扩展点适合你想提供的功能。最好的插件可以为用户展现最近的更新或者完成简单的任务。如果你创建的扩展想完成步骤繁多或者比较耗时的任务,比如上传或者下载内容,那么Today扩展可能不是最佳选择。
可参看&了解你可以创建的其他扩展类型。
理解Today 插件
在两个平台上,Today 插件应该:
1.确保内容永远是最新的
2.正确响应用户的操作
3.高效运行(特别是iOS插件必须合理使用内存,否则系统可能终止插件的运行)
由于与插件的交互快速且有限制,所以你应该设计一个精简的UI以突出用户感兴趣的信息。通常,一个很好的办法是限制插件中可交互项的数目,尤其要注意iOS插件不支持键盘输入。
注意:避免在插件中放置滚动视图,因为用户在滚动插件中的内容时,会很容易误滚动整个Today视图。
用户使用的平台不同,因此插件配置方式也有差别。
iOS.由于插件不允许键盘输入,所以用户需要能使用containing app来配置插件的内容和行为。比如,在 Stocks 插件中,用户可在不同的股票值之间进行切换,但是他们必须打开Stocks app来管理股票列表。
OS X.containing app可能不会执行任何功能,所以插件在运行时需要给用户配置它的方式。比如,OS X中的Stocks插件可以让用户找到和添加他们想要追踪的股票。OS X中通知中心的API包括可以让用户配置插件的方法。
在用户安装完包含 Today 插件的应用程序后,他们可以为 Today 视图添加插件。当用户在 Today 视图中选择编辑时,通知中心会展现一个视图让用户添加插件,并可对其进行排序和移除。
使用Xcode的Today模板
Xcode的Today模板为主要类提供了默认的头文件和执行文件(命名为TodayViewController),一个Info.plist文件,一个界面文件(一个storyboard或者xib文件)。
默认情况下,Today 模板提供了以下 Info.plist 键和值(这里展示的是OS X target):
如果你使用了自定义视图控制器子类,那么使用自定义类的名字来取代NSExtensionPrincipalClass 键对应的TodayViewController值。
iOS.如果你不想使用模板提供的storyboard文件,那就移除NSExtensionMainStoryboard 键,并添加NSExtensionPrincipalClass 键,使用view controller的名字作为值。
创建Today插件所需的大部分工作包括设计UI和实现一个完成自定义功能的view controller子类。
重要:为了获得最佳的效果,请使用Auto Layout设计Today插件的视图。
由于Today视图的空间有限,并且用户体验应该是快速和集中的,你不应该默认创建一个过大的插件。在两个平台上,一个插件必须适应Today视图的宽度,但是它可以通过增加高度来展示更多的内容。
默认情况下,插件视图包括标准的margin insets。如果你需要检查或者改变边距值,你可以遵循&&协议,并实现方法。
在大多数情况下,调整margin insets不是必须的,但如果你的设计需要你可能会这么做。比如,Reminders插件在左侧边缘展示复选框图片。
如果插件需要展示额外的内容,你可以用Auto Layout约束来调整插件到合适的高度。如果不使用Auto Layout,那你可以使用UIViewController 属性&来指定插件的新高度。比如:
通常情况下,你不应该让插件过高,因为用户必须滚动才能查看全部内容。
iOS.如果你想让调整高度的动画和展示内容的动画一起执行,实现viewWillTransitionToSize:withTransitionCoordinator:方法。用方法把动画添加到coordinator参数中。
为了让你的插件能在Today视图中清晰地展示出来,可使用notificationCenterVibrancyEffect。
OS X.&插件会从它的view controller所在的视图中继承NSAppearanceNameVibrantDark当使用标准控件时,你会自动获得正确的外观。如果使用自定义颜色,那要确保所选颜色在深色视图中看起来也很适合。
Today 扩展点提供了API来管理插件的状态,并处理内容更新(你可以在&&阅读关于该API的内容)。虽然 Today API 针对特定平台会有所不同,但两个平台都支持的功能的API大部分是相同的。
为了让插件看起来保持最新的内容,系统会不定期抓取插件视图的快照。当插件再次可见,将会展示最近的快照,直到系统使用视图的实时版本取代它。
想要在抓取快照前更新插件的状态,那要确保遵照&协议。当你的插件接收调用时使用最近的内容更新插件视图,并调用completion
handler(完成处理程序),使用以下常量来描述更新结果:
NCUpdateResultNewData—新内容要求你重绘view
NCUpdateResultNoData—插件不要求更新
NCUpdateResultFailed—在更新期间发生错误
指定插件应该在何时出现
如果你的插件只应该在某种环境下进行展示,比如当它有新内容或者值得关注的内容进行展示时,你可以使用&API来指定插件应该在何时出现。
插件与其 containing app 可使用&方法来设置插件内容的当前状态。即使插件没有运行,Containing
app也可以使用这个API。
注意:如果没有内容可供展示,那么插件会隐藏自身。通知中心将不会再次打开你的插件直到containing app指定插件应该被展示。
打开Containing App
在某些情况下,插件请求containing app打开是有意义的。比如,在OS X中,当用户点击日历插件中的事件时会打开日历应用。(在iOS中,用户可能需要在containing app打开之前解锁设备)在用户当前任务上下文环境中,为了确保containing app能以用户理解的方式打开,你需要定义一个能在app和它的插件中都能使用的URL scheme。
插件不能直接通知其containing app打开,它使用的方法通知系统去打开其containing
app。当插件使用该方法打开URL,系统会在使用它之前确认请求。
支持可编辑(仅适用于OS X)
想要在 OS X 插件中支持编辑模式,需要遵照&&协议。当你把
widgetAllowsEditing 属性设置为YES,Info按钮会自动展示在插件的头部区域。(当用户点击Info按钮,它会自动切换至 Done 按钮。)使用&NCWidgetProviding协议来支持可编辑,当视图进入编辑模式时,编辑、完成和取消按钮会自动被提供。
为了观察插件中编辑和非编辑模式之间的变化,你可以使用 NCWidgetProviding 协议的widgetDidBeginEditing 和 widgetDidEndEditing 方法。
如果你还想在用户编辑插件时展示一个模态搜索UI,可使用NSViewController的NCWidgetProvidingPresentationStyles 类别来模态弹出搜索视图控制器。当用户表明他们进行搜索时,可使用方法来解除搜索视图控制器。(注意你也可以使用presentViewControllerInWidget:方法来展示一个在头部区域有取消按钮的非搜索模态视图)
iOS:你可以在iOS模拟器或者设备上测试iOS插件。
OS X:想要在OS X中测试插件,最简单的方法是使用Xcode Widget Simulator,因为当你切换至其他应用程序或者点击边界以外的部分时,通知中心会立刻收起来。你可以在scheme中为widget target指定Widget Simulator。
学习更多扩展调试内容,可参看。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:66732次
积分:1204
积分:1204
排名:第14349名
转载:230篇
评论:11条
(12)(23)(53)(22)(11)(15)(3)(22)(36)(2)(2)(22)(2)(1)(1)(7)(3)(6)(6)(3)(5)(18)(23)(4)(1)}

我要回帖

更多关于 pc安装mac os x10.9 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信