【问题标题】:required iPv6 compatibility - iOS app rejected by apple所需的 iPv6 兼容性 - 苹果拒绝 iOS 应用
【发布时间】:2016-10-08 04:13:33
【问题描述】:

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

在 IPv6 网络上审核应用程序。 请确保您的应用支持 IPv6 网络,因为 IPv6 兼容性 是必需的。

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

有关网络概述,请参阅关于网络。

我使用 AFNetworking 进行 API 调用。

请帮忙找出解决办法。

谢谢。

【问题讨论】:

    标签: ios app-store-connect ipv6


    【解决方案1】:

    如果您使用 IPv4 特定的 API 或硬编码的 IP 地址,则需要更新您的代码,尽管所有 NSURLSession 和 CFNetwork API(包括 NSURLConnection)都已经支持 IPV6

    正如苹果所说:

    在 WWDC 2015 上,我们宣布过渡到纯 IPv6 网络服务 在 iOS 9 中。从 2016 年 6 月 1 日开始,所有应用都提交到 App Store 必须支持纯 IPv6 网络。大多数应用程序不需要任何 因为 NSURLSession 已经支持 IPv6 并且 CFNetwork API。

    如果您的应用使用 IPv4 特定的 API 或硬编码的 IP 地址,您 需要进行一些更改。

    虽然。 Apple 还建议不要长期使用 IP 地址文字(不必要)

    不要使用 IP 地址文字

    确保您没有将 IPv4 地址文字以点表示法传递给 getaddrinfo 和 SCNetworkReachabilityCreateWithName 等 API。 相反,使用高级网络框架和地址不可知 API 的版本,例如 getaddrinfo 和 getnameinfo,并传递它们 主机名或完全限定域名 (FQDN)。请参阅 getaddrinfo(3) Mac OS X 开发者工具手册页和 getnameinfo(3) Mac OS X 开发者工具手册页。

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

    如果您使用 AFNetworking 库,请确保将其更新到 3.x 以上版本,因为他们似乎更新了一些东西。 --> AFNetworking Added support for IPv6 to Reachability.

    详细信息,请点击此链接

    Supporting IPv6-only Networks

    还要测试

    您可以按照此详细教程进行操作:

    tutorial-how-to-test-your-app-for-ipv6-compatibility

    【讨论】:

    • 感谢您的回复。我没有在我的应用程序中使用硬编码的 IP 地址来调用 API。我用过xxxxxx.com/API/login.php,所以现在,我要改变什么......?
    • 我认为,您应该转到 AFNetworking 最新版本 3.1.0。他们更新了一些东西。为可达性添加了对 IPv6 的支持。--> github.com/AFNetworking/AFNetworking/pull/3174
    • “确保您没有使用 IPv4 特定的 API 或硬编码的 IP 地址。”事实上,这不是真的。只要您的应用在纯 IPv6 网络上正常运行,您就可以使用任何您想要的东西。
    • 我们有同样的问题,我们不使用 AFNetworking。我们的应用程序是用 Cordova 制作的,并用 Javascript 和 HTML 编码。所有的 webrequests 都是 https 登录请求。我们的测试场景就像在这个页面上:developer.apple.com/library/mac/documentation/… 唯一不是 IPV6 的是响应的网络服务器。但如果我理解描述正确,服务器也不必是 IPV6。
    • @gunjotsingh ,我正在使用 NSURLConnection 调用 url ,并通过 IPv6 网络得到 nil 响应,请给我一些解决方案。
    【解决方案2】:

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

    我刚刚用我现有的类替换了 Github 中的 AFNetworkReachabilityManager 类。而且苹果没有问题了。

    我的应用现在可以运行了。

    【讨论】:

    • 这是来自插件的东西还是 ootb 的东西要在科尔多瓦中改变?应该在哪里改?
    • 我也是这样做的。但是苹果仍然拒绝了我的应用程序。
    • stackoverflow.com/q/43028924/285594 - 即使在APP中固定,它仍然拒绝。
    【解决方案3】:

    由于 IPv6 网络导致 Apple 应用被拒绝的解决方案

    我的 IPv6 互联网可达性检查运行不正常。它总是显示没有网络。当我使用此代码时,Apple 在 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;
    

    【讨论】:

    • 您根本不应该使用可达性检查。 stackoverflow.com/questions/12490578/…
    • 我在点击api之前检查互联网访问时遇到问题。它总是显示互联网不可用的消息。
    • 苹果推荐的解决方案是停止检查互联网访问并优雅地处理故障。
    • 观察:sockaddr_in 存储 IPv4 地址,如果将 sin_family(sockaddr_* 结构中的共享字段)放入 AF_INET6,则获取此作为参数的代码假定结构是 sockaddr_in6,尺寸更大。
    • 这对我有用。实际上,您需要在您使用过的整个工作区中将 AF_INET 更改为 AF_INET6。伟大的。非常感谢您节省了很多时间。
    【解决方案4】:

    从 API URL 中删除点符号,因为 IPv6 网络不允许在 URL 中使用点符号。我从 API URL 中删除了它对我的工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-24
      • 2017-07-01
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 2018-03-08
      相关资源
      最近更新 更多