藉助於 CFNetwork 在應用從後臺進入前臺時檢測是否設置代理,若是設置代理進行彈框提示web
+ (BOOL)getProxyStatus {
NSDictionary *proxySettings = NSMakeCollectable([(NSDictionary *)CFNetworkCopySystemProxySettings() autorelease]);
NSArray *proxies = NSMakeCollectable([(NSArray *)CFNetworkCopyProxiesForURL((CFURLRef)[NSURL URLWithString:@"http://www.baidu.com"], (CFDictionaryRef)proxySettings) autorelease]);
NSDictionary *settings = [proxies objectAtIndex:0];
NSLog(@"host=%@", [settings objectForKey:(NSString *)kCFProxyHostNameKey]);
NSLog(@"port=%@", [settings objectForKey:(NSString *)kCFProxyPortNumberKey]);
NSLog(@"type=%@", [settings objectForKey:(NSString *)kCFProxyTypeKey]);
if ([[settings objectForKey:(NSString *)kCFProxyTypeKey] isEqualToString:@"kCFProxyTypeNone"])
{
//沒有設置代理
return NO;
}
else
{
//設置代理了
return YES;
}
}
複製代碼
另外,對於autorelease,若是項目設置了ARC,能夠在Target-》Build Phase-》Compile Source中將相應的非ARC文件,
Compiler Flag改成-fno-objc-arc便可。
複製代碼
**考慮證書有效期的話就設置不一樣的 pinning mode **安全
SSL Pinning,即SSL證書綁定。經過SSL證書綁定來驗證服務器身份,防止應用被抓包。服務器
客戶端須要證書(Certification file), .cer格式的文件。能夠跟服務器端索取。 若是他們給個.pem文件,要使用命令行轉換:markdown
openssl x509 -inform PEM -in name.pem -outform DER -out name.cer
複製代碼
若是給了個.crt文件,請這樣轉換:網絡
openssl x509 -in name.crt -out name.cer -outform der
複製代碼
若是啥都不給你,你只能本身動手了:ui
openssl s_client -connect www.website.com:443 </dev/null 2>/dev/null | openssl x509 -outform DER > myWebsite.cer**
複製代碼
把生成的.cer證書文件直接拖到你項目的相關文件夾中,記得勾選Copy items if neede和Add to targets。spa
AFSecurityPolicy SSLPinningMode AFSecurityPolicy是AFNetworking中網絡通訊安全策略模塊。它提供三種SSL Pinning Mode ]命令行
AFSSLPinningModeNone:徹底信任服務器證書;
AFSSLPinningModePublicKey:只比對服務器證書和本地證書的Public Key是否一致,若是一致則信任服務器證書;
AFSSLPinningModeCertificate:比對服務器證書和本地證書的全部內容,徹底一致則信任服務器證書;
複製代碼
選擇那種模式呢?代理
AFSSLPinningModeCertificate:最安全的比對模式。可是也比較麻煩,由於證書是打包在APP中,若是服務器證書改變或者到期,舊版本沒法使用了,咱們就須要用戶更新APP來使用最新的證書。
AFSSLPinningModePublicKey:只比對證書的Public Key,只要Public Key沒有改變,證書的其餘變更都不會影響使用。
若是你不能保證你的用戶老是使用你的APP的最新版本,因此咱們使用AFSSLPinningModePublicKey。
複製代碼
+ (AFHTTPSessionManager *)manager
{
static AFHTTPSessionManager *manager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:config];
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey withPinnedCertificates:[AFSecurityPolicy certificatesInBundle:[NSBundle mainBundle]]];
manager.securityPolicy = securityPolicy;
});
return manager;
}
複製代碼