12

在我的 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

4 回答 4

5

尝试以下OpenURLs方法NSWorkspace

- (BOOL) openURLs:(NSArray *)urls
         withAppBundleIdentifier:(NSString *)bundleIdentifier
         options:(NSWorkspaceLaunchOptions)options
         additionalEventParamDescriptor:(NSAppleEventDescriptor *)descriptor
         launchIdentifiers:(NSArray **)identifiers
于 2010-06-03T14:47:04.013 回答
3

使用它在默认浏览器中打开 url...

NSURL *url = [NSURL URLWithString:@"http://www.stackoverflow.com/"];
if( ![[NSWorkspace sharedWorkspace] openURL:url] )
    NSLog(@"Failed to open url: %@",[url description]);
于 2011-08-20T03:55:38.927 回答
2

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

我描述的崩溃似乎是一个错误,甚至可以用一个 Applescript 重现。我为此打开了一个单独的问题(AppleScript to open URL in Safari crashs for Flash-based website

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

NSWorkspace * ws = [NSWorkspace sharedWorkspace];
[ws openURLs: urls withAppBundleIdentifier:@"com.apple.Safari" 
  options: NSWorkspaceLaunchDefault
  additionalEventParamDescriptor: NULL
  launchIdentifiers: NULL];
于 2010-06-04T06:36:24.030 回答
2

您不需要 AppKit 框架。只需执行此操作。

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

[[UIApplication sharedApplication] openURL:url];
于 2015-07-11T00:36:12.893 回答