总体思路
对于新版的 iOS 和 macOS,CocoaTouch 层级负责通讯的类是 NSURLSession
,如果需要通过代理访问网络,是需要指定其 configuration
属性,configuration
的类型是 NSURLSessionConfiguration
。
将 NSURLSessionConfiguration
的 connectionProxyDictionary
属性指定为相应的 Dictionary。
网上找到的代码
/**
* 代理设置
*/
- (NSURLSessionConfiguration *)setProxyWithConfig
{
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
config.connectionProxyDictionary = @
{
@"HTTPEnable":@YES,
(id)kCFStreamPropertyHTTPProxyHost:@"127.0.0.1",
(id)kCFStreamPropertyHTTPProxyPort:@80,
@"HTTPSEnable":@YES,
(id)kCFStreamPropertyHTTPSProxyHost:@"127.0.0.1",
(id)kCFStreamPropertyHTTPSProxyPort:@80
};
return config;
}
代码编译时会发现,kCFStreamPropertyHTTPProxyHost
等常量已经被标为 Deprecated,会有警告。
满足代码洁癖
根据帮助文件的描述,在 CFNetwork 的 Global Proxy Settings Constants 部分,查询到一些常量,用于取代 Deprecated 的常量。
值 | CFNetwork/CFProxySupport.h | CFNetwork/CFHTTPStream.h CFNetwork/CFSocketStream.h |
---|---|---|
@"HTTPEnable" |
kCFNetworkProxiesHTTPEnable |
N/A |
@"HTTPProxy" |
kCFNetworkProxiesHTTPProxy |
kCFStreamPropertyHTTPProxyHost |
@"HTTPPort" |
kCFNetworkProxiesHTTPPort |
kCFStreamPropertyHTTPProxyPort |
@"HTTPSEnable" |
kCFNetworkProxiesHTTPSEnable |
N/A |
@"HTTPSProxy" |
kCFNetworkProxiesHTTPSProxy |
kCFStreamPropertyHTTPSProxyHost |
@"HTTPSPort" |
kCFNetworkProxiesHTTPSPort |
kCFStreamPropertyHTTPSProxyPort |
@"SOCKSEnable" |
kCFNetworkProxiesSOCKSEnable |
N/A |
@"SOCKSProxy" |
kCFNetworkProxiesSOCKSProxy |
kCFStreamPropertySOCKSProxyHost |
@"SOCKSPort" |
kCFNetworkProxiesSOCKSPort |
kCFStreamPropertySOCKSProxyPort |
但是,由于 CFNetwork/CFProxySupport.h 中的有些常量,只标识为 macOS 可用,iOS 上是访问不到的,所以可以直接写为字符串常量。
config.connectionProxyDictionary = @
{
@"HTTPEnable": @YES,
@"HTTPProxy": @"127.0.0.1",
@"HTTPPort": @80,
@"HTTPSEnable": @YES,
@"HTTPSProxy": @"127.0.0.1",
@"HTTPSPort": @80,
@"SOCKSEnable": @YES,
@"SOCKSProxy": @"127.0.0.1",
@"SOCKSPort": @80
};
参考资料
(完)