我们一直在构建一个关于客户端 - 服务器应用程序的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。
答案 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。从那里您可以看到,在您的示例中,AddressFamily
为InterNetworkV6
,因此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);
我用它,它的工作原理。