新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
NSAppTransportSecurity (对应的值为字典类型)被用来定义 app 在进行网络请求时的安全设定:为现有安全机制设定特例,或者开启新的安全特性。
创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站设计、成都网站制作、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的绿春网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
在苹果的开发平台上,有一种被称为 App Transport Security(ATS) 的网络安全机制,适用于 app 以及 app extension,默认开启。这项机制确保 app 在进行网络访问时,使用业界标准的,没有已知重大安全隐患的协议和加密方式,以此确保用户的隐私和数据完整性。从而培养用户对您的 app 的信任。
通过在 info.plist 中配置这个键,开发者可以自定义网络安全策略。例如:
对 NSAppTransportSecurity 的支持自 iOS9.0,OS X v10.11 开始,适用于 app 和 app extension。
自 iOS10.0,macOS 10.12 开始,增加了对下列子键的支持:
对于使用 iOS9.0, OS X v10.11 SDK 及以上的 app 来说,ATS(App Transport Security)默认开启, NSAllowsArbitraryLoads 是字典 NSAppTransportSecurity 的根键,默认值 NO 。
在启用 ATS 的情况下,所有的 HTTP 请求必须为 HTTPS( RFC 2818 ) 连接。任何不安全的 HTTP 请求都将失败。ATS 使用 TLS(Transport Layer Security)v1.2( RFC 5246 )。更多关于安全连接的信息,请查阅 HTTPS Server Trust Evaluation 。
下面是字典 NSAppTransportSecurity 的总体结构,所有键都是非必填项:
可以看出,所有键可以分为两类:主键,这些键用来定义 app 的总体 ATS 策略;子键,即 NSExceptionDomains 下面的键,使用这些键针对某个域名单独配置。
主键包括:
阅读 表2 ,获取关于上述主键的详细信息。
所有的子键都属于 NSExceptionDomain 。向 Info.plist 中添加这一主键:
例如,及时之前设置 NSAllowsArbitraryLoadsInMedia 为 YES,然而 NSExceptionDomain 所代表的域名依然不能访问不安全的媒体内容。
基于这样的设定,可以针对域名进行 ATS 配置,增加或减少安全措施。例如:
还参考 Certificate Transparency ,保证访问特定域名时的安全,详情见 Certificate Transparency 。
NSExceptionDomains 字典构成:
阅读 表3 ,获取关于 NSExceptionDomains 的进一步详细信息。
NSURLSession 以及所有与其相关的 API 都实现了对 ATS 的支持;如果您的 app 基于 iOS9.0 SDK 或 OS X v10.11 SDK 以上版本开发,ATS 自动开启。(较老的 NSURLConnection 同样会在上述 SDK 中开启对 ATS 的支持。)然而,在使用底层网络 API 或第三方网络库时,无法受到 ATS 的保护。
iOS9.0 或 OS X v10.11 以下版本,不支持 ATS, NSAppTransportSecurity 会被操作系统忽略。当 ATS 不可用时,系统将根据 RFC 2818 提供标准的 HTTPS 安全策略,对服务端进行验证。
当您的 app 运行在 iOS9.0 或者 OS X v10.11以下时,网络连接仍然可用,但 ATS 不起作用。
ATS 只针对 公共域名 起效。ATS 对已下连接无效:
为了连接非法域名或本地域名,需要将 NSAllowsLocalNetworking 设置为 YES。
在 ATS 完全开启的情况下,系统要求 app 的 HTTPS 连接必须满足以下要求:
上面的标准,未来可能会发生变化。但不会影响到 app 二进制包的兼容性。
暂略
能否自行改写服务器授信校验规则,取决于 ATS 是否针对某个域名开启。解释如下:
某些对 ATS 的配置会引发 App Store 的审核,开发者必须说明原因。这些键有:
以下是一些原因说明例子,供参考:
向 App Store 提交审核时,开发者应主动提供足够的信息,以便解释 app 无法使用安全连接的原因。
表2列出了 NSAppTransportSecurity 字典所有主键信息,通过定义这些主键,开发者可以配置 app 的网络行为。同 NSExceptionDomains 相关的子键信息请查看表3。
表2 ATS 字典主键
表3列举了用来针对某个域名进行网络安全配置所使用的键。
表3 针对某个域名进行网络安全配置的子键
下面介绍 NSAppTransportSecurity 的常见配置:
不影响整体 ATS 策略,只针对特定服务器进行不安全的网络请求——例如,从图片服务器请求图片——可在 Info.plist 中做如下配置:
重要: 使用上述配置之前,请注意其可能带来的潜在威胁。例如,通过 HTTP 连接从服务器获取媒体资源,可能带来如下风险:
不影响整体 ATS 策略,只针对特定服务器降低 HTTPS 的安全等级——包括使用较老版本的 TLS / SSL 协议,不支持正向保密——可在 Info.plist 中做如下配置:
假设正在开发一款浏览器应用,需要能够让用户访问任意 URL。这种情况下,开发者应该针对受控服务器使用安全连接,例如用于发布 app 更新的服务器。
为了能够让针对受控服务器的访问享受 ATS 保护,同时保证其他不安全访问可用,可在 Info.plist 中做如下配置:
暂略
暂略
前两天,在适配 HTTPS 时,由于我们的测试环境服务器没有启用 HTTPS,只有正式环境的服务器启用了 HTTPS ,所以在项目中需要针对不同环境做不同的 ATS 配置处理。这个配置也涉及到 info.plist 中 ATS 相关属性的修改,这也就引出了 info.plist 是否可以动态配置的问题了。
一开始,我想 info.plist 本质上是一个 XML 文件,那么 XML文件中可不可以通过 #ifdef DEBUG 宏定义来动态配置呢?然后我就尝试了一下这种做法,结果编译不通过。实践证明此方法不可行。
然后,我又想 build setting 中不是可以分别设置 debug 和 release 模式下的一些参数么,于是到 build setting 中搜索了一下 info.plist,没想到还真有这个模块,release 和 debug 模式的默认值都是 info.plist。
接下来,我自己也复制了一个 info.plist,并改名 infoDebug.plist,然后修改了一些针对 debug 模式的参数,最后回到 build setting 中,将对应的选项值改为 infoDebug.plist,Command+B 编译一下之后,大功告成!
除此之外,如果我们如果需要动态配置开发或者生产网络环境, 以及在多项目和运行中切换环境,可以借助 Xcode 配置文件 xcconfig 来实现。
由于对某款app的租房信息的筛选条件不满意,所以爬取了它的api以便能够根据自己的需求进行筛选。根据自己的初级爬虫经验,为了防止app封禁我的ip,所以准备通过代理服务器去访问。
过程是相当纠结啊,尝试的太多,这里就只放结论了。
笔者使用的 URLSession ,初始化前配置 URLSessionConfiguration 对象的 connectionProxyDictionary 即可。
特别提醒: host 类型为 String , 而 port 类型为 Int .
ps:使用http时,需要添加ATS白名单
注: 两种代理方式貌似不能同时使用。不确定是因为我测试时上一秒代理还好好的,下一秒就挂了。
一般服务器对于爬虫是不欢迎的。真正的用户操作再快都需要一定的时间,而爬虫访问时间很短,因此相当规模的爬虫对服务器造成的负担就更大。所以服务器会对爬虫做检测,如果被抓到则可能被封掉ip或像本例一样返回其他网站。
针对检测,我们的做法就是要伪装成真正的用户。以笔者目前的理解有两点:
1. 修改请求头。通过Charles抓包可以看到一次请求的头部信息,对照修改
2. 设定访问延时。手速再快你也快不过自动运行的程序吧。
参考链接:
ps: 一个不错的爬虫学习系列
过程中遇到最多的就是1200错误码:无法与服务器建立安全连接。网上大多数意见是服务器SSL版本不够,因为iOS最低要求使用TLSv1.2的版本。对于更低一点的,就需要特别指定版本。( 由于我这里是代理字典https key用错了,才导致的1200。所以只能先在这mark一下 )
以下是网上给出的解决方法:
这是一个测试TLS的控制台命令:
nscurl --ats-diagnostics --verbose
这里能自动测试哪种key能通过,随便找个https的网站试一下吧。
附上 connectionProxyDictionary keys 参见 Table 3-7
App Transport Security应用程序传输安全机制
iOS 9起苹果就开始推荐使用HTTPS,iOS 9中默认是禁止非HTTPS的协议来访问网络的.
2017年1月1日起苹果提出所有新提交的App默认不允许使用NSAllowsArbitraryLoads来绕过ATS的限制。
也就是说强制我们用HTTPS,
是从哪里买的或者是使用限时免费版只要符合苹果官方的证书要求,具体要求参考: Apple-NSAppTransportSecurity 。那么什么都不要设置,只需要启用项目的ATS,就可以HTTPS请求了。。
如果还想添加其它只支持HTTP的请求,按前面Exception Domains的设置即可。
会,以下是方法:
在Plugins下新建文件(在Plugins上右键-new file选择Objective-c class)输入名字(CDVMyPlugin) next……
这世间你会发现在Plugins下面有两个文件,分别是:CDVMyPlugin.h和CDVMyPlugin.m
CDVMyPlugin.h内容:
#import Foundation/Foundation.h
#import Cordova/CDVPlugin.h
@interface CDVMyPlugin : CDVPlugin
@property (nonatomic, copy) NSString* callbackID;
// Instance Method
- (void) print:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
@end
CDVMyPlugin.m内容
#import "CDVMyPlugin.h"
@implementation CDVMyPlugin
@synthesize callbackID;
-(void)print:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
{
// 这是classid,在下面的PluginResult进行数据的返回时,将会用到它
self.callbackID = [arguments pop];
// 得到Javascript端发送过来的字符串
NSString *stringObtainedFromJavascript = [arguments objectAtIndex:0];
// 创建我们要返回给js端的字符串
NSMutableString *stringToReturn = [NSMutableString stringWithString: @"我是返回的:"];
[stringToReturn appendString: stringObtainedFromJavascript];
// Create Plugin Result
CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString: stringToReturn];
NSLog(@ "%@",stringToReturn);
// 检查发送过来的字符串是否等于"HelloWorld",如果不等,就以PluginResult的Error形式返回
if ([stringObtainedFromJavascript isEqualToString:@"HelloWorld"] == YES){
// Call the javascript success function
[self writeJavascript: [pluginResult toSuccessCallbackString:self.callbackID]];
} else{
// Call the javascript error function
[self writeJavascript: [pluginResult toErrorCallbackString:self.callbackID]];
}
}
JS封装通用调用方法
//调用IOS方法插件
var MyIOSPlugin = {
/**
* 调用IOS方法
* @param method 要调用IOS插件的方法名
* @param parameter 参数[数组]
* @param success 成功回调
* @param fail 失败回调
* @returns {*}
*/
nativeFunction: function(method, parameter, success, fail) {
return Cordova.exec(success, fail, "MyPlugin", method, parameter);
}
};
JS调用
MyIOSPlugin.nativeFunction("print",['HelloWorld'],
function(result) {
// alert("Success: \r\n"+result);
},
function(error) {
// alert("Error: \r\n"+error);
}
);
配置插件KEY-VALUE
feature name="MyPlugin"
param name="ios-package" value="CDVMyPlugin" /
/feature