在Finder Sync Extension中使用安全范围书签与App Group UserDefaults

时间:2016-06-18 12:45:49

标签: objective-c macos findersync

我在finder同步扩展程序中解析Security Scoped Bookmark时出现以下错误。

  

错误域= NSCocoaErrorDomain代码= 259"文件无法打开,因为它的格式不正确。"

也可能是相关的日志记录:

  

无法读取CFPrefsPlistSource中的值< 0x6080000ee380> (域:MyAppGroupName,用户:kCFPreferencesAnyUser,ByHost:是,容器:(null)):只允许使用带容器的kCFPreferencesAnyUser,系统容器,从cfprefsd分离

我正在使用以下代码在Container App中创建Security Scoped书签:

NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"com.mycomp.xyz"];
NSURL * theSelectedFolder = ....selected folder from NSOpenPanel....
NSData *bookmarkData = [theSelectedFolder bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:nil error:NULL];

[sharedDefaults setObject:bookmarkData forKey:@"BookmarkData"];
[sharedDefaults synchronize];

在Finder Sync Extension中,我使用以下代码:

NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"com.mycomp.xyz"];
NSData *bookmarkData = [sharedDefaults objectForKey:@"BookmarkData"];
BOOL bookmarkDataIsStale;
NSError *err;
NSURL *userSelectedUrl = [NSURL URLByResolvingBookmarkData:bookmarkData options:NSURLBookmarkResolutionWithSecurityScope relativeToURL:nil bookmarkDataIsStale:&bookmarkDataIsStale error:&err];

我还添加了这个权利密钥: Finder Sync Extension和Container app中的com.apple.security.files.bookmarks.app-scope

我是可可节目的新手,无法找到任何运气查找问题。

我做错了什么?任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:0)

问题是您正在尝试在Finder扩展程序中解析书签数据。您需要在包含应用程序本身的情况下解析书签数据。

您可以扩展名为selected item urlstargeted url

NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"com.mycomp.xyz"];
NSURL* target = [[FIFinderSyncController defaultController] targetedURL];
NSArray* items = [[FIFinderSyncController defaultController] selectedItemURLs];

答案 1 :(得分:0)

要保存只读书签数据,请使用位掩码[.withSecurityScope, .securityScopeAllowOnlyReadAccess].securityScopeAllowOnlyReadAccess

  

.securityScopeAllowOnlyReadAccess

     

.withSecurityScope选项结合使用时,指定您要创建一个安全范围内的书签,该书签在解析后会提供一个安全范围内的URL,从而允许对文件系统资源;可以在采用“应用沙箱”的应用中使用。

https://developer.apple.com/documentation/corefoundation/cfurlbookmarkcreationoptions/1543362-securityscopeallowonlyreadaccess

url.bookmarkData(options: [.withSecurityScope, .securityScopeAllowOnlyReadAccess], includingResourceValuesForKeys: nil, relativeTo: nil)

从主应用程序或扩展程序解析时,仅使用.securityScopeAllowOnlyReadAccess会给我一个问题中提到的错误:

  

Error Domain = NSCocoaErrorDomain代码= 259“由于文件格式不正确,无法打开文件。”

答案 2 :(得分:0)

我收到了Apple开发人员技术支持的回复。发表在下面:

跟进:701518883

我对此进行了更多研究,所以让我在这里重新开始对话:

  

我需要在主Mac App及其Mac OS之间共享沙盒安全书签   FinderSync扩展。

这里的根本问题是,应用范围,安全范围的书签仅在创建它的应用中有效。剩下两个选择:

1)如果两个应用程序组件都同时运行,则可以将当前URL发送到另一个组件,后者可以创建并保存自己的应用程序范围,安全范围的书签。

2)如果这行不通,则另一种选择是创建文档作用域,安全作用域书签。

答案 3 :(得分:0)

您可以通过以下方式使用扩展程序中的书签:

url.bookmarkData(options: [.minimalBookmark], includingResourceValuesForKeys: nil, relativeTo: nil)

并将该书签保存到应用组用户默认设置中。