Xamarin iOS IPv6 App Store拒绝

时间:2016-07-27 19:17:54

标签: ios iphone xamarin xamarin.ios ipv6

我们一直在构建一个关于客户端 - 服务器应用程序的iOS应用程序。 我们在iOS应用程序中使用SQL连接和WCF Web服务与Xamarin。

SQL连接代码:

    String ips = "10.0.0.1" ; //Example.
  SqlConnection con =   new SqlConnection(@"Data Source=" + ips + "; initial Catalog="x";user id =y;password = z;");

Apple决定在iOS9上只使用ipv6,因此他们发布了一份关于IPv6兼容性的文档 - IPv6 Documentation

Xamarin也发布了一篇关于此事的博客文章 - Making Your iOS Apps IPv6 Ready

我阅读了所有这些文件,但我无法摆脱这个" Store Rejection"问题。

我想告诉你我的最后一次尝试:(ipv4 to ipv6)

string input = "10.0.0.1";
            string ips = "";
            IPAddress address;
            if (IPAddress.TryParse(deviceIP, out address))
            {
                switch (address.AddressFamily)
                {
                    case System.Net.Sockets.AddressFamily.InterNetwork:
                        // we have IPv4
                        ips = input;
                        break;
                    case System.Net.Sockets.AddressFamily.InterNetworkV6:
                        // we have IPv6
                        IPAddress ip = IPAddress.Parse(input).MapToIPv6();
                        ips = "[" + ip.ToString() + "]";
                        break;
                    default:
                        //
                        break;
                }
            }

我使用了Xamarin博客文章中描述的MapToIPv6()函数,但我的应用程序再次被Apple拒绝。

我们的应用程序在IPv4上运行良好(Apple也这样说)。当Apple工程师关闭ipv4并且只使用ipv6时,我们的应用程序无法访问主机。

请帮我解决这个问题。

平台:在Windows 10 + Mac OS X El-Capitan上使用Xamarin的Visual Studio 2015

服务器:仅限ON IPv4。

3 个答案:

答案 0 :(得分:3)

评论中已经有一些有用的东西,但我认为你的主要问题是你有相反的IPv4到IPv6映射。您将IPv4地址保留原样,并将IPv6地址映射到已经存在的IPv6。

看一下固定版本:

string input = "10.0.0.0";
string ips = "";
IPAddress address;
if (IPAddress.TryParse(input, out address))
{
    switch (address.AddressFamily)
    {
        case System.Net.Sockets.AddressFamily.InterNetwork:
            // we have IPv4, map it to IPv6
            IPAddress ip = IPAddress.Parse(input).MapToIPv6();
            ips = ip.ToString();
            break;
        case System.Net.Sockets.AddressFamily.InterNetworkV6:
            // we have IPv6, leave it as is
            ips = input;
            break;
    }
}

要亲眼看看,您可以查看Reference Source。从那里您可以看到,在您的示例中,AddressFamilyInterNetworkV6,因此MapToIPv6方法只会使IPAddress保持不变,因为无需更改。

public IPAddress MapToIPv6()
{
    if (AddressFamily == AddressFamily.InterNetworkV6)
    {
        return this;
    }

    // ...
}

答案 1 :(得分:2)

将您的服务器IP:10.0.0.0更改为域名,例如db.test.com,这是Apple推荐的方法。

string input = "db.test.com";
IPAddress[] ads = Dns.GetHostAddresses (input);
string ips = ads[0];

答案 2 :(得分:0)

解决了吗?你不应该关心设备的AddressFamily,只关心远程ip AddressFamily。 IPAddress ip = IPAddress.Parse(input); Socket s = new Socket (ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 我用它,它的工作原理。