首页 > 代码库 > IOS8 创建一个应用程序扩展
IOS8 创建一个应用程序扩展
创建一个应用程序扩展
在这一页上
当你准备开发一个应用程序扩展,首先选择你想要的支持任务的扩展点来启用。 接下来,使用Xcode模板扩展点的选择和提高默认文件与您的自定义代码和自定义用户界面(UI),如果必要的。 优化和测试您的应用程序扩展后,你准备分发它内部包含应用程序。
开始发展,选择正确的扩展点
因为每个扩展点目标明确的用户场景中,你的第一份工作是选择支持的功能类型的扩展点提供的计划。 这个选择很重要,因为它可以决定你和可用的api,在某些情况下,其他api的方式行为。 表1 - 1 列出了支持扩展点,在iOS和mac OS X。
在您为您的应用选择有意义的扩展点扩展,包含应用程序添加一个新的目标。添加一个应用程序扩展目标的最简单方法是使用一个Xcode模板扩展点提供预配置的目标。
添加一个Xcode应用项目的新目标,选择File > new >的目标。 栏左边的新目标对话框中,选择应用程序扩展为iOS或OS x面板右边的对话框中,Xcode显示模板可以选择。 例如, 图3 - 1 显示了您可以使用的模板创建一个iOS应用程序扩展。
后,你选择一个模板,完成目标添加到您的项目,您应该能够构建和运行项目甚至在您自定义扩展的代码。 当你创建一个扩展基于一个Xcode模板,你结束的一个扩展包 .appex
。
关于64位体系结构
应用程序扩展目标必须包括arm64架构的架构构建设置或应用商店将被拒绝。 Xcode包括这个架构的“标准结构”设置当您创建一个新的应用程序扩展目标。
如果你包含应用程序目标链接嵌入式框架,应用程序必须包括arm64架构或应用商店将被拒绝。
对64位发展的更多信息,见 64位过渡指南可可联系 或 64位过渡指南可可 ,这取决于你的目标平台。
在大多数情况下,您可以测试的默认应用程序扩展使其在系统设置或设置,然后通过另一个应用程序访问它。例如,你可以测试一个OS X分享在Safari扩展通过打开一个网页,点击分享工具栏按钮,在出现的菜单中选择你的扩展。
检查默认的扩展模板
一般来说,每个扩展模板包括一个(也就是说,一个属性列表文件 Info.plist
视图控制器类文件),和一个默认的用户界面,所有的定义的扩展点。 默认视图控制器类(或 主要类 )可以包含扩展点的存根方法你应该实现。
应用程序扩展目标 Info.plist
文件标识扩展点,可以指定一些细节关于你的扩展。 至少,文件包括 NSExtension
钥匙和一本字典扩展点指定的键和值。 例如,所需的值 NSExtensionPointIdentifier
关键是扩展点的反向DNS名称,如 com.apple.widget-extension
。 这里有一些其他的键和值,你可以看到在您的扩展 NSExtension
字典:
NSExtensionAttributes
字典扩展的具体属性,例如
PHSupportedMediaTypes
照片编辑扩展。NSExtensionPrincipalClass
主要视图控制器类的名称创建的模板,如
SharingViewController
。 当主机应用程序调用您的扩展,扩展点实例化这个类。NSExtensionMainStoryboard
(仅iOS扩展)默认的故事板文件扩展,通常命名
MainInterface
。
除了属性列表设置,默认模板可以设置一些功能。 每个扩展点可以定义功能意义的任务扩展点支持的类型。 例如,一个iOS文件提供者扩展包括 com.apple.security.application-groups
权利。
所有模板包括应用程序沙箱和OS X应用程序扩展 com.apple.security.files.user-selected.read-only
默认情况下权利。 您可能需要为您的扩展定义额外的功能如果需要做事情喜欢使用网络或访问用户的照片或联系信息。
请注意
一般来说,当用户给出一个包含应用程序访问他们的私人数据,包含应用程序中所有的扩展也接受访问。
回应主机应用程序的请求
当你学到的 理解一个扩展是如何工作的 ,当一个用户打开应用程序扩展选择扩展在主机应用程序和主机应用程序发出请求。 在高级别上,您的扩展接收请求,帮助用户执行一个任务,并完成或取消请求,根据用户的行动。 例如,分享扩展从主机应用程序接收请求,响应通过显示其观点。 视图中用户撰写的内容之后,他们选择发布内容或取消发布,并相应地扩展完成或取消请求。
当一个主机应用程序发送一个请求,它指定应该运行应用程序的环境中扩展。 对于许多扩展,最重要的部分项目的上下文是一组用户想要使用他们在扩展。 例如,共享的上下文扩展可能包括选择文本,用户想要的职位。
当一个主机应用程序发出的请求(一般情况下,通过调用 beginRequestWithExtensionContext:
方法),可以使用你的应用程序扩展 extensionContext
房地产在其主要视图控制器上下文。 接下来,您可以使用NSExtensionContext
类检查上下文和获得物品。 通常情况下,它可以很好地得到上下文和物品在你的视图控制器的 loadView
方法,这样你可以在你的视图中显示的信息。 让您的扩展上下文可以使用代码如下:
NSExtensionContext * myExtensionContext = ( 自我 extensionContext ];
特别感兴趣的是上下文对象 inputItems
属性,该属性可以包含扩展你的应用程序需要使用的条目。 的inputItems
属性包含一个数组 NSExtensionItem
对象,每个包含一个项目扩展可以工作。 把物品从上下文对象,您可以使用下面这样的代码:
nsarray * inputItems = ( myExtensionContext inputItems ];
每一个 NSExtensionItem
对象包含许多属性描述方面的项目,比如标题、文本内容,附件,和用户信息。
注意, 附件
属性包含一个数组的媒体与项目相关的数据。 例如,在一个项目关联到一个共享的要求, 附件
网页的属性可能包含一个表示一个用户想要分享。
在用户使用输入项(如果合适的话),应用程序扩展通常让用户选择完成或取消任务。 根据用户的选择,您的电话completeRequestReturningItems:completionHandler:
主机应用程序,选择返回物品,或cancelRequestWithError:
,返回一个错误代码。
在iOS应用程序扩展可能需要更多的时间来完成一个冗长的任务,比如网站上传内容。 在这种情况下,您可以使用nsurlsession
类在后台启动传输。 因为背景转移使用一个单独的进程,转移后可以继续您的扩展完成主机应用程序的请求和终止。 了解更多关于使用 nsurlsession
在您的扩展,明白了 进行上传和下载 。
重要的
虽然您可以设置后台网址上传或下载任务,其他类型的后台任务,如支持VoIP或玩背景音频,没有可用的扩展。
如果你包括 UIBackgroundModes
关键在你的应用程序的扩展 Info.plist
文件,扩展应用商店将被拒绝。 (想要了解更多关于这个关键,见 UIBackgroundModes 在 信息属性列表的关键参考 )。
优化效率和性能
内存限制为运行应用程序扩展明显低于内存限制强加于一个前景应用。在这两个平台上,该系统可能积极扩展终止,因为用户希望回到主机应用程序中的主要目标。一些扩展可能比其他人更低的内存限制:例如,部件必须特别有效,因为用户可能同时打开几个小部件。
应用程序扩展不拥有的主要循环运行,所以它是至关重要的,你按照既定规则的良好行为主要循环运行。 例如,如果您的扩展块的主要运行循环,它可以创建一个坏在另一个扩展或应用程序的用户体验。
记住,GPU是系统中的共享资源,所以应用程序扩展不要首要任务。 例如,今天小部件,运行一个图形密集的比赛可以给用户一个糟糕的经历在两个平台上,并很可能被终止,因为内存压力。
设计一个流线型的UI
大多数扩展点需要你提供至少一些自定义UI,用户打开应用程序时所看到的扩展。 一般来说,一个扩展的UI应该简单,克制,集中在单个任务的实现。 提高性能和用户体验,你想避免包括外部UI不支持您的扩展的主要任务。
大多数Xcode UI应用程序扩展模板提供一个占位符开始,您可以使用。
用户通常识别应用程序扩展到它的图标。 在大多数情况下,一个扩展的图标一样包含应用程序的应用程序图标。使用包含应用程序的图标(或者类似的)帮助用户是相信一个扩展实际上是由他们安装的应用程序。 然而,有一些例外。
在iOS,自定义动作扩展使用的模板映像版本包含应用程序的应用程序图标。
在OS X,应用扩展提供了一个包含应用程序图标只有其只是一个包装器;否则,延长使用包含应用程序的图标。
应用程序扩展需要一个短的,可辨认的名字。 一个可辨认的名字帮助用户将您的扩展与包含应用程序并使其容易管理整个系统的扩展。 你的名字的扩展提供了扩展目标 CFBundleDisplayName
价值。 您可以编辑此值的扩展Info.plist
文件(确保你本地化名称)。 如果你不提供一个名称 CFBundleDisplayName
键,您的扩展将使用包含应用程序的名称,因为它出现在 CFBundleName
价值。
一些应用程序扩展也需要简短的描述。 例如,一个OS X小部件显示一个描述,帮助用户选择他们想看到小部件在今天视图中。 提供该文本,编辑的价值 widget.description
在你的小部件的关键 InfoPlist.strings
文件。
调试、配置文件和测试您的应用程序扩展
请注意
确保包含应用程序及其所有扩展代码以同样的方式签署。
使用Xcode调试应用程序扩展很像使用Xcode调试其他过程,但有一个重要的区别:你必须选择一个主机应用程序,您可以访问扩展。 当你构建和运行您的扩展,Xcode发射主机应用程序,并等待你来调用扩展之前将调试器附加到扩展的过程。 您指定一个主机应用程序中 计划 (为你的扩展 计划 封装为目标构建指令)。
默认情况下,Xcode为应用程序创建一个计划扩展当你添加一个扩展目标包含应用程序的项目。 扩展计划允许你指定一个应用程序或其他可执行主机运行时扩展调试它。 扩展指定的默认计划推出的可执行主机上问,这意味着提示您选择一个主机应用程序每次构建和运行时扩展。
在您运行您的应用程序构建和扩展之前,检查确保扩展的计划被选中。 你可以设置适当的方案通过选择产品>计划> MyExtensionName
或单击计划在Xcode工具栏和弹出菜单选择 MyExtensionName
。
请注意
如果你运行包含应用方案,而不是一个扩展计划,Xcode表明它正在等待调试扩展构建您的项目。
当你构建并运行你的应用程序扩展,Xcode显示主机的应用程序列表。 在您从列表中选择一个主机应用程序并单击运行,调试导航器显示调试器等待连接到您的扩展。 当你从主机访问您的扩展应用,Xcode自动高度调试器扩展,集任何活跃的断点,并允许扩展执行。 此时,您可以使用相同的Xcode调试特性用来调试其他进程。
请注意
以外的如果你使用一个应用程序中指定的一个计划,Xcode不会附加到应用程序扩展访问的应用程序。
在OS X中,您需要启用应用程序扩展之前,你可以从一个主机应用程序访问它。一般来说,扩展面板启用了一个扩展的系统设置(你也可以打开扩展面板,选择更多的分享或操作菜单)。 注意,您不需要启用一个OS X今天小部件使用小部件时模拟器运行和调试。 在iOS模拟器,您必须启用键盘扩展之前,你可以访问和调试(您可以启用键盘扩展键盘设置> General > >键盘)。
Xcode寄存器构建应用程序扩展在调试会话期间在OS X。这意味着,如果你想在OS X上安装扩展的开发版本需要使用仪从构建位置将其复制到一个位置等应用程序文件夹。
请注意
在Xcode调试控制台日志,应用扩展的二进制可能带来的价值 CFBundleIdentifier
财产,而不是价值CFBundleDisplayName
财产。
因为必须响应和高效应用的扩展,它是一个好主意去看调试的调试仪表导航器当你运行你的扩展。 调试仪表显示您的扩展使用的CPU,内存,它运行时和其他系统资源。 如果你看到性能问题的证据,如一个不寻常的CPU使用量飙升,您可以使用工具来配置您的扩展和识别需要改进的地方。 你可以在调试会话中打开工具当你点击配置文件在任何调试仪器评估报告(查看调试测量报告,单击调试地区计)。 了解更多关于调试仪表,明白了 调试应用程序学习如何使用工具,请参阅 仪器用户指南 。
请注意
选择产品在Xcode >概要文件构建和运行一个应用程序扩展仪器直接。 仪器使用可执行组的剖面图方案作为东道主的扩展。
测试应用程序扩展使用Xcode测试框架(即XCTest api),编写测试,运动包含应用程序的扩展代码使用您的主机环境。 更多地了解测试,看看 测试与Xcode 。
将包含应用程序
你不能提交应用程序扩展到应用程序商店,除非是在一个包含应用程序,和你不能转移从一个程序转到另一个延伸。
提供一个iOS应用程序扩展,您必须提交一份包含应用程序到应用程序商店。 此外,你的iOS用户包含应用程序必须提供的功能,它不能包含扩展。
提供一个OS X应用程序扩展,建议您提交您的包含app Store应用程序,但这不是必需的。 在OS X中,包含应用程序可以提供扩展,它没有提供任何功能除了扩展。
请注意
如果你不使用App Store交付您的OS X扩展及其包含的应用程序用户,守门人不会提供扩展到包含应用程序被批准使用。 也,如果你不使用应用程序商店,你不与你签订包含应用程序开发者ID,用户必须显式重写的看门人包含应用程序之前,您的扩展变得可用。
IOS8 创建一个应用程序扩展