OpenUrl 的跨平台实现

时间:2021-05-11 19:53:59

OpenUrl 是 iOS 中 UIApplication 提供的一个函数,用于调用其它程序。实际上各个平台都有自己的实现,这里提供一个直接封装完的跨平台版本给大家。

 
 
 
 
 

Delphi/Pascal

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
uses {$IFDEF MACOS}{$IFDEF IOS}FMX.helpers.ios{$ELSE}
  sysutils,posix.stdlib{$ENDIF}{$ENDIF}{$IFDEF MSWINDOWS}windows,
  shellapi{$ENDIF}{$IFDEF ANDROID}Androidapi.JNI.App,Androidapi.JNI.JavaTypes,
  Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Net,
  Androidapi.helpers{$ENDIF};
 
procedure OpenUrl(const AUrl: String; const ADataType: String = '');
{$IF DEFINED(ANDROID)}
var
  intent: JIntent;
begin
  intent := TJIntent.Create;
  intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
  if Length(ADataType) > 0 then
    intent.setDataAndType(TJnet_Uri.JavaClass.parse(StringToJString(AUrl)),
      StringToJString(ADataType))
  else
    intent.SetData(TJnet_Uri.JavaClass.parse(StringToJString(AUrl)));
  intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  TAndroidHelper.Activity.startActivity(intent);
{$ELSEIF DEFINED(MSWINDOWS)}
begin
  ShellExecute(0, nil, PChar(AUrl), nil, nil, SW_SHOWNORMAL);
{$ELSE}
begin
{$IFDEF IOS}
  SharedApplication.OpenUrl(StrToNSUrl(AUrl));
{$ELSE}
  _system(MarshaledAString(TEncoding.Default.GetBytes('open ' + AUrl)));
{$ENDIF}
{$ENDIF}
end;

比如我们在某个平台(Windows、OSX、Android 和 iOS 之一)调用默认的浏览器打开百度,只需要:

 
1
OpenUrl('http://www.baidu.com');

就可以了。

http://blog.qdac.cc/?p=3999