大致有兩種做法,一種是檢測到有代理服務(wù)器碟婆,就不發(fā)送網(wǎng)絡(luò)請求;一種是不發(fā)送給代理服務(wù)器惕稻,而是正常發(fā)給目標(biāo)服務(wù)器竖共。
第一種,提供一個檢測當(dāng)前手機(jī)是否有開啟代理俺祠,剩下的工作根據(jù)業(yè)務(wù)去完成即可公给。
CFDictionaryRef dicRef = CFNetworkCopySystemProxySettings();
const CFStringRef proxyCFstr = CFDictionaryGetValue(dicRef, (const void*)kCFNetworkProxiesHTTPProxy);
NSString* proxy = (__bridgeNSString*)(proxyCFstr);
?if(proxy)returnYES;
?else return NO;????
第二種,因為NSURLSession實例化需要傳入NSURLSessionConfiguration對象蜘渣,config中有個屬性是connectionProxyDictionary淌铐,保存的是網(wǎng)絡(luò)會話連接中的代理服務(wù)器。所以宋梧,不走代理服務(wù)器只需要Hook系統(tǒng)方法匣沼,將此屬性置為空字典即可。
Method method1 = class_getClassMethod([NSURLSession class],@selector(sessionWithConfiguration:));
Method method2 = class_getClassMethod([NSURLSession class],@selector(hhz_sessionWithConfiguration:));
method_exchangeImplementations(method1, method2);
Method method3 = class_getClassMethod([NSURLSession class],@selector(sessionWithConfiguration:delegate:delegateQueue:));
Method method4 = class_getClassMethod([NSURLSession class],@selector(hhz_sessionWithConfiguration:delegate:delegateQueue:));
method_exchangeImplementations(method3, method4);
+ (NSURLSession*)hhz_sessionWithConfiguration:(NSURLSessionConfiguration*)configuration
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? delegate:(nullableid)delegate
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? delegateQueue:(nullableNSOperationQueue*)queue
{
? ? if(configuration) configuration.connectionProxyDictionary = @{};
? ? return [self hhz_sessionWithConfiguration:configuration delegate:delegate delegateQueue:queue];
}
+ (NSURLSession*)hhz_sessionWithConfiguration:(NSURLSessionConfiguration*)configuration
{
? ? if(configuration) configuration.connectionProxyDictionary = @{};
? ? return [self hhz_sessionWithConfiguration:configuration];
}
其中method替換可以抽離出方法捂龄,此處為了方便復(fù)制粘貼測試就沒處理释涛。然后根據(jù)項目需求加叁,提供相應(yīng)的open,close類方法即可實現(xiàn)實時打開關(guān)閉抓包設(shè)置唇撬。