首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >德尔福iOS IPv6麻烦。请确保您的应用程序与IPv6网络兼容。

德尔福iOS IPv6麻烦。请确保您的应用程序与IPv6网络兼容。
EN

Stack Overflow用户
提问于 2017-04-05 22:11:13
回答 1查看 693关注 0票数 0

我不能把我的iOS应用程序发布到AppStore上。

德尔菲10.1.2柏林,iOS64,获胜8.1。

我收到了苹果公司的下一个信息:

感谢您的回复。 请确保您的应用程序与IPv6网络兼容。 测试应用程序以实现IPv6兼容性的最简单方法是在Mac上建立一个本地IPv6网络。然后,您可以从iOS设备连接到网络,以测试IPv6兼容性。 请遵循支持IPv6 DNS64 64/NAT64 64网络中提供的分步操作说明. 有关支持IPv6网络的其他信息,请查看支持IPv6 6专用网络.

是连接密码。

代码语言:javascript
复制
     if (FSocket<>nil) then
     begin
          if not FSocket.Connected then
          begin
               SetState(mwtrstDisConnected);
               FSocket.Free;
               FSocket:=nil;
          end
          else
              exit;
     end;

     FSocket:=TIdTCPClient.Create(nil);
     FSocket.Host:=FHost;
     FSocket.Port:=FPort;

//CheckCode


{$ifdef KBMMW_USING_INDY_9_OR_NEWER}
     FSocket.BoundPortMin:=FMinClientPort;
     FSocket.BoundPortMax:=FMaxClientPort;
{$endif}

{$IFDEF KBMMW_USING_INDY_10}
     FSocket.ReadTimeout:=RequestTimeout*1000;
     FSocket.ConnectTimeout:=ConnectTimeout*1000;
{$ENDIF}
{$IFDEF KBMMW_USING_INDY_8_00_23}
     FSocket.Connect;
{$ELSE}
 {$IFDEF KBMMW_USING_INDY_9}
     FSocket.Connect(ConnectTimeout*1000);
 {$ELSE}
     FSocket.Connect;
 {$ENDIF}
{$ENDIF}
     DoConnected(Info);

在我看来,我必须将下一个代码插入//CheckCode位置。

代码语言:javascript
复制
  TIdStack.IncUsage;
  IdURI := TIdURI.Create('195.34.x.x');
  try
    try
      ss := GStack.ResolveHost(IdURI.Host, TIdIPVersion.Id_IPv6);
      IdURI.IPVersion := TIdIPVersion.Id_IPv6;
    except
      IdURI.IPVersion := TIdIPVersion.Id_IPv4; // Just in case.
    end;

    //ShowMessage(ss);
  finally
    FreeAndNil(IdURI);
    TIdStack.DecUsage;
  end;

但是这个代码(GStack.ResolveHost)不适用于iOS。

如何解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2017-04-06 17:35:03

尝试更像这样的东西:

代码语言:javascript
复制
FSocket := TIdTCPClient.Create(nil);
FSocket.Host := FHost;
FSocket.Port := FPort;

{$IFDEF KBMMW_USING_INDY_9_OR_NEWER}
FSocket.BoundPortMin := FMinClientPort;
FSocket.BoundPortMax := FMaxClientPort;
{$ENDIF}

{$IFDEF KBMMW_USING_INDY_10}
FSocket.ReadTimeout := RequestTimeout*1000;
FSocket.ConnectTimeout := ConnectTimeout*1000;

// check if connecting to an IPv4/IPv6 address directly...
if GStack.IsIP(FHost) then // only checks for IPv4 right now
begin
  FSocket.IPVersion := Id_IPv4;
  FSocket.Connect;
end
else if MakeCanonicalIPv6Address(FHost) <> '' then
begin
  FSocket.IPVersion := Id_IPv6;
  FSocket.Connect;
end
else begin
  // connecting to a hostname, try IPv6 first, then fallback to IPv4...
  try
    FSocket.IPVersion := Id_IPv6;
    FSocket.Connect;
  except
    FSocket.IPVersion := Id_IPv4;
    FSocket.Connect;
  end;
end;
{$ELSE}
  // only IPv4 is supported...
  {$IFDEF KBMMW_USING_INDY_9}
FSocket.Connect(ConnectTimeout*1000);
  {$ELSE}
FSocket.Connect;
  {$ENDIF}
{$ENDIF}

DoConnected(Info);

另一种选择是:

代码语言:javascript
复制
var
  LIPAddress: TIdIPAddress;
  LLocalIPs: TIdStackLocalAddressList;
  TryIPv4, TryIPv6: Boolean;
  I: Integer;

...

FSocket := TIdTCPClient.Create(nil);
FSocket.Host := FHost;
FSocket.Port := FPort;

{$IFDEF KBMMW_USING_INDY_9_OR_NEWER}
FSocket.BoundPortMin := FMinClientPort;
FSocket.BoundPortMax := FMaxClientPort;
{$ENDIF}

{$IFDEF KBMMW_USING_INDY_10}
FSocket.ReadTimeout := RequestTimeout*1000;
FSocket.ConnectTimeout := ConnectTimeout*1000;

LIPAddress := TIdIPAddress.MakeAddressObject(FHost);
if LIPAddress <> nil then
begin
  // connecting to an IPv4/IPv6 address...
  FSocket.IPVersion := LIPAddress.AddrType;
  LIPAddress.Free;
  FSocket.Connect;
end else
begin
  // connecting to a hostname...

  TryIPv4 := False;
  TryIPv6 := False;

  LLocalIPs := TIdStackLocalAddressList.Create;
  try
    GStack.GetLocalAddressList(LLocalIPs);
    for I := 0 to LLocalIPs.Count-1 do
    begin
      case LLocalIPs[I].IPVersion of
        Id_IPv4: TryIPv4 := True;
        Id_IPv6: TryIPv6 := True;
      end;
    end;
  finally
    List.Free;
  end;

  if TryIPv6 then
  begin
    try
      FSocket.IPVersion := Id_IPv6;
      FSocket.Connect;
      TryIPv4 := False;
    except
      if not TryIPv4 then
        raise;
    end;
  end;

  if TryIPv4 then
  begin
    FSocket.IPVersion := Id_IPv4;
    FSocket.Connect;
  end;

  if not (TryIPv4 or TryIPv6) then
    raise Exception.Create('Not connected to an IPv4 or IPv6 network');
end;
{$ELSE}
  // only IPv4 is supported...
  {$IFDEF KBMMW_USING_INDY_9}
FSocket.Connect(ConnectTimeout*1000);
  {$ELSE}
FSocket.Connect;
  {$ENDIF}
{$ENDIF}

DoConnected(Info);

请注意,一旦Indy实现了以下特性,这种情况将变得更容易处理,但我认为这是一种很遥远的方法:

支持循环DNS (支持连接到IPv6 4/IPv6 6主机名)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43242485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档