Xamarin iOS的IPv6应用程序商店拒绝

问题描述:

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

SQL连接代码:

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

苹果决定使用只在iOS9 IPV6,所以他们出版了一本有关IPv6的兼容性文档 - IPv6 Documentation

Xamarin的一篇博客这个太 - Making Your iOS Apps IPv6 Ready

我阅读了所有这些文档,但无法摆脱这种“商店拒绝”问题。

我想告诉你我最后的学尝试:(IPv4到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; 
       } 
      } 

我用了MapToIPv6()功能在Xamarin博客中,但同样我的应用程序被苹果拒绝。

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

请帮我解决这个问题。

平台:Visual Studio的2015年与Xamarin的Windows 10 + Mac OS X的埃尔 - 匹

服务器上:仅在IPv4。

+0

你实际使用IPv6寻址为你呈现IPv4的例子...... 10.0.0.1会2002:?0A00:0001 :: 0A00:0001/0:0:0:0:0:FFFF: 0A00:0001但是当然10.xxx是私有/内部网络地址......你能使用可以在ipv4和6中解析的主机名吗? – SushiHangover

+0

你自己试过了吗?你确定SQLConnection与IPv6地址一起工作吗?最后,从移动客户端直接连接到数据库服务器通常被认为是**巨大的安全风险 – Jason

+0

yeap。适用于ipv6的SQLConnce适用于微软文档。我们的地区没有ipv6的支持:) –

在评论中已经有一些有用的东西,但我认为你的主要问题是你有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; 
    } 

    // ... 
} 
+0

但在你的代码,如果设备在IPv4上,然后翻译输入(ipv4)到ipv6? :: 10.0 .. ..] –

+0

这实际上并不是关于设备的,在这个例子中,我们有一个IP地址“10.0.0.0”,它显然是一个IPv4地址,然后我们创建一个新的IPAddress类实例,使用输入并检查该IP的AddressFamily,所以我们不关心这个设备,只是我们的IP地址格式(输入),你可以看一下[IPAddress](http://referencesource.microsoft .com /#System/net/System/Net/IPAddress.cs,966bd1c3b2dc55c7)类,看看在创建该类的新实例时,AddressFamily是在构造函数中定义的。 – hankide

+0

我认为apple IPv6服务器无法直接访问到IPv4地址,我认为ips应该转换为ipv 6。你同意吗? @hankide。顺便说一句Thaks很 –

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

+0

不幸未解决。我花了1周的时间来构建iOs应用程序,并花了4个坐骑来解决拒绝问题。但我无法解决它:( –

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

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