2016-07-27 22 views
2

Wir haben eine iOS-App, die Client - Server App ist. Wir verwenden eine SQL-Verbindung und WCF-Webdienste in der iOS-App mit Xamarin.Xamarin iOS IPv6 App Store Ablehnung

SQL-Verbindung Code:

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

von Apple entschieden, nur auf iOS9 IPv6 zu verwenden, so dass sie veröffentlichte ein Dokument über IPv6-Kompatibilität - IPv6 Documentation

Xamarin eine Blog-Post über diese auch veröffentlicht - Making Your iOS Apps IPv6 Ready

Ich lese alle diese Dokumente, aber ich konnte es nicht schaffen, dieses "Store Rejection" -Problem loszuwerden.

ich Ihnen meine letzte attemp zeigen will: (IPv4 zu 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; 
       } 
      } 

Ich benutzen die MapToIPv6() Funktion wie in dem Xamarin Blog-Beitrag beschrieben, aber auch hier wurde mein App von Apple abgelehnt.

Unsere App funktioniert gut auf IPv4 (Apple sagt das auch). Wenn Apple-Techniker ipv4 ausschalten und nur IPv6 verwenden, konnte unsere App den Host nicht erreichen.

Bitte helfen Sie mir, dieses Problem zu lösen.

Plattform: Visual Studio 2015 mit Xamarin unter Windows 10 + Mac OS X El-Capitan

Server: ON nur IPv4.

+0

Sind Sie tatsächlich mit IPv6-Adressierung, wie Sie ipv4 Beispiele zeigen ... 10.0.0.1 2002 wäre: 0A00: 0001 :: 0A00: 0001/0: 0: 0: 0: 0: FFFF: 0A00: 0001 Aber natürlich 10.xxx sind private/interne Netzwerkadressen ... Kannst du einen Hostnamen verwenden, der in ipv4 und 6 aufgelöst werden kann? – SushiHangover

+0

Haben Sie es selbst ausprobiert? Sind Sie sicher, dass SQLConnection mit IPv6-Adressen arbeitet?Schließlich wird die direkte Verbindung zu einem Datenbankserver von einem mobilen Client in der Regel als ein enormes ** Sicherheitsrisiko betrachtet – Jason

+0

yeap. SQLConcetion geeignet mit ipv6 als auf einem Microsoft-Dokument entschlüsselt. Unser Bereich gibt es keine IPv6-Unterstützung :) –

Antwort

3

Es gibt bereits einige hilfreiche Sachen in den Kommentaren, aber ich denke, dass Ihr Hauptproblem darin besteht, dass Sie umgekehrt IPv4 zu IPv6 zugeordnet haben. Sie beließen die IPv4-Adresse unverändert und ordneten die IPv6-Adresse IPv6 zu, was sie bereits war.

Werfen Sie einen Blick auf die feste Version:

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; 
    } 
} 

für sich selbst sehen Sie einen Blick auf die Reference Source nehmen. Von dort sehen Sie, dass in Ihrem Beispiel AddressFamily war InterNetworkV6, so dass die MapToIPv6 Methode nur die IPAddress unverändert zurückgibt, weil es nichts zu ändern gibt.

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

    // ... 
} 
+0

aber in Ihrem Code, wenn das Gerät auf IPv4 ist, dann übersetzen Eingang (IPv4) auf IPv6? Ergebnis [:: :: 10.0 .. ..] –

+0

Es ist eigentlich nicht über das Gerät. im Beispiel haben wir eine IP-Adresse haben '10.0.0.0', die eindeutig eine IPv4-Adresse ist. wir haben dann eine neue Instanz von' IPAddress' Klasse erstellen die Verwendung von die 'AddressFamily' dieser IP-Eingang und überprüfen. Also haben wir nicht besorgt über das Gerät, nur das Format unserer IP-Adresse (Eingang) sind. Sie können einen Blick auf die [IPAddress] nehmen (http://referencesource.microsoft .com/# System/net/System/Net/IPAddress.cs, 966bd1c3b2dc55c7) Klasse, um zu sehen, dass die 'AddressFamily' im Konstruktor definiert ist, wenn Sie eine neue Instanz dieser Klasse erstellen. – hankide

+0

denke ich, Apfel IPv6-Server nicht direkt erreichen kann zu IPv4-Adressen Ich denke, ips sollte zu ipv konvertieren 6. Stimmst du dem zu? @hankide. übrigens Thaks viel –

0

Haben Sie es gelöst? Sie sollten sich nicht um AddressFamily des Geräts kümmern, kümmern Sie sich nur um Remote-IP AddressFamily. IPAddress ip = IPAddress.Parse(input); Socket s = new Socket (ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp); Ich habe es benutzt, und es funktioniert.

+0

Leider ungelöst. Ich verbrachte 1 Woche, um iOs-Anwendung zu bauen, und ich verbrachte 4 Mounts, um Ablehnung zu lösen. Aber ich konnte es nicht lösen :( –

1

Ändern Sie Ihre Server-IP: 10.0.0.0 in den Domänennamen, wie z. B. db.test.com, es ist Apples empfohlene Vorgehensweise.

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