2012-08-30 36 views
6

我需要我的沙盒應用程序在重新啓動應用程序後重新打開打開的文件。 Apple在NSURL書籤創建和解析方法中提供了安全範圍的書籤,其中包括NSURLBookmarkCreationWithSecurityScopeNSURLBookmarkResolutionWithSecurityScope選項。但是,這些標誌/選項僅適用於10.7.3或更高版本,並會導致10.7.3之前的應用程序失敗。Mac App Store沙盒和處理10.7.3之前的安全範圍書籤

如何在沙盒應用程序中處理10.6至10.7.3的文件書籤保留/重新打開?

-

後續行動:請參閱下面的答案。該問題不是由於使用NSURLBookmarkCreationWithSecurityScope而引起的,而是由於使用了安全範圍的書籤啓動和停止方法。

+0

我的猜測是你可能不能。這是他們的沙盒方法的一個缺點,因此增加了額外的機制。而且蘋果公司不是一個能夠支持東西的人... – Thilo

+2

你確定這是失敗的原因嗎?我有一個應用程序(在MAS中)使用'[NSURL URLByResolvingBookmarkData:書籤選項:NSURLBookmarkResolutionWithSecurityScope relativeToURL:nil bookmarkDataIsStale:NO er​​ror:nil];'在10.6.8機器上工作得很好。 – Patrick

+0

@Patrick - 它在10.7 - 10.7.2上正常工作嗎? (沙盒在10.6.8上不可操作,URL的解析可能會忽略任何由10.7.3+添加的安全信息 - 只是猜測) – CRD

回答

9

事實證明,使用NSURLBookmarkCreationWithSecurityScope不會導致10.7 - 10.7.2的問題。導致失敗的原因是調用-[NSURL startAccessingSecurityScopedResource]:,這在10.7.3之前不被支持。因此,您需要使用OS檢查或respondsToSelector檢查將調用包裝到此方法(以及相應的停止方法)。我測試了書籤在10.7.1中仍然有效,只要你確保不要調用開始/停止。

以下是使用respondsToSelector一些代碼片段,這將有助於該對這個問題在任意其他:

使用此開始使用:

if([bookmarkFileURL respondsToSelector:@selector(startAccessingSecurityScopedResource)]) { // only supported by 10.7.3 or later 
    [bookmarkFileURL startAccessingSecurityScopedResource]; // start using bookmarked resource 
} 

而這種停止使用:

if([bookmarkFileURL respondsToSelector:@selector(stopAccessingSecurityScopedResource)]) { // only supported by 10.7.3 or later 
    [bookmarkFileURL stopAccessingSecurityScopedResource]; // stop using bookmarked resource 
} 
+1

爲什麼不只是使用respondsToSelector而不是檢查操作系統版本? –

+0

@ Ben-Uri你說得對,'respondsToSelector'比檢查操作系統版本更好。我更新了答案。 – spurgeon