-- ios8与os x v1010应用扩展编程指南

上传人:xzh****18 文档编号:46622945 上传时间:2018-06-27 格式:PDF 页数:8 大小:582.95KB
返回 下载 相关 举报
-- ios8与os x v1010应用扩展编程指南_第1页
第1页 / 共8页
-- ios8与os x v1010应用扩展编程指南_第2页
第2页 / 共8页
-- ios8与os x v1010应用扩展编程指南_第3页
第3页 / 共8页
-- ios8与os x v1010应用扩展编程指南_第4页
第4页 / 共8页
-- ios8与os x v1010应用扩展编程指南_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《-- ios8与os x v1010应用扩展编程指南》由会员分享,可在线阅读,更多相关《-- ios8与os x v1010应用扩展编程指南(8页珍藏版)》请在金锄头文库上搜索。

1、常见问题的处理方案 - iOS8/OS X v10.10应用扩展编程指南当你在开发一个应用扩展,让其执行某个任务时,你可能会遇到一些常见的,或者说在多种扩展中都会出现的通用的问题,并且必须要处理这些问题。在这一章节中,我们将帮助你如何应对和处理这些常见的问题。使用内嵌框架共享代码你可以创建一个内嵌框架,用于在应用扩展和它的载体应用之间共享代码。比如,你开发了一个图片滤镜的照片编辑扩展,同时该扩展的载体应用也有这个功能,那么你就可以将实现该功能的代码封装成一个框架,让扩展t a r g e t和载体应用t a r g e t都使用这个框架。你要确保你创建的内嵌框架不包含应用扩展不能使用的API。

2、这类API一般使用u n a v a i l a b i l i t y宏来标记,比如像N S _ E X T E N S I O N _ U N A V A I L A B L E。如果你创建的内嵌框架中包含应用扩展不能使用的API,那么你将其Link到载体应用没关系,载体应用可以正常使用框架中的API,但是不能与应用扩展共享代码,也就是应用扩展不能使用该框架提供的所有API,继而无法做到代码共享。如果你上传App Store的应用扩展中有这种框架,或者应用扩展中使用了不允许使用的API,那么审核时会被拒绝。如果我们要想应用扩展使用内嵌框架,那么首先要配置一下。将t a r g e t的R

3、e q u i r e O n l y A p p - E x t e n s i o n - S a f e A P I选项设置为Y e s。如果你不这样设置,那么Xcode会向你提示警告:l i n k i n g a g a i n s t d y l i b n o t s a f e f o r u s e i n a p p l i c a t i o n e x t e n s i o n s。重要提示:如果载体应用要使用内嵌框架,那么必须要支持a r m 6 4架构,否则在上传App Store时会被拒绝。(如“创建应用扩展”章节中介绍的,所有应用扩展都要支持a r m 6 4

4、架构。)在配置你的Xcode项目时,在B u i l d P h a s e s选项卡的C o p y F i l e s项中一定要将D e s t i n a t i o n设置为F r a m e w o r k s。重要提示:我们要始终将D e s t i n a t i o n设置为F r a m e w o r k s,如果你将其设置为S h a r e d F r a m e w o r k,那么上传App Store时会被拒绝的。你可以让载体应用支持iOS7或更早的版本,但当在iOS8或更新的版本中运行时,要特别注意内嵌框架的安全性。详细内容可以参阅Deploying a Con

5、taining App to Older Versions of iOS。有关创建和使用内嵌框架的更多内容,请观看WWDC 2014的视频“Building Modern Frameworks”。与载体应用共享数据虽然应用扩展的包内嵌在载体应用中,但是应用扩展和载体应用的安全域还是不一样的。默认情况下,应用扩展和载体应用是不能直接访问对方内容的。不过你可以通过数据共享来实现这个愿望。比如,你希望应用扩展和它的载体应用共享一个单一的大数据集。比如p r e r e n d e r e d a s s e t s。要实现数据共享,我们要使用Xcode或者开发者门户网站允许应用扩展和它的载体应用成为

6、一个应用组,然后在开发者门户网站中注册应用组,并指明在载体应用中使用该应用组。关于应用组的知识请查阅Entitlement Key Reference文档的Adding an App to an App Group章节。当你设置好应用组后,应用扩展和它的载体应用就可以通过NSUserDefaultsAPI共享访问用户的信息。我们可以使用initWithSuiteName:方法实例化一个N S U s e r D e f a u l t s对象,然后传入共享组的标示符。比如一个共享扩展,它或许会更新用户最近经常使用的共享账号,那么我们可以这样来写:% highlight swift %/ Cre

7、ate 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 users account. mySharedDefaultssetObject:theAccountName forKey:“lastAccountName“;% endh

