2010-06-03 14 views
10

W moim programie celu-c muszę otworzyć URL w Safari bez względu na to, jaka jest domyślna przeglądarka systemu. Oznacza to, że to nie będzie działać, ponieważ mogłoby to uruchomić Firefoksa lub cokolwiek innego przeglądarkę:Otwórz URL w Safari bez względu na to, jaka przeglądarka systemu jest ustawiona na

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

myślę, że jestem blisko z tym:

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

wystarczy, aby dowiedzieć się, jak przekazać w adresie URL jako parametrze ... Czy istnieje łatwiejszy sposób?

Dzięki!

Aktualizacja: Poniższy kod uruchamia Safari z żądanym adresem URL, ale Safari kończy działanie natychmiast! Jakieś pomysły, dlaczego tak jest?

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

Podobne zachowanie zaobserwowałem z LSOpenFromURLSpec. Jeśli działa instancja Safari, działa poprawnie. Jeśli żadna instancja Safari nie jest uruchomiona, uruchamia nową i kończy ją natychmiast.

Aktualizacja 2: Safari zawiesza się tylko w witrynach internetowych z wbudowanym Flash. Dzięki powyższemu kodowi mogę otworzyć stronę google.com, ale Safari zawiesza się na przykład w filmie na YouTube.

+0

"System (" Safari URL ")" lub coś podobnego nie działa? – barrycarter

+0

Niestety nie. Próbowałem tego z Terminalu. Safari uruchamia się, ale traktuje URL jako plik lokalny i dlatego nie może go znaleźć. – Mark

+0

To mnie zbliżyło, ale jeśli Safari jeszcze nie działa, to otwiera się i kończy natychmiast. Nie zgłoszono żadnego błędu: NSString * safariFullPath = [[NSWorkspace sharedWorkspace] fullPathForApplication: @ "Safari"]; NSArray * urls = [NSArray arrayWithObject: url]; LSLaunchURLSpec urlSpec; urlSpec.appURL = (CFURLRef) [NSURL URLWithString: safariFullPath]; urlSpec.itemURLs = (CFArrayRef) adresy URL; urlSpec.passThruParams = NULL; urlSpec.launchFlags = kLSLaunchAsync; urlSpec.asyncRefCon = NULL; Status OSStatus = LSOpenFromURLSpec (& urlSpec, NULL); – Mark

Odpowiedz

5

spróbować metody OpenURLs z NSWorkspace:

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

Dwie opcje I wymienione powyżej faktycznie pracują dla stron, które nie zawierają filmów Flash.

Opisana przeze mnie awaria wydaje się być błędem, który można nawet odtworzyć za pomocą jednego Applescript. Otworzyłem oddzielny pytanie do tego (AppleScript to open URL in Safari crashes for Flash-based websites)

Dla przypomnienia, w odpowiedzi na moje pytanie jest, aby użyć LSOpenFromURLSpec czy ten kod:

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

Hy Mark, jeśli to rozwiązało twój problem teraz. Możesz oznaczyć swoją (lub inną) jako odpowiedź na swoje pytanie. Jeśli wystąpi awaria, myślę, że to byłby kolejny problem. – Besi

4

Użyj tego, aby otworzyć URL w przeglądarce domyślnej. ..

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

Podczas otwierania adresu URL, myślę, że tak naprawdę nie odpowiada na pytanie. – Besi

2

Nie potrzebujesz frameworka AppKit. Po prostu to zaimplementuj.

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

[[UIApplication sharedApplication] openURL:url]; 
Powiązane problemy