Откройте URL с Safari независимо от того, какой системный браузер установлен на

В моей программе objective-c мне нужно открыть URL-адрес в Safari независимо от того, какой браузер системы по умолчанию. Это означает, что это не сработает, потому что это может запустить Firefox или любой другой браузер:

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

Я думаю, что я близок с этим:

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

нужно только выяснить, как передать URL-адрес в качестве параметра... Есть ли более простой способ?

Спасибо!

Обновление: следующий код запускает Safari с URL-адресом, который я хочу, но Safari сразу заканчивается! Любые идеи, почему это?

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

Я наблюдал такое же поведение с LSOpenFromURLSpec. Если экземпляр Safari запущен, он работает нормально. Если экземпляр Safari не запущен, он запускает новый и немедленно завершает его.

Обновление 2: только для Safari для веб-сайтов с встроенной Flash. С помощью приведенного выше кода я могу открыть google.com просто отлично, однако Safari вылетает для видео на YouTube, например.

Ответ 1

Попробуйте метод OpenURLs из NSWorkspace:

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

Ответ 2

Используйте это, чтобы открыть URL-адрес в браузере по умолчанию...

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

Ответ 3

Два варианта, перечисленные выше, действительно работают на веб-сайтах, которые не включают флеш-ролики.

Сбой, который я описал, кажется, является ошибкой, которую можно даже воспроизвести с помощью одного Applescript. Я открыл для этого отдельный вопрос (AppleScript, чтобы открыть URL-адрес в авариях Safari для веб-сайтов на основе Flash)

Для записи ответ на мой вопрос - либо использовать LSOpenFromURLSpec, либо этот код:

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

Ответ 4

Вам не нужна инфраструктура AppKit. Просто реализуйте это.

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

[[UIApplication sharedApplication] openURL:url];