需要IPv6兼容性 - iOS应用被苹果拒绝

30

在此输入图像描述

在6月1日之后,我将我的ionic应用程序提交到了iTunes Connect,并从Apple收到了消息。

应用程序会在IPv6网络上进行审查。请确保您的应用程序支持IPv6网络,因为需要支持IPv6兼容性。

有关支持IPv6网络的信息,请参阅“支持iPv6 DNS64 / NAT64 Networks”。

有关网络概述,请参见“关于网络”。

我使用AFNetworking进行API调用。

请帮忙找出解决方案。

谢谢。

4个回答

20
如果您正在使用IPv4特定的API或硬编码IP地址,则需要更新代码,尽管所有NSURLSession和CFNetwork API(包括NSURLConnection)已经支持IPV6。
正如Apple所述:
在WWDC 2015上,我们宣布了iOS 9中转换为仅限IPv6网络服务。从2016年6月1日开始,提交到App Store的所有应用程序都必须支持仅限IPv6的网络。大多数应用程序不需要进行任何更改,因为NSURLSession和CFNetwork API已经支持IPv6。
如果您的应用程序使用IPv4特定的API或硬编码IP地址,则需要进行一些更改。
尽管如此,Apple还建议不要使用IP地址文字(长期而言并非必要)。

不要使用IP地址字面值

确保您在向getaddrinfo和SCNetworkReachabilityCreateWithName等API传递以点表示法表示的IPv4地址文字时,使用高级网络框架和不依赖于地址版本的API,例如getaddrinfo和getnameinfo,并将主机名或完全限定域名(FQDN)传递给它们。请参阅getaddrinfo(3) Mac OS X Developer Tool Manual Page和getnameinfo(3) Mac OS X Developer Tool Manual Page。

注意:在iOS 9和OS X 10.11及更高版本中,NSURLSession和CFNetwork会自动从运行DNS64 / NAT64网络的设备上本地合成IPv6地址。但是,您仍应努力消除IP地址文字

如果您正在使用AFNetworking Library,请确保将其更新到3.x以上的版本,因为它们似乎已经更新了一些内容。-->AFNetworking Added support for IPv6 to Reachability

有关详细信息,请访问此链接

支持IPv6-only网络

另外,为了测试

您可以按照这个详细的教程:

教程-如何测试您的应用程序是否兼容IPv6


1
我认为你应该升级到AFNetworking的最新版本3.1.0。他们更新了一些东西。为可达性(Reachability)添加了对IPv6的支持。--> https://github.com/AFNetworking/AFNetworking/pull/3174 - gunjot singh
1
请确保您没有使用IPv4特定的API或硬编码IP地址。实际上,这并不是真的。只要您的应用程序在仅支持IPv6的网络上正常工作,您可以使用任何您想要的内容。 - user102008
1
我们有同样的问题,但我们不使用AFNetworking。我们的应用程序是使用Cordova制作的,使用JavaScript和HTML编写。所有的Web请求都是登录的https请求。我们的测试场景就像这个页面上的一样:https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1唯一不支持IPV6的是响应的Web服务器。但如果我理解描述正确,服务器也不必支持IPV6。 - DeeFour
1
@gunjotsingh,我正在使用NSURLConnection调用URL,在IPv6网络中得到了空响应,请给我一些解决方案。 - Bhavesh Nayi
Nij,我认为Alamofire 4.0没有任何问题,但是应用程序被拒绝可能是由于您代码的其他部分引起的! - gunjot singh
显示剩余15条评论

12

解决苹果应用被拒绝的IPv6网络问题

我的IPv6网络可达性检查一直无法正常工作。当我使用这段代码时,苹果在24小时内批准了我的应用程序。谢谢!

AFNetworking库中的AFNetworkReachabilityManager类中更改以下代码行:

AF_INET 改为 AF_INET6;

+ (instancetype)sharedManager {
    static AFNetworkReachabilityManager *_sharedManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        struct sockaddr_in address;
        bzero(&address, sizeof(address));
        address.sin_len = sizeof(address);
        address.sin_family = AF_INET6;  //Change AF_INET TO AF_INET6
        _sharedManager = [self managerForAddress:&address];
    });

    return _sharedManager;
}

编辑:

$ grep -nr 'AF_INET*' .
./Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m:122:        address.sin_family = AF_INET;

replace

AF_INET; to AF_INET6;

1
你根本不应该使用可达性检查。https://dev59.com/SWjWa4cB1Zd3GeqPsJz6 - Andrew Y
1
苹果公司推荐的解决方案是停止检查互联网访问并优雅地处理故障。 - Andrew Y
苹果应用审核的最佳解决方案 - Maninderjit Singh
1
一个观察:sockaddr_in 存储 IPv4 地址,如果将 sin_family(sockaddr_* 结构中的共享字段)设置为 AF_INET6,则获取此参数的代码会假定该结构是 sockaddr_in6,其大小更大。 - Andrew Y
1
这对我有用。实际上,您需要在整个工作区中将AF_INET更改为AF_INET6,无论您在哪里使用它。太好了。非常感谢您节省了很多时间。 - Mahesh Agrawal
显示剩余3条评论

7

实际上,我正在使用 AFNetworking 库调用 API。

我刚刚从 Github 上替换了我的现有类,使用了 AFNetworkReachabilityManager 类。现在苹果没有任何问题。

现在我的应用可以正常工作了。


这是插件中的内容还是Cordova中的OOTB内容需要更改?应该在哪里更改? - Alvaro Montoro
我做了同样的事情。但是苹果仍然拒绝我的应用程序。 - Nirmalsinh Rathod
http://stackoverflow.com/q/43028924/285594 - 即使在应用程序中修复了问题,它仍然被拒绝。 - user285594

0
从API URL中删除点号表示法,因为IPv6网络不允许在URL中使用点号表示法。我从API URL中删除了它,并且它对我起作用了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接