适配IPv6

作者: 武小寺 | 来源:发表于2016-05-25 17:06 被阅读1040次

    针对苹果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

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

    报错

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

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

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


    再次报错

    无法理解,只能去七牛的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,不知道要到猴年马月!!!

    SDWebImage

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

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


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

    反馈

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

    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

      本文链接:https://www.haomeiwen.com/subject/vlstdttx.html