如何通过IPv6正确打开网址?

时间:2018-08-01 23:47:23

标签: ios delphi url delphi-10.2-tokyo

我已经在iOS和Android应用程序中编写了一个打开网址的功能。我相信该代码将因未通过IPv6连接而被iTunes Connect拒绝。

当我通过Delphi构建它时,此函数也会引发错误:

  

在错误地址00000001017C4334发生访问冲突。 (访问地址000000000000000时)

我正在Indel 10上使用Delphi 10.2.3 Tokyo。

如何解决此错误?我的代码如下:

Procedure OpenGoogleForm; 
Var
  ipversion : String; 
Begin 
  //  For IPv6 
  IdTCPClient1.IPVersion:=Id_IPv4;  // <--  try IPv4 first 
  IdTCPClient1.Host:=MY_IP; 
  try 
    IdTCPClient1.Connect; 
    result:=true; 
    ipversion := 'IPv4';      // <-- will tell us what ip version to use 
  except 
  end; 

  if IdTCPClient1.Connected=false then 
  begin 
    try 
      IdTCPClient1.IPVersion:=Id_IPv6;  // <--  now try IPv6 
      IdTCPClient1.Connect; 
      result:=true; 
      ipversion:='IPv6';    // <-- will tell us what ip version to use 
      except 
    end; 
  end; 

  //  open url 
  {$IFDEF ANDROID} 
  Intent := TJIntent.Create; 
  Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);

  Intent.setData(StrToJURI('https://docs.google.com/forms/xxxx')); 
  SharedActivity.startActivity(Intent); 
  {$ENDIF} 

  {$IFDEF IOS} 
  SharedApplication.openURL(StrToNSUrl('https://docs.google.com/forms/xxxx')); 
  {$ENDIF} 

End; 

1 个答案:

答案 0 :(得分:3)

错误消息告诉您正在访问nil指针,因此您需要对其进行追查。

但是,根本没有理由在打开URL之前执行手动TCP检查。您正在生成一个外部应用程序以打开URL,因此请让该应用程序根据需要处理连接错误。特别是因为如果两个Connect()调用均失败,则无论如何都要继续打开URL。因此,只需从您的过程中完全删除TIdTCPClient,它就不属于那里。这可能就是您的nil指针的来源。

procedure OpenGoogleForm; 
begin 
  {$IFDEF ANDROID} 
  Intent := TJIntent.Create; 
  Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
  Intent.setData(StrToJURI('https://docs.google.com/forms/xxxx')); 
  SharedActivity.startActivity(Intent); 
  {$ENDIF} 

  {$IFDEF IOS} 
  SharedApplication.openURL(StrToNSUrl('https://docs.google.com/forms/xxxx')); 
  {$ENDIF} 
end;