问题:SDK是否支持IPv6访问,SDK文档上所描述的IPv6环境具体指什么 ?
回复:SDK 支持IPv6是指Apple的 IPv6-Only审核测试环境,兼容苹果审核时所使用的IPv6-Only环境,并能够通过审核,并非真实的IPv6环境,关于IPv6-Only相关的资料可以参考: https://developer.apple.com/support/ipv6/
问题:IPv6-Only环境下,在使用HttpDns的业务侧需要做什么适配动作吗?
回复: 分两种情况。1.如果业务侧是单栈模式(IPv4),则端上在使用HttpDns时不用做额外的适配。SDK当在IPv6-Only环境下,会自动把对应的IPv4地址合成IPv6的地址返回。2.如果业务侧是双栈模式(IPv4 + IPv6),并且想要自己根据当前网络环境来决策使用对应的IP,则需要主动开启enableIPv6开关,此时SDK不会自动把IPv4合成IPv6 ,需要业务侧自己判断网络环境来选择获取对应的IP。
注意:IP直连时URL在IPv4 和 IPv6地址的不同拼接方式
IPv4:http://192.168.0.1:8080/xxx这种形式,
IPv6:http://[64:ff9b::192.168.0.1]:8080/xxxxx ,SDK 提供了自动Format的方法getIpByHostAsyncInURLFormat
问题:如何判断IPv6-Only环境
回复:通过本地的DNS地址类型来判断,如果地址都为IPv6地址,则当前环境为IPv6-Only环境
问题:SDK 是如何把IPv4地址合成IPv6?
回复:根据官方文档说明当>=iOS 9.2 时,可以使用getaddrinfo来合成IPv6地址。当版本小于iOS 9.2 则使用本地支持的Prefix进行转换,细节可以参考下列文档。rfc7050
注意:根据规范, Well-Known Prefix (64:ff9b::/96) 是NAT64必须要支持的,但是苹果的文档也说明了情况并不是这样,所以要根据本地实际Prefix来进行转换。
参考:
https://developer.apple.com/support/ipv6/
https://datatracker.ietf.org/doc/html/rfc6052
https://datatracker.ietf.org/doc/html/rfc7050
问题:下面这个方法会不会自动区分IPV4和IPV6的地址返回?
- (NSString *)getIpByHostAsyncInURLFormat:(NSString *)host;
回复:不会不一样的,
getIpByHostAsyncInURLFormat
是适配IPv6-only 网络环境,将IPv4地址转换为映射的IPv6 mapped的地址。- (NSString *)getIPv6ByHostAsync:(NSString *)host;
getIPv6ByHostAsync
这个是返回域名本身的IPv6地址,跟设备所处的网络环境没有关系。
问题:下面这个不设置会影响审核吗 ?也就是说不用设置enableIPv6 ?
- (void)enableIPv6:(BOOL)enable;
回复:不设置也支持苹果审核 。这个开关是主动使用我们提供的IPv6功能,是需要你们自己有IPv6的IP并且需要在控制台设置的 。这个由你们业务来确定。
问题 :HTTPDNS SDK内部有对系统当前网络 IPv4/IPv6双栈配置做检测吗 ?如果系统当前网络栈在IPv4-Only的环境中,请求IPv6 IPs相关接口仍然会返回解析结果吗 ?反过来,如果系统当前网络栈在IPv6-Only的环境中,请求IPv4 IPs相关接口仍然会返回解析结果吗?结果会做DNS64合成吗?
回复 :
- (void)enableIPv6:(BOOL)enable;
@param enable 是否开启 ,默认为 NO , 开启 IPv6 结果解析,
开启后调用 getIPv6ByHostAsync: 接口使用 .
- (NSString *)getIPv6ByHostAsync:(NSString *)host;
@param host 解析域名 @return IPv6解析结果,若没有IPv6地址,则返回 nil
异步解析域名,返回 IPv6 地址 开启 IPv6 结果解析后,若域名存在 IPv6 地址,则返回 IPv6 解析结果 .
例:域名:ipv6.sjtu.edu.cn,
IPv4地址:202.120.XX.XX,
IPv6地址:2001:da8:8000:1:0:0:0:80,
解析成功后接口返回结果:2001:da8:8000:1:0:0:0:80
【注意】开启 IPv6 结果解析后,SDK 在 IPv6-Only 网络环境下,
对 IPv4 解析结果不再自动转换为 IPv6 地址,
getIpsByHostAsync: 返回 IPv4 地址,getIPv6ByHostAsync: 返回 IPv6 地址 .