2010-06-03 8 views
10

En mi programa objetivo-c, necesito abrir una URL en Safari sin importar cuál sea el navegador predeterminado del sistema. Eso significa que esto no va a funcionar, porque podría lanzar Firefox o cualquier otro navegador:Abrir URL con Safari independientemente del navegador del sistema que esté configurado en

NSWorkspace * ws = [NSWorkspace sharedWorkspace]; 
[ws openURL: url]; 

creo que estoy cerca con esto:

[ws launchAppWithBundleIdentifier: @"com.apple.Safari" 
          options: NSWorkspaceLaunchWithoutActivation 
    additionalEventParamDescriptor: NULL 
       launchIdentifier: nil]; 

sólo tiene que encontrar la manera de pasar en la URL como parámetro ... ¿Hay una manera más fácil?

Gracias!

Actualización: El siguiente código inicia Safari con la URL que deseo, ¡pero Safari termina de inmediato! ¿Alguna idea de por qué es esto?

NSWorkspace * ws = [NSWorkspace sharedWorkspace]; 
[ws openURLs: urls withAppBundleIdentifier:@"com.apple.Safari" 
    options: NSWorkspaceLaunchDefault 
additionalEventParamDescriptor: NULL 
launchIdentifiers: NULL]; 

me observó el mismo comportamiento con LSOpenFromURLSpec. Si se está ejecutando una instancia de Safari, funciona bien. Si no se estaba ejecutando ninguna instancia de Safari, inicia una nueva y la finaliza de inmediato.

Actualización 2: Safari solo se bloquea para sitios web que tienen Flash incrustado. Con el código anterior, puedo abrir google.com muy bien, sin embargo, Safari falla para un video de YouTube, por ejemplo.

+0

'system ("Safari URL")' o algo similar no funciona? – barrycarter

+0

Desafortunadamente no. Intenté esto desde la Terminal. Safari se inicia pero trata la URL como un archivo local y, por lo tanto, no puede encontrarla. – Mark

+0

Esto me acercó, pero si Safari no se está ejecutando, se abre y finaliza de inmediato. No se ha informado de ningún error: NSString * safariFullPath = [[NSWorkspace sharedWorkspace] fullPathForApplication: @ "Safari"]; NSArray * urls = [NSArray arrayWithObject: url]; LSLaunchURLSpec urlSpec; urlSpec.appURL = (CFURLRef) [NSURL URLWithString: safariFullPath]; urlSpec.itemURLs = (CFArrayRef) urls; urlSpec.passThruParams = NULL; urlSpec.launchFlags = kLSLaunchAsync; urlSpec.asyncRefCon = NULL; OSStatus status = LSOpenFromURLSpec (& urlSpec, NULL); – Mark

Respuesta

5

probar el método de OpenURLs de NSWorkspace:

- (BOOL) openURLs:(NSArray *)urls 
     withAppBundleIdentifier:(NSString *)bundleIdentifier 
     options:(NSWorkspaceLaunchOptions)options 
     additionalEventParamDescriptor:(NSAppleEventDescriptor *)descriptor 
     launchIdentifiers:(NSArray **)identifiers 
2

Las dos opciones que se enumeran más arriba funcionan realmente para los sitios web que no incluyen películas Flash.

El error que describí parece ser un error que incluso se puede reproducir con un solo Applescript. Abrí una pregunta separada para este (AppleScript to open URL in Safari crashes for Flash-based websites)

Para el registro, la respuesta a mi pregunta es para cualquiera que use LSOpenFromURLSpec o este código:

NSWorkspace * ws = [NSWorkspace sharedWorkspace]; 
[ws openURLs: urls withAppBundleIdentifier:@"com.apple.Safari" 
    options: NSWorkspaceLaunchDefault 
    additionalEventParamDescriptor: NULL 
    launchIdentifiers: NULL]; 
+0

Hy Mark, si esto resolvió su problema ahora. Es posible que desee marcar su (u otro) como la respuesta a su pregunta. Si experimentas un accidente, creo que esto sería otro problema. – Besi

4

Utilice esta opción para abrir la URL en el navegador por defecto. ..

NSURL *url = [NSURL URLWithString:@"http://www.stackoverflow.com/"]; 
if(![[NSWorkspace sharedWorkspace] openURL:url]) 
    NSLog(@"Failed to open url: %@",[url description]); 
+2

Si bien esto abre una URL, creo que realmente no responde la pregunta. – Besi

2

No necesita un marco de trabajo de AppKit. Solo implemente esto.

NSURL *url = [NSURL URLWithString:@"http://www.apple.com"];  

[[UIApplication sharedApplication] openURL:url]; 
Cuestiones relacionadas