无论系统浏览器设置为何,都可以使用Safari打开URL

时间:2010-06-03 11:50:08

标签: safari nsworkspace launch-services

在我的objective-c程序中,无论系统的默认浏览器是什么,我都需要在Safari中打开一个URL。这意味着这不起作用,因为它可以启动Firefox或其他任何浏览器:

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

我想我很接近这个:

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

只需要弄清楚如何传递URL作为参数......有更简单的方法吗?

谢谢!

更新:以下代码使用我想要的URL启动Safari,但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视频。

4 个答案:

答案 0 :(得分:5)

尝试NSWorkspace中的OpenURLs方法:

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

答案 1 :(得分:4)

使用此功能在默认浏览器中打开网址...

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

答案 2 :(得分:2)

我上面列出的两个选项实际上适用于不包含Flash电影的网站。

我描述的崩溃似乎是一个甚至可以用一个Applescript复制的错误。我为此开了一个单独的问题(AppleScript to open URL in Safari crashes for Flash-based websites

对于记录,我的问题的答案是使用LSOpenFromURLSpec或此代码:

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

答案 3 :(得分:2)

您不需要AppKit框架。只需实现这一点。

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

[[UIApplication sharedApplication] openURL:url];