2011-09-16 31 views
27

Generalmente, utilizo: ShellExecute(0, 'OPEN', PChar(edtURL.Text), '', '', SW_SHOWNORMAL);¿Cómo abrir una URL con el navegador predeterminado con las aplicaciones multiplataforma de FireMonkey?

¿Cómo puedo tener el mismo comportamiento (la apertura de un enlace en el navegador por defecto), en todas las plataformas (Windows y OSX)?

+3

Usted debe enviar este solución como una respuesta y aceptarlo. Daré un +1 :-) –

+1

de acuerdo. Separa tus respuestas de las preguntas. Así es como se supone que debe hacerse aquí en StackOverflow :-) – LachlanG

+1

Ok, lo muevo ... por favor considera dar +1 a la respuesta de mjn ya que este código es solo una traducción de lo que me explicó; o) – Whiler

Respuesta

12

En el foro de discusión FireMonkey me encontré con este código para una consulta sobre NSWorkspace.URLForApplicationToOpenURL:

uses 
    Posix.Stdlib; 
.... 
    _system(PAnsiChar('open ' + ACommand)); 

(no probado por mí)


actualización: Posix no está disponible en Windows, por lo que no es posible escribir una solución que use las mismas llamadas al sistema operativo en todas las plataformas. Sugiero mover dicho código en una unidad central de 'XPlatform' que tenga algunos IFDEF POSIX, etc.

+0

Lo intento (en Windows) y le deja saber ... – Whiler

+0

; o (esta unidad no existe en XE2 ... – Whiler

+0

Entiendo el ifdef ...pero no sé cómo crear una aplicación con usos que no existen; o ( – Whiler

17

Respecto a la respuesta de mjn, he escrito la siguiente unidad. Lo probé con éxito en Windows, pero no tengo un OSX para probarlo en esta plataforma. Si alguien puede confirmar que funciona, lo agradecería.

unit fOpen; 

interface 

uses 
{$IFDEF MSWINDOWS} 
    Winapi.ShellAPI, Winapi.Windows; 
{$ENDIF MSWINDOWS} 
{$IFDEF POSIX} 
    Posix.Stdlib; 
{$ENDIF POSIX} 

type 
    TMisc = class 
    class procedure Open(sCommand: string); 
    end; 

implementation 

class procedure TMisc.Open(sCommand: string); 
begin 
{$IFDEF MSWINDOWS} 
    ShellExecute(0, 'OPEN', PChar(sCommand), '', '', SW_SHOWNORMAL); 
{$ENDIF MSWINDOWS} 
{$IFDEF POSIX} 
    _system(PAnsiChar('open ' + AnsiString(sCommand))); 
{$ENDIF POSIX} 
end; 

end. 

y yo lo llaman así:

TMisc.Open('https://stackoverflow.com/questions/7443264/how-to-open-an-url-with-the-default-browser-with-firemonkey-cross-platform-applic'); 
+3

Probado en Windows 32 y 64bits y en mac OSX: funciona; o) – Whiler

1

Y ahora un C++ versión (código OSx no probado, tampoco estoy seguro de la #DEF _POSIX):

#ifdef _Windows 
#include <Winapi.Windows.hpp> 
#endif // _Windows 
#ifdef _POSIX 
#include <Posix.Stdlib.h> 
#endif // _POSIX 

void OpenCommand(String _sCommand) 
{ 
    #ifdef _Windows 
    ShellExecute(0, _T("open"), _sCommand.c_str(), _T(""), _T(""), SW_SHOWNORMAL); 
    #endif // _Windows 
    #ifdef _POSIX 
    _system(AnsiString("open " + AnsiString(_sCommand)).c_str()); 
    #endif // _POSIX 
} 
3

XE2 C++ código probado con éxito (Windows 7 64 y OSX Lion), mejoras menores. Whiler de agradecimiento, el dolor es más :)

#include <fmx.h> 
// --------------------------------------------------------------------------- 
#ifdef _WIN32 
#include <shellapi.h> 
#endif// Windows 
#ifdef TARGET_OS_MAC 
#include <Posix.Stdlib.hpp> 
#endif // Mac 

void OpenCommand(String _sCommand) { 
    #ifdef _Windows 
    String open = "open"; 
    ShellExecute(0, open.w_str(), _sCommand.c_str(), NULL, NULL, SW_SHOWNORMAL); 
    #endif // Windows 

    #ifdef TARGET_OS_MAC 
    system(AnsiString("open " + AnsiString(_sCommand)).c_str()); 
    #endif // Mac 
} 
+0

Tenga cuidado ... algunos caracteres pueden generar problemas ... por ejemplo, pruebe una URL con '()' ... '()' interpretados por 'abrir' ... necesita encapsular la URL con''' ; o) – Whiler

0
_system(PAnsiChar('open ' + AnsiString(sCommand))); 

no funciona si cadena de dirección URL (sCommand) incluye carbón comercial (&), necesarios para especificar muchos argumentos en cadena de consulta.

URL enviada a def. el navegador en OSX (Safari) se trunca en la primera aparición de &.

1

Como se menciona @NicoBlu, la solución aceptada parece truncar la URL después de la primera aparición de '&'. Aquí es lo que funciona para mí sin truncamiento:

uses Macapi.AppKit, Macapi.Foundation, Macapi.Helpers; 

// ... 

procedure OpenLinkInDefaultBrowser(const Link: string); 
    var URL : NSURL; 
     Workspace : NSWorkspace; 
begin 
    URL := TNSURL.Wrap(TNSURL.OCClass.URLWithString(StrToNSStr(Link))); 
    Workspace := TNSWorkspace.Wrap(TNSWorkspace.OCClass.sharedWorkspace); 
    Workspace.openURL(URL); 
end; 
0
LEncodedString : String; 

begin 
    LEncodedString := TIdURI.URLEncode('http://www.malcolmgroves.com'); 
    sharedApplication.openURL(StringToNSURL(LEncodedString)); 
end; 
+0

donde hace eso sharedA pplication objeto provienen? –

+0

buena pregunta @ TuncayGöncüoğlu! No tengo acceso a mi proyecto para el fin de semana, así que no estoy 100% seguro, pero eche un vistazo al ejemplo del código de la primera respuesta [link] (https://stackoverflow.com/questions/16354876/opening-url- dentro de ios-aplicación) –

2

Para todas las plataformas (Windows, MacOS, iOS y Android), puede utilizar la unidad que escribí para my blog

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. 
Cuestiones relacionadas