【问题标题】:Open URL with Safari no matter what system browser is set to无论系统浏览器设置为什么,都使用 Safari 打开 URL
【发布时间】:2011-02-27 06:44:04
【问题描述】:

在我的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 视频而崩溃。

【问题讨论】:

  • 'system("Safari URL")' 或类似的东西不起作用?
  • 很遗憾没有。我从终端尝试了这个。 Safari 启动,但将 URL 视为本地文件,因此无法找到它。
  • 这让我很接近,但如果 Safari 尚未运行,它会立即打开并终止。没有报错: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 状态 = LSOpenFromURLSpec( &urlSpec, NULL );
  • @Mark 这会抛出 - +[__NSCFConstantString baseURL]: unrecognized selector sent to class 0x7fff9805b1b8

标签: safari nsworkspace launch-services


【解决方案1】:

尝试NSWorkspace中的OpenURLs方法:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 虽然这会打开一个 URL,但我认为它并不能真正回答问题。
    【解决方案3】:

    我上面列出的两个选项实际上适用于不包含 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];
    

    【讨论】:

    • 嗨,马克,如果这现在解决了您的问题。您可能希望将您的(或另一个)标记为您问题的答案。如果您遇到崩溃,我认为这将是另一个问题。
    • 在 iOS 上怎么做? NSWorkspace 仅适用于 macOS 10.0+
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-02-01
      • 2016-05-19
      • 2014-08-11
      • 2012-08-16
      • 2020-05-27
      • 1970-01-01
      • 2019-05-31
      • 2013-11-27
      • 1970-01-01
      相关资源
      最近更新 更多