【发布时间】: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