IPhone Objective-C HTTP代理那些破事
来源:互联网 发布:php微信扫码登录demo 编辑:程序博客网 时间:2024/05/17 07:06
设置HTTP代理,在一些优秀的开源或商业的httpClient库,应该是很容易的事,但不包括苹果CFNetwork 和URLSession2、URLSession HTTP代理设置
1、CFNetwrok HTTP代理设置
首先你要分开CFHTTPMessageRef 和 CFReadStreamRef 这两个,对于HTTP的一些常规设置,有的需要配置前者,有的需要配置后者。HTTP代理设置就配置后者CFReadStreamRef。
代理设置代码也很简单,但要区分HTTP请求还是HTTPS请求,关键字kCFStreamPropertyHTTPProxy
NSDictionary *proxyToUse = nil; if (scheme_is_https) //HTTPS 代理设置 { proxyToUse = @{(__bridge NSString*)kCFStreamPropertyHTTPSProxyHost:@"agent.server.cn", (__bridge NSString*)kCFStreamPropertyHTTPSProxyPort:[NSNumber numberWithInt:8443] }; } else //HTTP代理设置 { proxyToUse = @{(__bridge NSString*)kCFStreamPropertyHTTPProxyHost:@"agent.server.cn", (__bridge NSString*)kCFStreamPropertyHTTPProxyPort:[NSNumber numberWithInt:8080] }; if (proxyToUse) {//设置代理host port CFReadStreamSetProperty(readStream, kCFStreamPropertyHTTPProxy, (__bridge CFDictionaryRef)proxyToUse); }
需要注意的是,kCFStreamPropertyHTTPProxy必须要对应一个host和port的字典,你要是分别设置host和port,是不生效的,运行时也不报错。下面的设置就是错误的
CFReadStreamSetProperty(readStream, kCFStreamPropertyHTTPProxyHost, (__bridge CFTypeRef)@"http.server.cn"); CFReadStreamSetProperty(readStream, kCFStreamPropertyHTTPProxyPort, (__bridge CFTypeRef)[NSNumber numberWithInt:8080]);
2、URLSession HTTP代理设置
需要配置session的config NSURLSessionConfiguration.connectionProxyDictionary这个属性
这里面有个坑,对于HTTP代理设置,基本上可以搜索到下面的代码
config.connectionProxyDictionary = @{(__bridge NSString*)kCFNetworkProxiesHTTPEnable:@YES, (__bridge NSString*)kCFStreamPropertyHTTPProxyHost:@"agent.server.cn", (__bridge NSString*)kCFStreamPropertyHTTPProxyPort:@(8080), };
那么对于HTTPS代理,怎么配置呢?
找到kCFNetworkProxiesHTTPEnable的声明文件,CFProxySupport.h,里面有个kCFNetworkProxiesHTTPSEnable声明,是不是想把上面的代码直接替换为kCFNetworkProxiesHTTPSEnable?空欢喜
你会发现编译失败,因为kCFNetworkProxiesHTTPSEnable在IPhone上未定义,未定义,未定义(但是在MAX OS上定义了,这个API设计确实挺贱的)
可行的办法是直接使用字符串“HTTPSEnable”
config.connectionProxyDictionary = @{@"HTTPSEnable":@YES, (__bridge NSString*)kCFStreamPropertyHTTPSProxyHost:@"agent.server.cn", (__bridge NSString*)kCFStreamPropertyHTTPSProxyPort:@(8443), };
别问我这个字符串怎么来的,xcode是可以调试的
0 0
- IPhone Objective-C HTTP代理那些破事
- Objective-C语法之字符串那些事
- Objective-C语法之字符串那些事
- Objective-C语法之字符串那些事
- Objective-C语法之字符串那些事
- Objective-C语法之字符串那些事
- Objective-C语法之字符串那些事
- Objective-C内存管理那些事
- Objective C--代理模式
- Objective C 代理模式
- Objective-c 代理模式
- Objective-C语法之第一个iPhone应用程序的那些事儿(十)
- Objective-C语法之第一个iPhone应用程序的那些事儿(十)
- Objective-C语法之第一个iPhone应用程序的那些事儿(十)
- HTTP代理的那些事儿
- Objective-C ,ios,iphone开发基础:protocol 协议(委托,代理)的声明
- Java 和 HTTP 的那些事(二) 使用代理
- Java 和 HTTP 的那些事(三) 代理认证
- MySql与数据库初识
- 『 Jack_a_Lent_Notes』---Buck基本工作原理
- 开启APMServ5.2.6支持.htaccess伪静态
- 分析 OVS 如何实现 vlan 隔离
- 53. Maximum Subarray
- IPhone Objective-C HTTP代理那些破事
- puppet 配置 3.2 管理 hosts
- kafka之三 Kafka 高可用
- 优雅编程之Guava瓜娃工具类的7点整理学习分享(三十九)
- 第二十八节 Scala与JAVA互操作
- mysql数据库密码忘记如何恢复
- JAVA设计模式之原型模式
- 算法之路三:HDU OJ:2004
- 使用 SqlBulkCopy 批量从execl中导入数据