2016-08-24 11 views
0

Мы используем RAD Studio 10.0 Seattle для создания приложения iOS, которое получает данные через веб-службы. Поскольку Apple требует, чтобы все приложения поддерживали IPv6 с 1 июня 2016 года, наше обновление приложения было отклонено.Delphi iOS IPv6 App Store Rejection

Мы используем импортщик WSDL, чтобы создать класс веб-сервиса в RAD Studio, а затем вызвать веб-службы. Когда приложение подключается к сети IPv6, оно выдает Socket Error #51 Network is unreachable....

Кто-нибудь знает, как мы могли бы исправить эту проблему?

+3

Нет XE10. Вы используете 10.0 Сиэтл, или 10.1 Берлин? В любом случае вам следует обратиться за помощью к Embarcadero, возможно, им придется предоставить исправление для поддержки IPv6. В противном случае вам, возможно, придется прекратить использование своей инфраструктуры WebService и написать свой собственный WebService с нуля, например, с помощью TIdHTTPServer Indy, который поддерживает IPv6. –

+1

@Remy Мне даже пришлось исправить авторов QuickReports, потому что они широко распространили свою последнюю версию, используя «XE10» повсюду. Кроме того, насколько нам известно, 10.1 Берлин, возможно, уже ввел исправление, которое не было в 10.0 Сиэтле. –

+0

Спасибо @RemyLebeau за исправление. Я использую 10.0 Сиэтл. Мы попытаемся связаться с Embarcadero, чтобы узнать, есть ли у них исправление. – Cheez

ответ

0

Попробуйте с этим 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; 

Добавить в вашем Использует "IdStack" и "IdGlobal"

вы должны пройти ваш хост (www.google.com, например) и func возвращает результат с или без '['.

Теперь, вы должны просто использовать его ... 'HTTP: //' + getHost ('www.google.com')

, если вы находитесь в сети IPV6 конечная строка будет (http://[www.google.com])

0

Используя предыдущий ответ, я придумал этот код, который работает для меня. Я могу ввести полный URL-адрес мыла, и он вернет правильный IPV4 URL-адреса IPV6. Включите 'idURI' в раздел использования.

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;