有意思的是内容对象的 inputItems 属性,它包含了应用扩展需要使用的工作项。inputItems 属性包含一个 NSExtensionItem 类型的数组,数组的每一个成员都包含一个可执行的工作项。从上下文中获取工作项可以使用如下代码:
- NSExtensionContext *myExtensionContext = [self extensionContext];
每个 NSExtensionItem 对象都包含若干个描述工作项的属性,比如标题、文本内容、附件信息、用户信息。 注意 attachments 属性,它包含一个与工作项相关联的媒体数据数组。比如说一个分享请求的工作项,那么 attachments 属性可能就包含用户想要分享网页中的信息。 当用户工作项处理完后,应用扩展通常会给用户两个选择,完成任务或取消任务。根据用户的选择,扩展会调用 completeRequestReturningItems:expirationHandler:completion: 方法,把工作项返回给 host app,或者会调用 cancelRequestWithError: 方法,返回一个错误代码。 在iOS中,你的应用程序扩展可能需要更多的时间去处理潜在的需长时间处理的任务,比如说往网上上传内容。这种情况下,你就要使用 NSURLSession 类将该任务转为后台处理的任务。因为转换到后台处理任务需要用一个单独的线程,所以在扩展完成主应用请求并关闭后仍然可以处理。想了解更多关于扩展中NSURLSession类的用法,请参阅:Performing Uploads and Downloads。 重要:虽然你可以设置一个后台URL来上传或下载任务,但是有一些类型的后台任务,比如支持 VoIp 或者在后台播放音乐的任务,是不能通过扩展来实现的。 如果你应用扩展的Info.plist文件中含有 UIBackgroundModes 关键字,那么在上传App Store时会被拒绝。(想了解更多关于 UIBackgroundModes 关键字的内容,请参阅 Information Property List Key Reference 中的 UIBackgroundModes) 优化效率和性能 应用扩展在内存使用优先级上要明显低于当前运行的应用程序。不管是 iOS 还是 OS X,系统都会毫不犹豫地终止扩展,因为用户想返回到host app中的主要目标中。但是也有一些应用扩展的内存使用优先级要高于其他扩展,比如说widgets就要求要高一些,因为它要实时的显示一些信息,因为一般用户更倾向于同时开启多个widgets。 你的应用扩展并不拥有主循环线程,你要遵循这一规则,以便让扩展在主循环线程中发挥最好的性能。比如说,如果你的应用扩展阻止了主循环线程,那么在用户使用主应用程序的过程中会造成非常糟糕的用户体验效果。 我们需要记住的一点是,GPU在系统中是一个共享的资源,所以应用扩展不会得到很高的优先级照顾。比如说,如果你正在玩一个对GPU消耗很高的游戏,那么由于内存压力比较大,它就有可能会选择关闭Today widget。 设计一个精简的用户界面 大多数的扩展点都要求你向用户提供一些自定义的界面,它在用户打开你的应用扩展时呈现给用户。通常情况下,应用扩展的界面要尽可能的简约、内敛,并主要关注一个单一任务。为了提高性能和用户体验效果,你要避免与该扩展功能无关的界面出现。 大多数Xcode 提供的应用扩展模板都包含一个初始界面文件,你可以从这个文件中设计界面开始。 在用户的惯性思维中,一般他们都是通过应用扩展的图标来辨识扩展功能的。通常情况下,应用扩展的图标和它的主体应用的图标是一致的。使用主体应用的图标作为应用扩展的图标有利于用户去判断这个扩展的来源,也就是说让用户确信这个扩展是来源于他们安装的主体应用。当然也有一些例外。 在iOS中,自定义的Action扩展的图标使用其主体应用的图标。 在OS X中,如果一个扩展的主体程序只是用来安装扩展的封装包,那么该扩展要提供一个单独的图标,否则都会使用主体应用的图标。 应用扩展要使用一个简短,语义明确的名字,这能让帮助用户把扩展和你的主应用程序联系起来,并且能让他们在系统中更好的管理应用扩展。通过应用扩展 Target的 CFBundleDisplayName 属性来设置它的名称,你可以在Info.plist文件中修改它。如果你没有给 CFBundleDisplayName 设置值,也就是没有给扩展设置名称,那么应用扩展会使用其主体应用的名称,也就是 CFBundleName 属性中的值。 同时一些应用扩展也需要一个简短的说明。比如说,OS X中的 Widget 扩展就会显示一个简单的描述,这能帮助用户更好的选择他们想要显示在今日通知中的Widget扩展。扩展的描述可以在 InfoPlist.strings 文件的 widget.description 属性中设置。 调试,配置和测试你的应用扩展 注意:要确保主体应用中的所有扩展都要使用相同签名方式的代码。 使用 Xcode 调试应用扩展和调试其他程序基本是一样的,但唯一点不同的是:你要选择一个能访问扩展的载体应用。当你编译运行应用扩展后,Xcode 会运行载体应用,等待你去使用扩展并触发调试点来调试扩展。你要在 scheme 中要为扩展指定一个载体应用(一个 scheme 封装了 Target 编译的说明)。 当你在主体应用工程中添加一个应用扩展的Target时,Xcode 就会为应用扩展默认创建一个 scheme。应用扩展的 scheme 可以让你指定在调试时由哪个应用程序来调用你的扩展,也就是指定一个调试时的载体应用。默认情况下,当你编译运行扩展时,会询问你使用哪个载体应用来调用该扩展。 在你编译运行应用扩展之前,你要确保你的扩展已经选择了一个 scheme。你可以通过 Product > Scheme > MyExtensionName 或者使用 Xcode 菜单栏呼出 scheme 菜单并选择 MyExtensionName 来设置应用扩展的 scheme。 注意:如果你运行主体应用的 scheme 代替应用扩展的 scheme,那么你在编译工程时Xcode会告诉你它正在等待调试应用扩展。 当你编译运行应用扩展时,Xcode会为你列出允许调用该扩展的载体应用程序。当你选择一个载体应用程序并且运行后,调试器就准备开始工作了,并准备好在你打的断点处进行拦截。当你在载体应用程序中使用扩展时,就可以对应用扩展进行Debug调试了。调试应用扩展的方式和使用Xcode调试其他进程一样。 在OS X中,你在载体应用程序中访问扩展之前,要确保该扩展是允许被使用的。一般情况下,在System Preferences的扩展面板中开启或关闭扩展(你也可以在共享或Action菜单中打开应用扩展面板)。这里要注意一点,在 OS X 中使用 Widget 模拟器调试 Widget扩展时,是不需要对其进行开启操作的。当你要调试键盘扩展时,必须要开启该扩展(你可以通过Settings > General > Keyboard > Keyboards开启键盘扩展)。 在调试时,Xcode会在OS X中创建一个持续的编译应用扩展的会话。这意味着,如果你要使用OS X系统下的扩展,你需要使用Finder把它从构建处拷贝到类似 Applications folder的地方。 注意:在Xcode的调试控制台日志中,应用扩展的二进制值可能是和 CFBundleIdentifier 属性关联,而不是 CFBundleDisplayName 属性。 因为应用扩展必须要做出一个有效的响应,所以当你运行应用扩展时,在调试导航中查看各种调试监控器就非常的清晰明了。这些调试监控器会告诉你当前运行的应用扩展占用了多少CPU、内存和其他系统资源。当你发现类似占用CPU资源出现异常的性能问题时,你就可以使用Instruments来分析你的应用扩展,并确定需要改进的地方。想学习了解调试监控器,请查阅Debug Your App;想学习了解Instruments,请查阅Instruments User Guide。 注意:在Xcode中选择 Product > Profile可以直接在Instruments中编译并运行应用扩展。Instruments使用 如果要使用Xcode提供的测试框架(比如XCTest APIs)测试应用扩展,你需要在主体应用程序中写一些测试用例代码。想了解更多XCTest的知识,请参阅Testing with Xcode。 分发扩展主体应用程序 你不能直接将应用扩展上传至App Store,除非它包含在主体应用程序中,并且你不能将应用扩展从一个应用程序中转到另一个应用程序。 如果想让用户使用你的应用扩展,你必须提交一个主体应用程序到App Store中,并且主体应用程序如要有其他的功能,不能只包含应用扩展。 如果你想交付 OS X 应用程序扩展,推荐你将主体应用程序提交至App Store,但这也不是唯一的途径。在OS X中,主体应用程序就可以只包含应用扩展,而不需要提供扩展外的其他功能。 注意:如果你不使用App Store来将主体应用程序和OS X 扩展交付给用户,那么在主体应用程序通过审核前,Gatekeeper是不会允许应用扩展生效的。同时,如果你不将主体应用程序上传至App Store,那么该主体应用程序也不能签署你的开发者ID名称,所以用户必须明确从主体应用程序中重载Gatekeeper,才可以让应用扩展生效。
- NSArray *inputItems = [myExtensionContext inputItems];
本文发布于:2024-02-01 01:06:36,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170672079732723.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |