2010-06-03 33 views
10

Trong chương trình mục tiêu-c của tôi, tôi cần mở URL trong Safari bất kể trình duyệt mặc định của hệ thống là gì. Điều đó có nghĩa rằng điều này sẽ không làm việc, bởi vì nó có thể khởi động Firefox hoặc bất cứ trình duyệt nào khác:Mở URL bằng Safari bất kể trình duyệt hệ thống nào được đặt thành

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

Tôi nghĩ mình gần với điều này:

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

chỉ cần tìm ra cách để vượt qua trong URL dưới dạng tham số ... Có cách nào dễ hơn không?

Cảm ơn!

Cập nhật: Mã sau đây khởi chạy Safari có URL mà tôi muốn nhưng Safari chấm dứt ngay lập tức! Bất cứ ý tưởng tại sao điều này là gì?

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

Tôi đã quan sát cùng một hành vi với LSOpenFromURLSpec. Nếu một cá thể Safari đang chạy, nó hoạt động tốt. Nếu không có cá thể Safari nào đang chạy, nó sẽ bắt đầu một phiên bản mới và chấm dứt nó ngay lập tức.

Cập nhật 2: Safari chỉ bị treo cho các trang web có nhúng Flash. Với mã ở trên, tôi có thể mở google.com tốt, tuy nhiên Safari gặp sự cố đối với video trên YouTube chẳng hạn.

+0

'hệ thống ("URL Safari")' hoặc một cái gì đó tương tự không hoạt động? – barrycarter

+0

Thật không may là không. Tôi đã thử điều này từ Terminal. Safari khởi động, nhưng coi URL là tệp cục bộ và do đó không thể tìm thấy nó. – Mark

+0

Điều này đã cho tôi đóng, nhưng nếu Safari chưa chạy, nó sẽ mở ra và chấm dứt ngay lập tức. Không có báo cáo lỗi: NSString * safariFullPath = [[NSWorkspace sharedWorkspace] fullPathForApplication: @ "Safari"]; NSArray * url = [mảng NSArrayWithObject: url]; LSLaunchURLSpec urlSpec; urlSpec.appURL = (CFURLRef) [URL NSNWithString: safariFullPath]; url urlSpec.itemURLs = (CFArrayRef); urlSpec.passThruParams = NULL; urlSpec.launchFlags = kLSLaunchAsync; urlSpec.asyncRefCon = NULL; Trạng thái OSStatus = LSOpenFromURLSpec (& urlSpec, NULL); – Mark

Trả lời

5

Hãy thử phương pháp OpenURLs từ NSWorkspace:

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

Hai tùy chọn tôi liệt kê ở trên thực sự làm việc cho các trang web mà không bao gồm các đoạn phim Flash.

Tai nạn tôi mô tả có vẻ là một lỗi thậm chí có thể được sao chép bằng một bản tóm tắt duy nhất. Tôi mở một câu hỏi riêng biệt cho điều này (AppleScript to open URL in Safari crashes for Flash-based websites)

Đối với hồ sơ, câu trả lời cho câu hỏi của tôi là để thể sử dụng LSOpenFromURLSpec hoặc mã này:

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

Hy Mark, nếu điều này đã giải quyết được vấn đề của bạn ngay bây giờ. Bạn có thể muốn đánh dấu (hoặc câu hỏi khác) của bạn là câu trả lời cho câu hỏi của bạn. Nếu bạn gặp một sự cố, tôi nghĩ rằng đây sẽ là một vấn đề khác sau đó. – Besi

4

Sử dụng này để mở url trong trình duyệt mặc định. ..

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

Trong khi điều này mở một URL, tôi nghĩ rằng nó không thực sự trả lời câu hỏi. – Besi

2

Bạn không cần khung công tác AppKit. Chỉ cần thực hiện điều này.

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

[[UIApplication sharedApplication] openURL:url]; 
Các vấn đề liên quan