我是否需要替换 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个标准:
- 使用 NSURLSession 或 CFNetwork
- 按名称连接
所以这里的问题是:
据我所知,NSURLConnection 是基于 CFNetwork 的,这是否意味着如果我的应用程序使用 NSURLConnection,我也会没事? (我看到 this image in the above document 中也提到了 NSURLConnection,但我还是不太确定,因为 NSURLConnection 有点老了?而且我似乎也找不到提到 IPv4 和 IPv6 支持的文档。)
根据标准"calling by name",这是否意味着无论我使用的是 NSURLSession 还是 NSURLConnection,如果我碰巧通过 IPv4 调用或访问某些资源/APIs地址,会发生坏事吗? (我做了一些研究,根据我的理解,像 iOS 具有 iOS 9+ 的设备这样的客户端将始终使用合成的 IPv6 地址来访问 IPv4 服务器,因此客户端将无法访问资源如果我通过 IPv4 地址调用?)
感谢您的帮助!
- 应该会好的。但是您可以通过连接到您 Mac 创建的 NAT64 网络来自己测试它,看看您的应用程序是否正常工作。
- 如果您在 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/NAT64
,IPv6 only
环境进行测试
使用 AFNetworking
库和 NSURLConnection
相关方法时似乎没问题。但是用于 P2P
连接的第 3 方库失败。
按Option
键并点击Sharing
。
上图按Option
会出现Create NAT64 Network
。如果那里不存在,回到上面的步骤,记得按 Option
键。
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.
由于 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个标准:
- 使用 NSURLSession 或 CFNetwork
- 按名称连接
所以这里的问题是:
据我所知,NSURLConnection 是基于 CFNetwork 的,这是否意味着如果我的应用程序使用 NSURLConnection,我也会没事? (我看到 this image in the above document 中也提到了 NSURLConnection,但我还是不太确定,因为 NSURLConnection 有点老了?而且我似乎也找不到提到 IPv4 和 IPv6 支持的文档。)
根据标准"calling by name",这是否意味着无论我使用的是 NSURLSession 还是 NSURLConnection,如果我碰巧通过 IPv4 调用或访问某些资源/APIs地址,会发生坏事吗? (我做了一些研究,根据我的理解,像 iOS 具有 iOS 9+ 的设备这样的客户端将始终使用合成的 IPv6 地址来访问 IPv4 服务器,因此客户端将无法访问资源如果我通过 IPv4 地址调用?)
感谢您的帮助!
- 应该会好的。但是您可以通过连接到您 Mac 创建的 NAT64 网络来自己测试它,看看您的应用程序是否正常工作。
- 如果您在 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/NAT64
,IPv6 only
环境进行测试
使用 AFNetworking
库和 NSURLConnection
相关方法时似乎没问题。但是用于 P2P
连接的第 3 方库失败。
按Option
键并点击Sharing
。
Option
会出现Create NAT64 Network
。如果那里不存在,回到上面的步骤,记得按 Option
键。
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.