我是否需要替换 NSURLConnection 以实现对仅 IPv6 服务的强制支持?

Do I need to replace NSURLConnection in order to achieve mandatory support for IPv6-only services?

由于 Apple 要求提交审核的应用程序必须从 2016 年 6 月 1 日起支持纯 IPv6 网络,我正在检查是否需要替换应用程序中的某些 API / 库。但是本人对网络及相关方面的了解还不够,因此无法给出明确的答案,希望得到帮助。

关于Apple提供的文档Supporting IPv6 DNS64/NAT64 Networks,它指出应用程序应该没问题,无需执行更新,如果:

you’re writing a client-side app using high-level networking APIs such as NSURLSession and the CFNetwork frameworks and you connect by name

据此我将其作为2个标准:

  1. 使用 NSURLSession 或 CFNetwork
  2. 按名称连接

所以这里的问题是:

  1. 据我所知,NSURLConnection 是基于 CFNetwork 的,这是否意味着如果我的应用程序使用 NSURLConnection,我也会没事? (我看到 this image in the above document 中也提到了 NSURLConnection,但我还是不太确定,因为 NSURLConnection 有点老了?而且我似乎也找不到提到 IPv4 和 IPv6 支持的文档。)

  2. 根据标准"calling by name",这是否意味着无论我使用的是 NSURLSession 还是 NSURLConnection,如果我碰巧通过 IPv4 调用或访问某些资源/APIs地址,会发生坏事吗? (我做了一些研究,根据我的理解,像 iOS 具有 iOS 9+ 的设备这样的客户端将始终使用合成的 IPv6 地址来访问 IPv4 服务器,因此客户端将无法访问资源如果我通过 IPv4 地址调用?)

感谢您的帮助!

  1. 应该会好的。但是您可以通过连接到您 Mac 创建的 NAT64 网络来自己测试它,看看您的应用程序是否正常工作。
  2. 如果您在 iOS 9.2+ 中使用更高级别的 API,那么名称和 IPv4 文字都可以使用。

NSURLConnection 在推荐列表中,查看 Apples dns64/nat64 文章 here.

中的图 10-5

根据 Apple 的说法:"The easiest way to test your app for IPv6 DNS64/NAT64 compatibility—which is the type of network most cellular carriers are deploying—is to set up a local IPv6 DNS64/NAT64 network with your Mac. You can then connect to this network from your other devices for testing purposes" 完整 link 可以找到 here

P.S 如果您使用的是 sendAsynchronousRequest 方法,则需要将其更改为 [NSURLSession dataTaskWithRequest:completionHandler:] 因为它被弃用了。

我基于this post创建了一个IPv6环境,测试现在管理的主项目

PS,apple官方文档,Supporting IPv6 DNS64/NAT64 Networks也有同样的流程,教学如何搭建DNS64/NAT64IPv6 only环境进行测试

使用 AFNetworking 库和 NSURLConnection 相关方法时似乎没问题。但是用于 P2P 连接的第 3 方库失败。


Option键并点击Sharing

上图按Option会出现

Create NAT64 Network。如果那里不存在,回到上面的步骤,记得按 Option 键。


iOS 8, IPv6 only issue

iOS 8 didn't have NAT64 support, so any iOS 8 device on an IPv6-only network would be hopelessly crippled. Based on that, I'm pretty sure that as long as your code uses the IPv4 APIs only when actually running on iOS 8 and earlier (i.e. run-time checks, not build-time checks), you should be fine.