适配IPv6

针对苹果6月1号起,要求上传的应用需要适配IPv6-only,如果我们的工程里面不是自定义的网络层,只需要更新三方SDk就可以,例如AFNetworking.

因为苹果对于底层NSURLConnection这个API做了申明,这个是不支持IPv6的,而且Xcode 7中,NSURLConnection的API已经正式被苹果弃用.从而去支持NSURLSession和CFNetwork.而AFNetworking 3.0版本已经全部适配成NSURLSession.

所以对于我们使用三方SDK的人来说,就是去更新最新的库,但是跟新之前一定要看清楚这些三方库的安转要求,

当你使用coocapods集成AFNetworking 3.0的时候你会发现报错
首先你应该先更新你的cocoapods

$ sudo gem update --system // 先更新gem
$ sudo gem install cocoapods // 安装cocoapods
$ pod setup
// 最好保证你的ruby源是淘宝的,如果是默认国外的,你猜会怎么样?
// 更换ruby源
$ gem sources --remove https://rubygems.org/
 $ gem sources -a https://ruby.taobao.org/
 $ gem sources -l //查看ruby地址

运行setup的时候,会有一点慢,请内心等待

接下来就是正常的pod AFNetworking 3.0

但是你会发现老是报错,无法正常安装

适配IPv6_第1张图片
报错

即使我把Qiniu删掉,依然报错,这里不上图了,直接说解决方法,
把你podfile文件里面关于用到AFNetworking的,和Qiniu的pod删掉,然后pod install(这里是因为我使用 pod update 不管用)一下,然后重新添加

pod 'AFNetworking', '~> 3.1.0'
pod install 
成功

接下来七牛怎么办呢,我直接安转还是报错


适配IPv6_第2张图片
再次报错

无法理解,只能去七牛的github上面找找原因,原来七牛单独为AFNetworking 3.0 开了一个分支,然后找到pod的方法

pod "Qiniu", :git => 'https://github.com/qiniu/objc-sdk.git', :branch => 'AFNetworking-3.x’
pod install
成功

对于不是使用cocoapos管理三方库的同学,附上下载地址
https://github.com/qiniu/objc-sdk/tree/AFNetworking-3.x


关于SDWebImage的话,暂时还没有支持IPv6,不过到4.0的话应该会支持,就跟中国要普及IPv6,不知道要到猴年马月!!!

适配IPv6_第3张图片
SDWebImage

由于昨晚时间太紧,今天搭了个IPv6的环境,测试了一下AFN2.0是否支持IPv6,发现正常的请求都是可以的,也就是说,暂时可以不升级到AFN3.0,因为3.0之后有的网站加了SSL验证,如果你的app里面有抓取别人部分数据的,会有问题. 如果是自己的服务器数据,那么问题不大.

但是尽量把请求地址,改成地址绑定的域名,这样好一点.
虽然现在苹果还支持NSURLConnection,但是转换应该会很快的,只是不明白苹果是对于NSURLSession和CFNetwork做了NSURLConnection的兼容,还是别的原因.不过之后尽量是改成同时支持iPv4和IPv6的!


AFN3.0之后,暂时不计划支持同步请求,

适配IPv6_第4张图片
反馈

附上解决方案(提供者:漂泊的煙烣)
出处

NSParameterAssert(manager); // prevent infinite loop
dispatch_async(dispatch_get_global_queue(0, 0), ^{

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

NSLog(@"AAA");

[manager GET:self.paramsModel.apiUrl parameters:self.paramsModel.paramsDic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

[self responseResult:responseObject successBlock:successBlock];
NSLog(@"BBB");
dispatch_semaphore_signal(semaphore);

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[self responsResultError:error failure:failureBlock];
NSLog(@"BBB");
dispatch_semaphore_signal(semaphore);
}];

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"CCC");
});

后续有别的东西,会补充
关于测试的话,好多人都已经写过了,你们可以直接搜索.

若有用,请点喜欢!
若转载,请注明出处!

你可能感兴趣的:(适配IPv6)