8、ighlight %下图向我们展示了应用扩展和它的载体应用是如何通过共享容器实现数据共享的:重要提示:如果你的应用扩展使用NSURLSession类执行后台的上传下载任务时,你必须要设置一个共享容器。这样扩展和载体应用就可以访问到转换传输的数据。后台上传下载的更多知识请参阅 Performing Uploads and Downloads。如果你设置了共享容器,那么载体应用和它包含的扩展就可以对共享容器里的内容进行读写操作了。同时你还必须要对数据的操作进行同步,以避免数据损坏或出错。使用UIDocument类、Core Data或者SQLite可以帮助定位、协调操作共享容器中的内容。访问网页在

9、分享扩展(iOS与OS X平台)和Action扩展(iOS平台)中,一般都允许用户使用Safari浏览器执访问网页并通过执行JavaScript脚本将结果返回到扩展中。你也可以在你的扩展运行之前或执行完任务之后通过JavaScript文件修改网页内容。比如分享扩展,它可以帮助用户将网页上的内容分享到用户的社交网站上,或者iOS上的Action扩展可能会显示当前网页的指定翻译内容。如果要通过应用扩展访问网页并操作网页内容,那么需要遵循下面几个步骤:创建一个JavaScript文件,并申明一个全局对象,名为E x t e n s i o n P r e p r o c e s s i n g J

10、S并将其实例化。在应用扩展的属性列表文件中添加关键字N S E x t e n s i o n J a v a S c r i p t P r e p r o c e s s i n g F i l e,给Safari浏览器指明使用哪个JavaScript文件。在N S E x t e n s i o n A c t i v a t i o n R u l e字典中,将N S E x t e n s i o n A c t i v a t i o n S u p p o r t s W e b U R L W i t h M a x C o u n t赋值一个非零的值。(更多关于N S E x

11、 t e n s i o n A c t i v a t i o n R u l e字典的知识请参阅DeclaringSupported Data Types for a Share or Action Extension。)当你的应用扩展开始运行时,使用NSItemProvider类从JavaScript文件的返回值中获取结果。在iOS系统的应用扩展中,如果你希望当应用扩展执行完任务后实时更新网页内容,那么你要向JavaScript文件中传入内容。(在这一步中也使用N S I t e m P r o v i d e r类。)为了告知Safari你的应用扩展中包含一个JavaScript文件,

12、你需要在应用扩展的I n f o . p l i s t文件中,向N S E x t e n s i o n A t t r i b u t e s字典添加N S E x t e n s i o n J a v a S c r i p t P r e p r o c e s s i n g F i l e关键字来指明你的JavaScript文件。这个关键字的值就是你希望当你的应用扩展运行前,Safari要加载的JavaScript文件的名称。比如:N S E x t e n s i o n A t t r i b u t e s N S E x t e n s i o n J a v a S

13、c r i p t P r e p r o c e s s i n g F i l e M y J a v a S c r i p t F i l e 在iOS和OS X平台中,在你自定义的JavaScript类中可以定义一个r u n ( )函数,该函数就是Safari加载JavaScript文件的入口。在r u n ( )函数中,Safari提供了一个名为c o m p l e t i o n F u n c t i o n的参数,你可以使用键值对象的形式将结果传给应用扩展。在iOS平台中,你还可以定义一个f i n a l i z e ( )函数,当应用扩展在任务结束阶段调用c o m

14、p l e t e R e q u e s t R e t u r n i n g I t e m s : e x p i r a t i o n H a n d l e r : c o m p l e t i o n :方法时Safari会调用f i n a l i z e ( )函数。在该函数中,可以通过向c o m p l e t e R e q u e s t R e t u r n i n g I t e m s : e x p i r a t i o n H a n d l e r : c o m p l e t i o n :方法传值,来改变网页内容。比如,你的iOS应用扩展需要

15、基于一个网页URI启动,并且当它结束运行时改变网页的背景色,那么你需要这样写JavaScript代码:% highlight javascript %var MyExtensionJavaScriptClass = function() ;MyExtensionJavaScriptClass.prototype = run: function(arguments) / Pass the baseURI of thewebpage to the extension. pletionFunction(“baseURI“: document.baseURI); ,/ / N o t e t h a

16、t t h e f i n a l i z e f u n c t i o n i s o n l y a v a i l a b l e i n i O S .f i n a l i z e : f u n c t i o n ( a r g u m e n t s ) / / a r g u m e n t s c o n t a i n s t h e v a l u e t h e e x t e n s i o n p r o v i d e s i n N S E x t e n s i o n C o n t e x t c o m p l e t e R e q u e s t R e t u r n i n g I t e m s : e x p i r a t i o n H a n d l e r : c o m p l e t i o n : ./ / I n t h i s e x a m

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号