12

我有一个目录的安全范围书签,由用户通过 openDialog 请求提供。

我正在尝试为此目录中的文件创建另一个安全范围书签:

NSURL *musicFolder = /* Secured URL Resolved from a NSData, bookmark not stale */;

if (![musicFolder startAccessingSecurityScopedResource]) {
    NSLog(@"Error accessing bookmark.");
}

NSString *file = @"myfile.txt"; /* This file exists inside the directory */
NSURL *pathURL = [musicFolder URLByAppendingPathComponent:file];

NSError *systemError;
NSData *bookmarkData = [pathURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope
                         includingResourceValuesForKeys:nil
                                          relativeToURL:nil
                                                  error:&systemError];

[musicFolder stopAccessingSecurityScopedResource];

if (!bookmarkData) {
    NSLog(@"%@", systemError);
}

两者都bookmarkDatasystemErrornil 结尾,这不是很有用...

这是否受支持,或者您只能从系统中获得有效的安全范围书签?

4

3 回答 3

6

在我的测试程序中,这工作正常。我怀疑在您的情况下将文件名附加到 URL 失败(但这是一个很大的猜测),因为它是唯一看起来有实质性不同的东西。

I notice that the url for a security resolved location is: file://localhost/Users/dad/Desktop/TestFolder?applesecurityscope=343335323030663066393432306234363030346263613464636464643130663635353065373030373b30303030303030303b303030303030303030303030303032303b636f6d2e6170706c652e6170702d73616e64626f782e726561642d77726974653b30303030303030313b30313030303030323b303030303030303030326461363838663b2f75736572732f74796c65722f6465736b746f702f74657374666f6c646572

这是我想知道附加是否是问题的另一个原因。

在我的测试中,我让用户选择文件夹,创建安全范围的书签,然后将其保存在用户默认值中。

然后我退出并重新启动应用程序,并通过菜单命令获取该书签,然后解决它。然后我添加了一个案例,我使用已解析的书签到文件夹并为文件夹内的文件创建一个新书签。

它似乎工作正常。


在我的工作测试中,我正在获取文件的路径,如下所示:

NSURL * resolvedURL = [NSURL URLByResolvingBookmarkData: data
                        options: NSURLBookmarkResolutionWithSecurityScope
                        relativeToURL: nil
                        bookmarkDataIsStale: &isStale
                        error: &error];
... // (error checking)

[resolvedURL startAccessingSecurityScopedResource];

NSArray * files = [[NSFileManager defaultManager] 
                     contentsOfDirectoryAtURL: resolvedURL
                     includingPropertiesForKeys: @[NSURLLocalizedNameKey, NSURLCreationDateKey]
                     options:  NSDirectoryEnumerationSkipsHiddenFiles
                     error: &error];
if ( files != nil )
{
    NSURL * fileURL = [files objectAtIndex: 0]; // hard coded for my quick test
    NSData * newData = [fileURL bookmarkDataWithOptions: NSURLBookmarkCreationWithSecurityScope
                          includingResourceValuesForKeys: nil
                          relativeToURL: nil
                          error: &error];

   if ( newData != nil )
   {
       NSLog(@"it's good!");
   }
   .... // error checking and logging.

如果这不能让你走上正确的轨道,我将需要查看更多代码(你可能需要做一个简单的例子)。

请注意,在我的情况下,我正在解析书签并调用,startAccessingSecurityScopedResource即使我刚刚获得了 url 并创建了书签(当我尝试从我刚刚从 PowerBox(openPanel)获取的路径创建书签时,它失败并出现错误256)。

一些配置细节:OS X 10.8.4、Xcode 5(今天 9/18/2013 首次公开发布)。

于 2013-09-19T08:08:25.843 回答
4

要为锁定的文件创建书签,请在 API 调用中使用NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess标志和NSURLBookmarkCreationWithSecurityScope标志来创建书签。

例如:

NSURL* fileURL = [NSURL fileURLWithPath:filePath];
NSError* error = NULL;

NSData* bookmarkData = [fileURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope|NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess includingResourceValuesForKeys:nil relativeToURL:nil error:&error];

我在 Mac OS 10.9.5 中试过这个

于 2014-11-19T15:41:52.947 回答
2

在报告安全范围的书签和锁定文件的问题后跟进,这是 Apple 的回复:

“此外,正如您所注意到的,创建安全范围的书签需要对目标文件的写入权限。在 OS X Mavericks 中不应再出现这种情况。”

这表明它是 OS X pre-10.9 版本中的一个错误。

于 2013-09-25T16:05:09.847 回答