关于ios8 safari下载页面验证码无法显示该如何处理

App Extension编程指南(iOS8/OS X v10.10):常见问题的处理方案
招聘信息:
本节由CocoaChina翻译组成员DevTalking ( )翻译自苹果官方文档
一节,敬请勘误。欢迎加入我们的翻译小组,详情请参看:! &&
当编写自定义代码以执行app扩展任务时,你可能需要处理一些其他多种类型扩展也会出现的情况。在这一章节中,我们将帮助你如何应对和处理这些常见的问题。
使用内嵌框架共享代码
你可以创建一个内嵌框架,用于在应用扩展和它的主应用程序(containing app)之间共享代码。比如,你在照片编辑扩展中开发了图片滤镜功能,那么同时该扩展的containing app也有这个功能,那么你可以将实现该功能的代码封装成一个框架,并在扩展target和主应用程序target中嵌入这个框架。
你要确保你创建的内嵌框架不包含应用扩展不能使用的API。这类API一般使用unavailability宏来标记,比如像 NS_EXTENSION_UNAVAILABLE。
如果你创建的内嵌框架中包含应用扩展不能使用的API,你可将其安全地Link到containing app,它可以正常使用框架中的API,但是不能与应用扩展共享代码(译者注:也就是应用扩展不能使用该框架提供的所有API,继而无法做到代码共享)。如果你上传App Store的应用扩展中有这种框架,或者其他部分使用了不可用的API,那么审核时会被拒绝。
如果我们要想应用扩展使用内嵌框架,那么首先要配置一下。将target的Require Only App-Extension-Safe API选项设置为Yes。如果你不这样设置,那么Xcode会向你提示警告:linking against dylib not safe for use in application extensions。
重要提示:如果containing app要链接至内嵌框架,那么必须要支持arm64架构,否则在上传App Store时会被拒绝。(如&创建应用扩展&章节中介绍的,所有应用扩展都要支持arm64架构。)
在配置你的 Xcode 项目时,在 Build Phases 选项卡的 Copy Files 项中一定要将 Destination 设置为 Frameworks。
重要提示:我们通常要选择 Frameworks 作为 Copy Files build phase 目的地。如果你将其设置为 SharedFramework,那么上传App Store时会被拒绝的。
你可以让containing app支持iOS7或更早的版本,但当在iOS8或更新的版本中运行时,要特别注意内嵌框架的安全性。详细内容可以参阅
有关创建和使用内嵌框架的更多内容,请观看。
与Containing App共享数据
应用扩展和它的containing app的安全域是有区别的。即便扩展包是嵌套在containing app包中的。默认情况下,应用扩展和containing app是不能直接访问对方的容器的。
不过你可以通过数据共享来实现这个愿望。比如,你希望应用扩展和它的containing app共享一个单一的大数据集。比如prerendered assets。
要实现数据共享,我们要使用Xcode或者开发者门户网站允许应用扩展和它的containing app成为一个应用组,然后在开发者门户网站中注册应用组,并指明在containing app中使用该应用组。关于应用组的知识请查阅
当你设置好应用组后,应用扩展和它的containing app就可以通过
API共享访问用户的信息。我们可以使用 方法实例化一个 NSUserDefaults 对象,然后传入共享组的标示符。比如一个共享扩展,它或许会更新用户最近经常使用的共享账号,那么我们可以这样来写:
&NSUserDefaults&*mySharedDefaults&=&[[NSUserDefaults&alloc]&initWithSuiteName:@"com.example.domain.MyShareExtension"];&&&&&&[mySharedDefaults&setObject:theAccountName&forKey:@"lastAccountName"];&
下图向我们展示了应用扩展和它的containing app是如何通过共享容器实现数据共享的.
Figure 4-1应用扩展的容器与其containing app的容器是不同的。
重要提示:如果你的应用扩展使用NSURLSession类执行后台的上传下载任务时,你必须要设置一个共享容器,这样扩展和containing app就可以访问到转换传输的数据。后台上传下载的更多知识请参阅
如果你设置了共享容器,那么containing app和它包含的允许参与数据分享的扩展就可以对共享容器里的内容进行读写操作了。同时你还必须要对数据的操作进行同步,以避免数据损坏或出错。使用类、Core Data或者SQLite可以帮你可以让用户通过要求Safari运行JS文件来访问网络内容,并将结果返回到扩展。
在分享扩展(iOS与OS X平台)和Action扩展(iOS平台)中,一般都允许用户使用Safari浏览器访问网页并通过执行JavaScript脚本,并将结果返回到扩展中。你也可以在你的扩展运行之前(适用于两个平台)或执行完任务之后(仅适用于iOS平台)通过JavaScript文件修改网页内容。比如分享扩展,它可以帮助用户分享网页上的内容,或者iOS上的Action扩展可能会显示当前网页的指定翻译内容。
如果想添加网页访问和操作应用扩展,那么需要遵循下面几个步骤:
1.创建一个JavaScript文件,并申明一个全局对象,命名为 ExtensionPreprocessingJS,并为该对象分配一个新的自定义JavaScript类的实例。
2.在应用扩展的属性列表文件中添加关键字 NSExtensionJavaScriptPreprocessingFile,给 Safari 浏览器指明使用哪个 JavaScript 文件。
3.在NSExtensionActivationRule字典中,将 NSExtensionActivationSupportsWebURLWithMaxCount 赋值一个非零的值。(更多关于 NSExtensionActivationRule 字典的知识请参阅 。)
4.当你的应用扩展开始运行时,使用类获得运行JavaScript文件所返回的结果。
5.在iOS系统的应用扩展中,如果你希望Safari在扩展执行完任务后更新网页,那么你要向JavaScript文件中传入值。(在这一步中也使用NSItemProvider类。)
为了告知Safari你的应用扩展中包含一个JavaScript文件,你需要在应用扩展的Info.plist文件中,向NSExtensionAttributes字典添加NSExtensionJavaScriptPreprocessingFile关键字来指明你的JavaScript文件。这个关键字的值就是你希望当你的应用扩展运行前,Safari要加载的JavaScript文件的名称。比如:
NSExtensionAttributes&&&&&&&&&&&&&&NSExtensionJavaScriptPreprocessingFile&&&&&&&&&MyJavaScriptFile&&&&&&
在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)&{&&&&&&&&&&&&&&pletionFunction({"baseURI":&document.baseURI});&&&&&},&&&&&&&&&&&&finalize:&function(arguments)&{&&&&&&&&&&&&&&&document.body.style.backgroundColor&=&arguments["bgColor"];&&&&&}&};&&&&var&ExtensionPreprocessingJS&=&new&MyExtensionJavaScriptC&
在iOS和OS X平台中,你需要编写代码来处理fun()函数返回的值,为获取到字典中的值,我们需要指定kUTTypePropertyList类型作为标示符传入NSItemProvider类的
方法。在该字典中使用 NSExtensionJavaScriptPreprocessingResultsKey 作为key来取值。比如下面例子中我们想要获取将 URI 传入 run() 的返回值:
[imageProvider&loadItemForTypeIdentifier:kUTTypePropertyList&options:nil&completionHandler:^(NSDictionary&*item,&NSError&*error)&{&NSDictionary&*results&=&(NSDictionary&*)&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系统中,如果你的应用扩展在执行完后台任务时并没有在运行,那么系统会自动在后台运行扩展的载体应用,并调用代理方法。
重要提示:如果你的应用扩展在后台创建了 NSURLSession 任务,那么你必须要设置一个共享容器,以确保扩展和载体应用实现数据共享。我们可以在 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&];&&&&&&&&&&&&&&&&&&config.sharedContainerIdentifier&=&@&com.mycompany.myappgroupidentifier&;&&&&&&&&&mySession&=&[NSURLSession&sessionWithConfiguration:config&delegate:self&delegateQueue:nil];&&&&&}&&&&&return&myS&}&
因为在单位时间内只能由一个进程使用后台会话,所以你需要为载体应用中的所有扩展创建不同的后台会话(每个后台会话都要有一个唯一的标示符)。在这里我们建议当载体应用在后台处理扩展的任务时,只使用一个该扩展创建的后台会话。如果你要执行其他的网络相关的任务,那么就要创建相应的URL会话。
如果你需要在后台创建URL会话之前完成主叫应用的请求,那么要确保创建和使用会话的代码是有效可执行的。当你的扩展调用 方法告知主叫应用已经完成相关请求后,系统就可以随时终止你的应用扩展。
为分享和Action扩展申明支持的数据类型
在你的分享或Action扩展中,在它们的工作中可能会使用到一些数据,并且这些数据的类型各不相同。为了确保只有当用户在主叫应用中选择了你的扩展支持的数据类型时,才会展示你的扩展功能。你需要在扩展的属性列表文件中添加 NSExtensionActivationRule 关键字。你也可以使用该关键字指定扩展处理每种类型的最大数目。当你的应用扩展运行时,系统会用改关键字的值与扩展数据项的属性值作比较。关于 NSExtensionActivationRule 关键字的详细信息可以参阅
比如,你可以申明你的分享扩展支持最大处理10张图片,一部影片和一个网站URL。你可以参考下面的写法:
NSExtensionAttributes&&&&&&&&&&&&&&NSExtensionActivationRule&&&&&&&&&&&&&&&&&&&&&&NSExtensionActivationSupportsImageWithMaxCount&&&&&&&&&&&&&10&&&&&&&&&&&&&NSExtensionActivationSupportsMovieWithMaxCount&&&&&&&&&&&&&1&&&&&&&&&&&&&NSExtensionActivationSupportsWebURLWithMaxCount&&&&&&&&&&&&&1&&&&&&&&&&&&&&&
如果你想指定不支持的数据类型,那么你可以将该类型的值设置为0,或者在 NSExtensionActivationRule 中不添加该类型即可。
提示:如果你的分享扩展或iOS中的Action扩展需要访问网页,那你必须要确保 NSExtensionActivationSupportsWebURLWithMaxCount 关键字的值不为0(更多关于在应用扩展中通过JavaScript访问网页的内容请参阅
你也可以使用
定义的 UTI子 类型以便数据检测器检测文本信息,比如电话号码或通讯地址。
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之后的版本中使用,即便内嵌框架不支持老版本的系统也没关系。
使载体应用能做到上述这一点的是 dlopen 命令,它可以使你使用条件链接和加载框架包的机制。你可以使用这个命令来代替编译时链接,你可以在 Xcode 的 General 选项或 Build Phases 选项中对该命令进行编辑。其原理就是只有当载体应用在 iOS8.0 或更高的版本中运行时,才会链接使用内嵌框架。
重要提示:如果你的载体应用使用了内嵌框架,那么就必须要支持arm64架构,否则会被App Store拒绝。
设置Xcode项目中应用扩展的条件链接
1.将每一个应用扩展的运行系统版本设置为iOS8.0或更高,通常选中Xcode中的target,在General选项中设置Deployment info。
2.将你载体应用的运行系统版本设置为你想支持的最低iOS版本。
3.在你的载体应用中,通过
方法,在运行时检查判断iOS的版本,并判断是否执行dlopen命令。只有你的载体应用在iOS8.0或更高的版本中运行时才会指定dlopen命令。
特定的iOS API通过dlopen命令使用内嵌框架。你必须选择性的使用这些API,就像使用 dlopen 命令时那样。这些API都是
的封装类型:
还有来自NSBundle类的方法:
因为你一般会将载体应用的运行系统版本配置为较低的版本,所以这些API通常都是在运行时检查,只有确保载体应用在iOS8.0或更高版本中运行时才会使用这些API。
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
点击量7581点击量6182点击量6097点击量5417点击量4783点击量4418点击量4186点击量3627点击量3416
&2015 Chukong Technologies,Inc.
京公网安备89中国第一军事门户网站 | &>&&>&
苹果iOS8放开浏览器限制 Safari不再享特权
苹果放开对第三方浏览器限制 Safari不再独享特权
原标题:苹果iOS 8放开对第三方浏览器限制 Safari不再独享特权
6月5日消息,据国外媒体报道,苹果将停止为Safari浏览器
来 自 西 陆 军 事
苹果放开对第三方浏览器限制 Safari不再独享特权
原标题:苹果iOS 8放开对第三方浏览器限制 Safari不再独享特权
6月5日消息,据国外媒体报道,苹果将停止为Safari浏览器保留特权,在推出iOS
8推出后,开发者只要使用苹果最新的WebKit编程接口,所有应用程序都可使用Safari浏览器的JavaScript引擎。这意味着第三方浏览器将和Safari一样快。
据了解,WebKit软件是苹果多年来用于显示Web页面和Web应用程序的软件。WebKit是Safari的核心,但苹果还为iOS 7提供一个其他应用程序也可使用的单独版本。
因苹果禁止任何自带浏览器引擎在iOS使用,所以这个单独版本能够方便开发人员基于Web技术(如JavaScript或HTML)来创建界面,并且它对于Google的Chrome浏览器以及Opera Coast浏览器都是至关重要的。
但是,这样的情况给第三方开发商带来了痛处。相比第三方软件使用的WebKit,苹果Safari会以更快的速度运行JavaScript。但在周一的苹果全球开发者大会上,WebKit工程师Anders Carlsson表示,这样的情况不会在iOS 8上出现。
Opera Coast项目负责人休布?克莱豪特(Huib
Kleinhout)表示,这是一件很有前景的事情。对Javascript的改进只会在浏览大量使用这种技术的网站时才会被人注意到,但克莱豪特认为, 其他调整将对稳定性的改善起到广泛影响,而且不必继续使用之前的一些变通方式。
无论是对Chrome和Opera等与Safari竞争的浏览器来说,还是对Twitter和Facebook等需要展示大量网络内容的应用而言,此事都事关重大。
苹果的开放态度受到了开发者的普遍欢迎,但有开发者指出,iOS还存在一个缺点,即Safari之外的其他浏览器无法设置为网页的默认浏览器。
本栏目最新文章
国家领导人在任时,往往公务繁重,退休之后不再承担具...
热门关键词IOS8 Safari向左滑动关闭已打开网页_iphone技巧_ARP联盟
您当前的位置→
&&&&&&&&&&&&当前位置:&&ipad3Safari无法显示图片怎么办
ipad3Safari无法显示图片怎么办
|作者:SORA|来源:265G
&&& 很多用户在使用苹果iPad2的Safari浏览器浏览网页时发现无法显示图片,观看视频提示需要开启浏览器的javascript支持。下面让我们看看如何解决这个问题。开启浏览器的javascript支持功能点击iPad2主屏幕上的的“设置”清除缓存历史记录过多,也会造成打开网页速度慢、从而引发图片显示慢,我们误导为打不开的现象在ipad2的主界面点击“设置”然后再点击“清除Cookie和数据”,提示“这将清除可用于跟踪的数据,但这些数据也被网站用于保留登录信息及加快浏览速度”,点击“清除”还原所有设置如果还是不行,那只有最后一招了。在ipad2的主界面点击“设置”
查iphone报价,看iphone最新消息,尽在265G苹果网官方微信
扫描左侧二维码即可添加265G苹果网官方微信您也可以在微信上搜索“265G苹果网”或“iphone265g”,获取更多数码资讯。
24日23日23日23日23日
3月26日下午2点,努比亚在北京演艺中心发布努比亚Z9系列三款新机!
是游戏网推出的一款专门为热衷手机网游用户量身定制的游戏助手。
推荐点击榜> Safari打不开网页因为服务器已停止响应的解决办法
Safari打不开网页因为服务器已停止响应的解决办法
分享给小伙伴们看看:
关注我们:
safari是苹果iOS设备内置的浏览器,在打开网页时经常会出现safari打不开网页因为服务器已停止响应提示,导致这种问题主要是网络不稳定或者没有网络导致。以下是相关解决办法。
很多果粉朋友在使用Safari留言网页的时候,可能都遇到过&Safari打不开网页因为服务器已停止响应&的故障提示。那么这种故障是什么原因导致的,又该如何解决呢?下面百事网小编为大家详细介绍下。
Safari打不开网页因为服务器已停止响应的原因
导致Safari浏览器出现&打不开网页是因为服务器已停止响应&的原因主要由于iOS设别无网络或者网络不稳定导致,解决办法如下。
1、点击网址栏后面的刷新按钮,刷新网页试试;
2、检查Wifi网络是否可用
如果刷新网页,依旧打不开网页,提示Safari打不开网页因为服务器已停止响应的话,那么可能是网络故障导致;
如果连接的是Wifi网络,那么可以先断开,再次连接试试;
也可以关闭Wifi再打开了即可。
3、关闭Wifi,试试使用移动网络,有时候可能Wifi网络不可用,您可以试试开启手机移动网络,再刷新网页试试,一般即可解决办法。
safari是苹果iOS设备内置的浏览器,在打开网页时经常会出现safari打不开网页因为服务器已停止响应提示,导致这种问题主要是网络不稳定或者没有网络导致,最简单的解决方法就是重新刷新一下网络试试或者检查网络问题。
月度 | 年度阅读排行}

我要回帖

更多关于 ios8 safari 问题 的文章

更多推荐

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

点击添加站长微信