2016-08-24 1 views
0

Nous utilisons RAD Studio 10.0 Seattle pour créer une application iOS qui reçoit des données via les services Web. Depuis qu'Apple exige que toutes les applications prennent en charge IPv6 à partir du 1er juin 2016, la mise à jour de notre application a été rejetée.Delphi iOS IPv6 App Store Rejet

Nous utilisons le WSDL Importer pour créer la classe de service Web dans RAD Studio, puis appelez les services Web. Lorsque l'application se connecte à un réseau IPv6, elle lance un Socket Error #51 Network is unreachable....

Est-ce que quelqu'un sait comment nous pourrions résoudre ce problème?

+3

Il n'y a pas de XE10. Utilisez-vous 10.0 Seattle ou 10.1 Berlin? Dans tous les cas, vous devriez contacter Embarcadero pour obtenir de l'aide, ils devront probablement fournir un correctif pour le support IPv6. Dans le cas contraire, vous devrez peut-être arrêter d'utiliser leur infrastructure WebService et écrire votre propre WebService à partir de zéro, comme avec le 'TIdHTTPServer' d'Indy, qui prend en charge IPv6. –

+1

@Remy J'ai même dû corriger les auteurs de QuickReports parce qu'ils avaient largement diffusé leur dernière version en utilisant "XE10" partout. En outre, pour tout ce que nous savons, 10.1 Berlin aurait déjà introduit une solution qui n'était pas en 10.0 Seattle. –

+0

Merci @RemyLebeau pour la correction. J'utilise 10.0 Seattle. Nous allons essayer de contacter Embarcadero pour voir s'ils ont une solution pour cela. – Cheez

Répondre

0

Essayez avec cette func:

function GetHost(Host: String): Boolean; 
begin 
    result := ''; 
    try 
    GStack.ResolveHost(Host, TIdIPVersion.Id_IPv6); 
    result := '[' + Host + ']'; 
    except 
    GStack.ResolveHost(Host, TIdIPVersion.Id_IPv4); 
    result := Host; 
    end; 
end; 

Ajouter dans votre Utilise "IdStack" et "IdGlobal"

vous devez passer votre hôte (www.google.com par exemple) et la fonction func renvoie un résultat avec ou sans '['.

Maintenant, vous devez simplement l'utiliser ... 'http: //' + getHost ('www.google.com')

si vous êtes dans le réseau IPV6 la chaîne finale sera (http://[www.google.com])

0

En utilisant la réponse précédente, j'ai trouvé ce code, qui fonctionne pour moi. Je peux entrer l'URL complète du savon et il renvoie un IPV4 correct de l'URL IPV6. Inclure 'idURI' dans la section uses.

class function TPortalTools.GetRealUrl(Url: string): string; 
var 
    IdURI: TIdURI; 
begin 
    TIdStack.IncUsage; 
    IdURI := TIdURI.Create(Url); 
    try 
    try 
     GStack.ResolveHost(IdURI.Host, TIdIPVersion.Id_IPv6); 
     IdURI.IPVersion := TIdIPVersion.Id_IPv6; 
    except 
     IdURI.IPVersion := TIdIPVersion.Id_IPv4; // Just in case. 
    end; 

    // Put it back together. 
    Result := IdURI.GetFullURI([]); 
    finally 
    FreeAndNil(IdURI); 
    TIdStack.DecUsage; 
    end; 
end;