NSAppTransportSecurity (對應(yīng)的值為字典類型)被用來定義 app 在進(jìn)行網(wǎng)絡(luò)請求時(shí)的安全設(shè)定:為現(xiàn)有安全機(jī)制設(shè)定特例,或者開啟新的安全特性。
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的綠春網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
在蘋果的開發(fā)平臺(tái)上,有一種被稱為 App Transport Security(ATS) 的網(wǎng)絡(luò)安全機(jī)制,適用于 app 以及 app extension,默認(rèn)開啟。這項(xiàng)機(jī)制確保 app 在進(jìn)行網(wǎng)絡(luò)訪問時(shí),使用業(yè)界標(biāo)準(zhǔn)的,沒有已知重大安全隱患的協(xié)議和加密方式,以此確保用戶的隱私和數(shù)據(jù)完整性。從而培養(yǎng)用戶對您的 app 的信任。
通過在 info.plist 中配置這個(gè)鍵,開發(fā)者可以自定義網(wǎng)絡(luò)安全策略。例如:
對 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)默認(rèn)開啟, NSAllowsArbitraryLoads 是字典 NSAppTransportSecurity 的根鍵,默認(rèn)值 NO 。
在啟用 ATS 的情況下,所有的 HTTP 請求必須為 HTTPS( RFC 2818 ) 連接。任何不安全的 HTTP 請求都將失敗。ATS 使用 TLS(Transport Layer Security)v1.2( RFC 5246 )。更多關(guān)于安全連接的信息,請查閱 HTTPS Server Trust Evaluation 。
下面是字典 NSAppTransportSecurity 的總體結(jié)構(gòu),所有鍵都是非必填項(xiàng):
可以看出,所有鍵可以分為兩類:主鍵,這些鍵用來定義 app 的總體 ATS 策略;子鍵,即 NSExceptionDomains 下面的鍵,使用這些鍵針對某個(gè)域名單獨(dú)配置。
主鍵包括:
閱讀 表2 ,獲取關(guān)于上述主鍵的詳細(xì)信息。
所有的子鍵都屬于 NSExceptionDomain 。向 Info.plist 中添加這一主鍵:
例如,及時(shí)之前設(shè)置 NSAllowsArbitraryLoadsInMedia 為 YES,然而 NSExceptionDomain 所代表的域名依然不能訪問不安全的媒體內(nèi)容。
基于這樣的設(shè)定,可以針對域名進(jìn)行 ATS 配置,增加或減少安全措施。例如:
還參考 Certificate Transparency ,保證訪問特定域名時(shí)的安全,詳情見 Certificate Transparency 。
NSExceptionDomains 字典構(gòu)成:
閱讀 表3 ,獲取關(guān)于 NSExceptionDomains 的進(jìn)一步詳細(xì)信息。
NSURLSession 以及所有與其相關(guān)的 API 都實(shí)現(xiàn)了對 ATS 的支持;如果您的 app 基于 iOS9.0 SDK 或 OS X v10.11 SDK 以上版本開發(fā),ATS 自動(dòng)開啟。(較老的 NSURLConnection 同樣會(huì)在上述 SDK 中開啟對 ATS 的支持。)然而,在使用底層網(wǎng)絡(luò) API 或第三方網(wǎng)絡(luò)庫時(shí),無法受到 ATS 的保護(hù)。
iOS9.0 或 OS X v10.11 以下版本,不支持 ATS, NSAppTransportSecurity 會(huì)被操作系統(tǒng)忽略。當(dāng) ATS 不可用時(shí),系統(tǒng)將根據(jù) RFC 2818 提供標(biāo)準(zhǔn)的 HTTPS 安全策略,對服務(wù)端進(jìn)行驗(yàn)證。
當(dāng)您的 app 運(yùn)行在 iOS9.0 或者 OS X v10.11以下時(shí),網(wǎng)絡(luò)連接仍然可用,但 ATS 不起作用。
ATS 只針對 公共域名 起效。ATS 對已下連接無效:
為了連接非法域名或本地域名,需要將 NSAllowsLocalNetworking 設(shè)置為 YES。
在 ATS 完全開啟的情況下,系統(tǒng)要求 app 的 HTTPS 連接必須滿足以下要求:
上面的標(biāo)準(zhǔn),未來可能會(huì)發(fā)生變化。但不會(huì)影響到 app 二進(jìn)制包的兼容性。
暫略
能否自行改寫服務(wù)器授信校驗(yàn)規(guī)則,取決于 ATS 是否針對某個(gè)域名開啟。解釋如下:
某些對 ATS 的配置會(huì)引發(fā) App Store 的審核,開發(fā)者必須說明原因。這些鍵有:
以下是一些原因說明例子,供參考:
向 App Store 提交審核時(shí),開發(fā)者應(yīng)主動(dòng)提供足夠的信息,以便解釋 app 無法使用安全連接的原因。
表2列出了 NSAppTransportSecurity 字典所有主鍵信息,通過定義這些主鍵,開發(fā)者可以配置 app 的網(wǎng)絡(luò)行為。同 NSExceptionDomains 相關(guān)的子鍵信息請查看表3。
表2 ATS 字典主鍵
表3列舉了用來針對某個(gè)域名進(jìn)行網(wǎng)絡(luò)安全配置所使用的鍵。
表3 針對某個(gè)域名進(jìn)行網(wǎng)絡(luò)安全配置的子鍵
下面介紹 NSAppTransportSecurity 的常見配置:
不影響整體 ATS 策略,只針對特定服務(wù)器進(jìn)行不安全的網(wǎng)絡(luò)請求——例如,從圖片服務(wù)器請求圖片——可在 Info.plist 中做如下配置:
重要: 使用上述配置之前,請注意其可能帶來的潛在威脅。例如,通過 HTTP 連接從服務(wù)器獲取媒體資源,可能帶來如下風(fēng)險(xiǎn):
不影響整體 ATS 策略,只針對特定服務(wù)器降低 HTTPS 的安全等級——包括使用較老版本的 TLS / SSL 協(xié)議,不支持正向保密——可在 Info.plist 中做如下配置:
假設(shè)正在開發(fā)一款瀏覽器應(yīng)用,需要能夠讓用戶訪問任意 URL。這種情況下,開發(fā)者應(yīng)該針對受控服務(wù)器使用安全連接,例如用于發(fā)布 app 更新的服務(wù)器。
為了能夠讓針對受控服務(wù)器的訪問享受 ATS 保護(hù),同時(shí)保證其他不安全訪問可用,可在 Info.plist 中做如下配置:
暫略
暫略
前兩天,在適配 HTTPS 時(shí),由于我們的測試環(huán)境服務(wù)器沒有啟用 HTTPS,只有正式環(huán)境的服務(wù)器啟用了 HTTPS ,所以在項(xiàng)目中需要針對不同環(huán)境做不同的 ATS 配置處理。這個(gè)配置也涉及到 info.plist 中 ATS 相關(guān)屬性的修改,這也就引出了 info.plist 是否可以動(dòng)態(tài)配置的問題了。
一開始,我想 info.plist 本質(zhì)上是一個(gè) XML 文件,那么 XML文件中可不可以通過 #ifdef DEBUG 宏定義來動(dòng)態(tài)配置呢?然后我就嘗試了一下這種做法,結(jié)果編譯不通過。實(shí)踐證明此方法不可行。
然后,我又想 build setting 中不是可以分別設(shè)置 debug 和 release 模式下的一些參數(shù)么,于是到 build setting 中搜索了一下 info.plist,沒想到還真有這個(gè)模塊,release 和 debug 模式的默認(rèn)值都是 info.plist。
接下來,我自己也復(fù)制了一個(gè) info.plist,并改名 infoDebug.plist,然后修改了一些針對 debug 模式的參數(shù),最后回到 build setting 中,將對應(yīng)的選項(xiàng)值改為 infoDebug.plist,Command+B 編譯一下之后,大功告成!
除此之外,如果我們?nèi)绻枰獎(jiǎng)討B(tài)配置開發(fā)或者生產(chǎn)網(wǎng)絡(luò)環(huán)境, 以及在多項(xiàng)目和運(yùn)行中切換環(huán)境,可以借助 Xcode 配置文件 xcconfig 來實(shí)現(xiàn)。
由于對某款app的租房信息的篩選條件不滿意,所以爬取了它的api以便能夠根據(jù)自己的需求進(jìn)行篩選。根據(jù)自己的初級爬蟲經(jīng)驗(yàn),為了防止app封禁我的ip,所以準(zhǔn)備通過代理服務(wù)器去訪問。
過程是相當(dāng)糾結(jié)啊,嘗試的太多,這里就只放結(jié)論了。
筆者使用的 URLSession ,初始化前配置 URLSessionConfiguration 對象的 connectionProxyDictionary 即可。
特別提醒: host 類型為 String , 而 port 類型為 Int .
ps:使用http時(shí),需要添加ATS白名單
注: 兩種代理方式貌似不能同時(shí)使用。不確定是因?yàn)槲覝y試時(shí)上一秒代理還好好的,下一秒就掛了。
一般服務(wù)器對于爬蟲是不歡迎的。真正的用戶操作再快都需要一定的時(shí)間,而爬蟲訪問時(shí)間很短,因此相當(dāng)規(guī)模的爬蟲對服務(wù)器造成的負(fù)擔(dān)就更大。所以服務(wù)器會(huì)對爬蟲做檢測,如果被抓到則可能被封掉ip或像本例一樣返回其他網(wǎng)站。
針對檢測,我們的做法就是要偽裝成真正的用戶。以筆者目前的理解有兩點(diǎn):
1. 修改請求頭。通過Charles抓包可以看到一次請求的頭部信息,對照修改
2. 設(shè)定訪問延時(shí)。手速再快你也快不過自動(dòng)運(yùn)行的程序吧。
參考鏈接:
ps: 一個(gè)不錯(cuò)的爬蟲學(xué)習(xí)系列
過程中遇到最多的就是1200錯(cuò)誤碼:無法與服務(wù)器建立安全連接。網(wǎng)上大多數(shù)意見是服務(wù)器SSL版本不夠,因?yàn)閕OS最低要求使用TLSv1.2的版本。對于更低一點(diǎn)的,就需要特別指定版本。( 由于我這里是代理字典https key用錯(cuò)了,才導(dǎo)致的1200。所以只能先在這mark一下 )
以下是網(wǎng)上給出的解決方法:
這是一個(gè)測試TLS的控制臺(tái)命令:
nscurl --ats-diagnostics --verbose
這里能自動(dòng)測試哪種key能通過,隨便找個(gè)https的網(wǎng)站試一下吧。
附上 connectionProxyDictionary keys 參見 Table 3-7
App Transport Security應(yīng)用程序傳輸安全機(jī)制
iOS 9起蘋果就開始推薦使用HTTPS,iOS 9中默認(rèn)是禁止非HTTPS的協(xié)議來訪問網(wǎng)絡(luò)的.
2017年1月1日起蘋果提出所有新提交的App默認(rèn)不允許使用NSAllowsArbitraryLoads來繞過ATS的限制。
也就是說強(qiáng)制我們用HTTPS,
是從哪里買的或者是使用限時(shí)免費(fèi)版只要符合蘋果官方的證書要求,具體要求參考: Apple-NSAppTransportSecurity 。那么什么都不要設(shè)置,只需要啟用項(xiàng)目的ATS,就可以HTTPS請求了。。
如果還想添加其它只支持HTTP的請求,按前面Exception Domains的設(shè)置即可。
會(huì),以下是方法:
在Plugins下新建文件(在Plugins上右鍵-new file選擇Objective-c class)輸入名字(CDVMyPlugin) next……
這世間你會(huì)發(fā)現(xiàn)在Plugins下面有兩個(gè)文件,分別是:CDVMyPlugin.h和CDVMyPlugin.m
CDVMyPlugin.h內(nèi)容:
#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內(nèi)容
#import "CDVMyPlugin.h"
@implementation CDVMyPlugin
@synthesize callbackID;
-(void)print:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
{
// 這是classid,在下面的PluginResult進(jìn)行數(shù)據(jù)的返回時(shí),將會(huì)用到它
self.callbackID = [arguments pop];
// 得到Javascript端發(fā)送過來的字符串
NSString *stringObtainedFromJavascript = [arguments objectAtIndex:0];
// 創(chuàng)建我們要返回給js端的字符串
NSMutableString *stringToReturn = [NSMutableString stringWithString: @"我是返回的:"];
[stringToReturn appendString: stringObtainedFromJavascript];
// Create Plugin Result
CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString: stringToReturn];
NSLog(@ "%@",stringToReturn);
// 檢查發(fā)送過來的字符串是否等于"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封裝通用調(diào)用方法
//調(diào)用IOS方法插件
var MyIOSPlugin = {
/**
* 調(diào)用IOS方法
* @param method 要調(diào)用IOS插件的方法名
* @param parameter 參數(shù)[數(shù)組]
* @param success 成功回調(diào)
* @param fail 失敗回調(diào)
* @returns {*}
*/
nativeFunction: function(method, parameter, success, fail) {
return Cordova.exec(success, fail, "MyPlugin", method, parameter);
}
};
JS調(diào)用
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
新聞名稱:ios開發(fā)ats,iOS開發(fā)者賬號多少錢
文章出自:http://m.rwnh.cn/article0/dsdhhoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、云服務(wù)器、品牌網(wǎng)站制作、Google、企業(yè)建站、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)