美文网首页网络通信知识点iOS开发实用技巧
针对苹果iOS最新审核要求为应用兼容IPv6

针对苹果iOS最新审核要求为应用兼容IPv6

作者: tanyufeng | 来源:发表于2016-05-06 11:38 被阅读15933次

    最新消息

    今天苹果推出重磅消息,6月1日后所有应用必须支持IPv6-only网络!!!当iOS开发者看到这个消息的第一反应可能就是IPv6是个什么鬼!!其实IPv6早在很早之前就已经推出,而且苹果在2015年的开发者大会上就已经提出苹果将力挺IPv6 官网链接

    IPv6-only

    说了这么多,IPv6到底是个什么鬼!我们来看看百度百科是怎么解释的:

    IPv6

    我们再来看看官方给出的IPv6与IPv4的对比:

    IPv6比IPv4的优点

    看不懂??,我们来解释下:
    1、IPv6:避免了网络地址转换(NAT)
    2、通过网络通过使用简化的头提供了更快的路由
    3、防止网络分段
    4、避免广播邻居地址解析

    说了这么多,我们来看看在iOS开发中,如何实现IPv6

    开发中使用IPv6

    不建议使用底层的网络API

    下图展示的蓝色部分的这些API都是不存在兼容性问题的,而我们平时自己用的包括那些第三方的网络库大部分都是用的这些API。

    Networking frameworks and API layers.png

    大部分情况下,我们用高级的API完全能够实现我们的需求,而且高级API封装的很便于使用,很多底层的像适配IPv6的工作都已经帮我们做好了。而用底层API会有大量的工作要我们自己来做,更容易产生bug。但你如果确实需要用底层的POSIX socket API, 请参照这个RFC4038: Application Aspects of IPv6 Transition的指导。
    PS:系统自带的网络类已经支持了IPv6我们只需放心使用就好,例如NSURLSession等;

    不要直接使用IP地址

    比如下面这个API,nodename这个参数不要传IP地址,而应该用域名

    SCNetworkReachabilityCreateWithName

    这个方法在著名的第三方Reachability中是用到的,我们常用的第三方网络库AFNetworking就用了这个。所以用到的同学得好好查一下了。

    检查不兼容IPv6的代码

    搜一下工程里有没有下面的这些API,这些都是只针对IPv4做处理的,有的话就删了。

    inet_addr()
    
    inet_aton()
    
    inet_lnaof()
    
    inet_makeaddr()
    
    inet_netof()
    
    inet_network()
    
    inet_ntoa()
    
    inet_ntoa_r()
    
    bindresvport()
    
    getipv4sourcefilter()
    
    setipv4sourcefilter()
    

    如果用到了下面左边的这些IPv4的类型,那么它们相应的IPv6类型也需要做处理

    IPV4-IPV6

    本地搭建IPv6测试环境

    最后我们来搭一个IPv6的测试环境吧,你所需要的就是一台用非Wi-Fi的方式上网的Mac电脑。

    我们的要做的其实就是用Mac做一个热点,然后用iPhone连接这个Wi-Fi,听起来很容易,我相信大家在公司就是这么干的吧。

    区别是这次我们产生的是一个本地的IPv6 DNS64/NAT64网络,这项功能是OS X 10.11新加的。和我们以前开启热点方式不一样的地方在于,我们在“System Preferences”界面选中“Sharing”的同时,要按住“Option”键。

    system Preferences

    之后在“Sharing”界面中,我们会看到和之前不一样的地方,就是红框所标的地方,多了一个叫“Create NAT64 Network”的选框,选中它。

    Sharing

    之后就是按照正常的创建热点的流程走完就行了。

    现在我们用iPhone连接上这个刚创建好的热点就可以测试了,注意此时要把iPhone设成飞行模式,以保证只用Wi-Fi上网。

    参考官方原文链接:
    https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1

    本文CSDN链接:http://blog.csdn.net/hastar521/article/details/51330023

    欢迎大家踊跃评论,让我们一起探讨技术!!
    如果觉得文章不错,请帮忙点击文章下方的喜欢!!
    你的支持将是对我最好的鼓励, 谢谢!!!

    相关文章

      网友评论

      • 健健锅:如果传的是 ip应该怎么处理
      • 863c73f31933:你好,楼主问一下,模拟器能模拟连上ipv6的WiFi热点不
      • bec1bc0ef078:请问,我把IP地址换成域名,为什么APP 还是连接不上服务器
        df505424baac:@wangxuedong 我出现了跟你一样的情况,请问你解决了吗?
      • 一路李花开:请问,怎么检测第三方的库支不支持IPv6呢?
      • 小凡凡520:为什么一定是 非wifi呢
      • 13149a3d9e65:您好,我最近要发版,看到您的文章检查了一下,我的AFN 是2.6 的 里边有AF_INET 是不是要改成AF_INET6 ? 还是升级AFN ? 我其他的三方里边 也有这个东西. 请大神 赐教!
        13149a3d9e65:@tanyufeng 谢谢
        武小寺:这个是需要升级到AFN3.0?
        如果不升级到3.0,把服务器地址改成域名,可不可以?
        因为升级到3.0,我请求会报错
        Error Domain=NSURLErrorDomain Code=-999 "cancelled"
        tanyufeng:@沉子汐 升级第三方
      • ae86a295f337:我的是在Reachability这个类里有的AF_INET和struct sockaddr_in,这个库需要更新么,还是怎么修改呢
        Yinper:@半樱花悠然花香墨 这样写有没有问题啊
        ae86a295f337:@tanyufeng #if (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 90000) || (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
        struct sockaddr_in6 zeroAddress;
        bzero(&zeroAddress, sizeof(zeroAddress));
        zeroAddress.sin6_len = sizeof(zeroAddress);
        zeroAddress.sin6_family = AF_INET6;
        #else
        struct sockaddr_in zeroAddress;
        bzero(&zeroAddress, sizeof(zeroAddress));
        zeroAddress.sin_len = sizeof(zeroAddress);
        zeroAddress.sin_family = AF_INET;
        #endif
        这样写有问题么,大神
        tanyufeng:@半樱花悠然花香墨 需要更新,AF_INET改成AF_INET6, struct sockaddr_in改成struct sockaddr_in6
      • 心向往之:楼主,你好,我按照你说的操作了一遍,获取不到ipv6地址是个什么情况,获取到的地址为169.254.252.136,百度了下说下保留地址,望指教
      • 7cb7f0788abd:我现在的用的是afnetworking2.x,接口的url访问如同:http / /:192.168.0.1/ios/v1/ ......,这不知道这是不是connect by name,算不算硬编码。请问一下楼主,这样的情况我需不需要修改,升级到afnet3.x?
      • d214da088bee:我们使用了TCP的方式 连接 某一域名, 通过 IPV6测试环境, 发现 无法连接成功, 但是 使用 其他网络环境是正常的. 请问 这个需要 怎么 修改 ? 是因为 域名 解析 到 IPV4 地址上了吗?
        tanyufeng:@cmouse2010 你仔细看看有没有不兼容IPv6的情况存在
      • 柴茝:不按option也会有“Create NAT64 Network”选项是什么情况?
      • 被丢掉的咸鱼:最新版的AFNetworking支持吗
        tanyufeng:@WOSHILUANMA 支持
      • lovedrose:谢谢作者
      • 简单也好:星爷,我是王浩,快互粉😃
      • 9f94d02340f1:不错,学习了!谢谢
        tanyufeng:@JamesYea :smile:
      • SuperMario_Nil:大部分是整理别人的吧:grin:
        tanyufeng:@SuperMario_Nil 是的,今天看到新闻,然后整理的来的!如果英文好的,可以看官网的

      本文标题:针对苹果iOS最新审核要求为应用兼容IPv6

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