美文网首页I love iOS利器集合知识点
IPv6-only 的兼容性解决方案

IPv6-only 的兼容性解决方案

作者: sprint | 来源:发表于2016-05-10 17:49 被阅读21611次

    前几天Apple宣布 6月1日后所有应用必须支持IPv6-only网络 今天抽空看了下这方面的知识

    首先解释下IPv6的是什么?

    维基百科的定义如下:
    IPv6是Internet Protocol version 6的缩写 全名为互联网通讯协议第6版 是互联网协议的最新版本,用于分组交换互联网络的网络层协议,旨在解决IPv4地址枯竭问题
    IPv6具有比IPv4大得多的编码地址空间。这是因为IPv6采用了128位的地址,而IPv4使用的是32位。因此新增的地址空间支持2128(约3.4 ×1038)个地址

    优点如下:

    1. IPv6具有更大的地址空间
    2. IPv6使用更小的路由表 (更快的路由)
    3. IPv6具有更高的安全性

    APP中如何使用IPv6

    ***1. 使用更高层次的网络API(Use High-Level Networking Frameworks) 避免使用socket API ***

    蓝色部分API 默认都支持IPv6


    API

    也就是说
    .WebKit
    .(NSURLSession NSURLRequest NSURLConnection)
    .CFNetwork
    这些API默认都已经支持IPv6
    而值得庆幸的时 我们使用的大多数第三方网络库使用的也是这些API
    比如AFNetWorking 我特意找了一段代码

    AFNetWoring DEMO

    下图是Alamofire创建请求的代码


    Alamofire DEMO

    Alamofire使用的是High-Level Networking Frameworks(NSURLRequest) 也不存在兼容性问题
    这意味着大多数情况下 我们不需要做什么 就可以兼容IPv6

    如果你不能避免使用socket API 请参考这个指南
    RFC4038: Application Aspects of IPv6 Transition
    或者参考谷歌的开源库CocoaAsyncSocket

    2. 不要使用IP地址
    比如使用SCNetworkReachabilityCreateWithName API 时

      func SCNetworkReachabilityCreateWithName(_ allocator:     CFAllocator?, _ nodename: UnsafePointer<Int8>) -> SCNetworkReachability?
    

    使用主机名或者主机域名访问

    3.检查IPv4代码
    项目中不能使用如下代码:

    inet_addr()
    inet_aton()
    inet_lnaof()
    inet_makeaddr()
    inet_netof()
    inet_network()
    inet_ntoa()
    inet_ntoa_r()
    bindresvport()
    getipv4sourcefilter()
    setipv4sourcefilter()  
    
    IPv4->IPv6类型对照表

    如何测试?

    利用Mac创建一个 IPv6 WIFI 热点 手机连接该WIFI即可测试
    (必须保证你的Mac已连接到Internet 并且不是通过WIFI的方式)
    1. 创建 IPv6 WIFI热点
    点击系统设置(System Preferences)-> 按住Option键 -> 点击共享(Sharing

    共享

    选择互联网共享(Internet Sharing

    互联网共享

    选中 创建NaT64网络 (Create NAT64 Network)

    systempreferences_sharing_internetsharing_ipv6_2x.png

    选择 一个共享来源连接


    共享来源连接

    配置WIFI选项

    WIFI选项配置

    输入你的热点名称和密码 最后启用互联网共享(Internet Sharing)选中checkbo

    启用 互联网共享 热点开启效果

    之后通过手机连接该热点 完成测试

    参考连接: 官方网站

    欢迎关注个人公众号:DevTipss

    DevTipss

    相关文章

      网友评论

      • 古沐古沐诺:请教一下,我使用AF进行网络请求,请求的时候 url里面包含了IP地址 .. 这样上架会被拒么
        sprint:@Maybe_Chen 会的 ,改成域名
      • Jin丶hy:请问我这边测试老是 [MSFTcpConnect logDNSResult:]: 崩溃提示
      • sprint:需要运营商支持的
        98a1e7507da8:@sprint 运营商支持是啥意思?
      • LaceyW:请教,mac用网线联网,是否需要网线的网络本身是支持ipv6的?
        我创建热点之后,手机能搜到,但是连接时一直转圈,连不上。
        sprint:@LaceyW 需要运营商支持的
      • 离人萧:按照最后的测试,测试完了能连上网就是没问题了是吗? :sweat:
      • osdaniellee:请问下博主,在搭建好测试环境之后,使用手机连接到wifi,查看给分配的ip地址是168.254.254.143,而DNS是2001:2:0:aab1::1,请问这是否是不正常的测试环境?
        是否应该给手机分配一个ipv6的地址?
        凸口凸:也是这样的,然后被拒了
        97030f7d00c7:@c4ebbf68df13 我在这样的测试环境下测试通过了 但是也是被苹果拒绝了 请问你的问题解决了吗?
        c4ebbf68df13:@osdaniellee 请问你的测试ok了吗?我的共享出来也是这样的。但是还是被苹果拒绝了
      • Tieria:关于检查IPv4代码的部分,可能情况与你所表述的不太一样,我在苹果官方下载了最新的Reachability框架的代码,版本信息如下:
        Version 5.0, 2016-05-05
        Revised to clarify and document how Reachability supports IPv6.
        这个版本里面还是用到了sockaddr_in和AF_INET这些,但是是支持IPv6的
      • 火星的蝈蝈:这几天得试试,谢谢博主
        sprint:@火星的蝈蝈 感谢阅读 :pray:
      • d2fb32e150b8:我创建wifi了,手机可以搜到,但是就是连接不了
      • 2cbc49308ef2:测试的时候微信连不上网,
        2cbc49308ef2:@逗比iOS 微信还没更新,应该还是连不上,
        逗比iOS:@阿大木木 哥们,你微信现在能连上了吗
      • 威猛de小狮子:你好,我在Mac创建一个 IPv6 WIFI 热点的时候没有“Create NAT64 Network”勾选项,怎么办?用的是mac mini,用的是网线连接上网的!
        sprint:@威猛de小狮子 OS X 10.11开始才有这项功能 你看下你的os系统版本是否太低
        威猛de小狮子:@sprint 还是不行啊,没有“Create NAT64 Network"勾选项
        sprint:@威猛de小狮子 停止共享 再次编辑即可
      • 睡不完懒觉:请问这个对企业应用有没有影响?还是说只对要上架的应用
        sprint:@睡不完懒觉 苹果官方只提到提交至Appstore的应用会受影响 关于企业应用我暂时也不清楚 抱歉 猜测是不受影响 需要你自己考证下
      • 我叫大大虾米:请问共享出来的wifi 连不上网,如何解决
        6cda283bdd72:我手机链接共享的wifi,mac就黑屏重启 :joy: 坑啦
        我叫大大虾米:@小小小可乐V 我是用的网线,不知道什么原因:sob:
        小小小可乐V:@我叫大大虾米 mac用网线联网

      本文标题:IPv6-only 的兼容性解决方案

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