2010-06-03 5 views
10
eingestellt ist.

In meinem objective-c-Programm muss ich in Safari eine URL öffnen, unabhängig vom Standardbrowser des Systems. Das bedeutet, dass dies nicht funktionieren wird, weil es Firefox oder was auch immer anderen Browser starten könnte:Öffnen Sie die URL mit Safari, unabhängig davon, welcher Systembrowser auf

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

Ich glaube, ich bin in der Nähe mit diesem:

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

nur brauchen, um herauszufinden, wie man passiert in der URL als Parameter ... Gibt es einen einfacheren Weg?

Danke!

Update: Der folgende Code startet Safari mit der URL, die ich möchte, aber Safari wird sofort beendet! Irgendwelche Ideen, warum das ist?

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

Ich beobachtete das gleiche Verhalten mit LSOpenFromURLSpec. Wenn eine Safari-Instanz ausgeführt wird, funktioniert das problemlos. Wenn keine Safari-Instanz ausgeführt wurde, startet sie eine neue und beendet sie sofort.

Update 2: Safari stürzt nur für Websites ab, die über Flash verfügen. Mit dem obigen Code kann ich google.com problemlos öffnen, Safari stürzt jedoch beispielsweise bei einem YouTube-Video ab.

+0

'System ("Safari URL") oder etwas Ähnliches funktioniert nicht? – barrycarter

+0

Leider nicht. Ich habe das vom Terminal aus versucht. Safari wird gestartet, behandelt die URL jedoch als lokale Datei und kann sie daher nicht finden. – Mark

+0

Das brachte mich in die Nähe, aber wenn Safari nicht bereits läuft, wird es sofort geöffnet und beendet. Kein Fehler gemeldet: 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

Antwort

5

Versuchen Sie, die OpenURLs Methode von NSWorkspace:

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

Die beiden Optionen, die ich oben tatsächlich für Websites aufgelistet zu arbeiten, die Flash-Filme nicht enthalten.

Der von mir beschriebene Absturz scheint ein Fehler zu sein, der sogar mit einem einzigen Applescript reproduziert werden kann. Ich öffnete eine separate Frage für diese (AppleScript to open URL in Safari crashes for Flash-based websites)

Für das Protokoll, ist die Antwort auf meine Frage entweder LSOpenFromURLSpec oder diesen Code zu verwenden:

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

Hy Mark, wenn das Ihr Problem jetzt gelöst hat. Vielleicht möchten Sie Ihre (oder eine andere) als Antwort auf Ihre Frage markieren. Wenn Sie einen Absturz erleben, denke ich, dass dies ein anderes Problem wäre. – Besi

4

verwenden Sie die URL im Standard-Browser zu öffnen. ..

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

Während dies eine URL öffnet, denke ich, dass es die Frage nicht wirklich beantwortet. – Besi

2

Sie benötigen kein AppKit-Framework. Implementiere das einfach.

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

[[UIApplication sharedApplication] openURL:url]; 
Verwandte Themen