tl;dr
InetAddress.getAllByName()只接收IPv4地址列表,即使java.net.preferIPv6Addresses设置为true,在NAT64网络上,在iOS设备上也是如此。在连接到同一网络的android上,相同的代码可以正常工作。
这意味着,在ipv6专用网络中(根据苹果商店的要求),任何试图制作HttpURLConnection的应用程序都将失败,并将被苹果拒绝。
原邮政
我正在用Java为iOS创建一个应用程序,我使用HttpsURLConnection连接到服务器,在HttpsURLConnection网络上测试之前,一切都很正常。这个应用程序被苹果审查小组拒绝了,所以我正在使用NAT64网络进行本地测试。
要创建我的NAT64网络,我遵循以下步骤:支持IPv6 DNS64 64/NAT64 64网络
样本代码:
HttpsURLConnection testConn = null;
try {
URL testUrl = new URL("https://google.com");
testConn = (HttpsURLConnection) testUrl.openConnection();
testConn.connect();
}catch (Exception e){
e.printStackTrace();
}finally {
if(testConn != null){
testConn.disconnect();
}
}在我的java.net.SocketException: Network is unreachable网络中,此代码在NAT64上失败。
我尝试过更改系统属性:
System.setProperty("java.net.preferIPv4Stack", "false");
System.setProperty("java.net.preferIPv6Addresses", "true");我还尝试将网站设置为服务器以外的其他内容(如google.com测试代码中所示)。我还使用wireshark从wi连接中嗅探了数据包,唯一的流量是对google.com的DNS请求,它似乎不会失败。最后,我还尝试回到HttpURLConnection,以防问题与HTTPS有关。
同样值得注意的是,在测试中,iPhone可以安全地到达我们所有的服务器和域,并且该设备似乎具有稳定的和功能良好的互联网连接。当它连接到同一个NAT64网络时,这个应用程序在我的安卓设备上也会失败。
编辑:
设置System.setProperty("java.net.preferIPv6Addresses", "true");解决了android上的问题,所以现在这个问题被隔离到了iPhone5上的NAT64网络上。在这个阶段,我最好的猜测是,属性是由另一个类设置的,并且被忽略。我尝试在类顶部的静态初始化程序块中设置该属性,但没有成功。
编辑2:
我使用了System.getProperty("java.net.preferIPv6Addresses"),它在iPhone5上返回true,所以肯定是在设置它,这让我再次陷入困境。
编辑3:
我深入研究了HttpsURLConnection,它实现了一个PlainSocketImpl类来处理它的连接,它使用一个InetAddress。我决定测试一个InetAddress,当我在iPhone上调用InetAddress.getByName("google.com")时,我得到一个ipv4地址,而在android上,它返回的是一个ipv6地址。似乎java.net.preferIPv6Addresses属性在iOS上被忽略了。我尝试过将JDK更新为最新版本,但这并没有帮助。
我也刚刚尝试过InetAddress.getAllByName("www.google.com"),它只返回iPhone上的IPv4地址。我想说这显然是一个DNS问题,但是为什么在连接到同一个网络的android上不是一个问题呢?
因此,我现在知道问题是什么,但却不知道如何解决。
发布于 2017-04-24 21:48:32
解决方案是升级我的应用程序,以便在最新版本的MAF上运行。
详细信息:
尽管我已经将Eclipse和MAF更新为最新版本,但我的应用程序仍然使用它最初的MAF发行版作为目标运行时。通过查看目标SDK并意识到我无法更改运行时版本,我发现了这一点。

要更新,我必须创建一个新项目,确保将目标运行时设置为最新版本的MAF。然后,我将代码迁移到这个新项目中,并且能够在IPv6专用网络下成功地运行我的应用程序。

(在编写本报告时,MAF 2.3.2是Eclipse可用的最新版本)
如果有办法做到这一点而不创建一个新的项目,我无法发现它。
https://stackoverflow.com/questions/43336277
复制相似问题