Ouvrir un site web dans le navigateur par défaut depuis une application Firemonkey

Ouvrir une page web depuis un bouton, c'est un classique de la programmation depuis qu'Internet est partout. Pour cela il faut généralement faire un appel au système d'exploitation en lui demandant l'ouverture de la ressource "url" désirée. Il lance alors le butineur par défaut et affiche la page demandée lorsqu'elle existe.

Cette simple fonctionnalité n'est cependant pas toujours aisée à mettre en place.

Avec Firemonkey il faut en effet le faire pour toutes les plateformes gérées : Windows, OS X, iOS et Android. Bien entendu chacune a sa propre façon de lancer un appel système.

Lorsque je me suis posé la question, j'ai commencé par chercher dans la documentation de RAD Studio 10 Seattle sans succès, puis je me suis rabattu sur Google. De nombreux forums traitent de la question, mais aucune solution proposée n'est soit complète, soit d'actualité (certaines unités ayant changé de nom et des fonctions ayant été déplacées entre les dernières versions de RAD Studio ou Delphi).

En rapprochant les bouts de code qui fonctionnent, j'en suis arrivé à cette unité qu'il suffit d'inclure dans un projet Firemonkey.

unit u_urlOpen;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes,
  System.Variants,
{$IF Defined(IOS)}
  macapi.helpers, iOSapi.Foundation, FMX.helpers.iOS;
{$ELSEIF Defined(ANDROID)}
Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.Net,
   Androidapi.JNI.App,
  Androidapi.helpers;
{$ELSEIF Defined(MACOS)}
Posix.Stdlib;
{$ELSEIF Defined(MSWINDOWS)}
Winapi.ShellAPI, Winapi.Windows;
{$ENDIF}

type
  tUrlOpen = class
    class procedure Open(URL: string);
  end;

implementation

class procedure tUrlOpen.Open(URL: string);
{$IF Defined(ANDROID)}
var
  Intent: JIntent;
{$ENDIF}
begin
{$IF Defined(ANDROID)}
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
  Intent.setData(StrToJURI(URL));
  tandroidhelper.Activity.startActivity(Intent);
  // SharedActivity.startActivity(Intent);
{$ELSEIF Defined(MSWINDOWS)}
  ShellExecute(0, 'OPEN', PWideChar(URL), nil, nil, SW_SHOWNORMAL);
{$ELSEIF Defined(IOS)}
  SharedApplication.OpenURL(StrToNSUrl(URL));
{$ELSEIF Defined(MACOS)}
  _system(PAnsiChar('open ' + AnsiString(URL)));
{$ENDIF}
end;

end.

L'appel se fait simplement par :

tUrlOpen.Open('http://www.developpeur-pascal.fr');

Simple, non ?


Mug Pascal case in AlexandrieMug Toucan DX dans la baie de Rio