应用程序重新启动后,OSX应用程序失去了读取目录的权限

时间:2014-05-16 15:47:47

标签: objective-c macos entitlements

我的OSX应用程序旨在监视用户选择的计算机上的文件夹。很简单,我有一个扫描目录的函数:

- (NSError*)scan:(NSString*)dir {
  NSError *err = nil;
  NSArray *filenames = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dir error:&err];
  for(NSString* fn in filenames) {
    NSString *fp = [dir stringByAppendingPathComponent:fn];
    BOOL isDir;
    BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:fp isDirectory:&isDir];
    if(exists && isDir) {
      [self scan:fp];
    }
    else {
      [self handleFile:fp];
    }
  }
  NSLog(@"Scanning %@: %@",dir,err);
  return err;
}

当我第一次启动应用程序时,我会提供一个UI来选择文件夹,然后立即扫描它。操作效果很好(没有错误)。

当我重新启动应用程序时,我尝试再次扫描目录,但这次NSLog吐出错误:

Scanning /Users/zane/Dropbox/Gifs: Error Domain=NSCocoaErrorDomain Code=257 "The file “Gifs” couldn’t be opened because you don’t have permission to view it." UserInfo=0x608000476d40 {NSFilePath=/Users/zane/Dropbox/Gifs, NSUserStringVariant=(
    Folder
), NSUnderlyingError=0x60800005d3d0 "The operation couldn’t be completed. (OSStatus error -5000.)"} 

请注意,路径未更改。

我怀疑问题与.entitlements有关。这就是我所拥有的: enter image description here

1 个答案:

答案 0 :(得分:3)

如果您要使用用户已选择的相同文件或文件夹,则需要在用户选择该路径时将路径另存为安全范围的书签。用户重新启动应用程序时,请读取其书签数据,以便使用保存的路径。在this page的中间有一个安全范围书签的描述。使用NSURL的 URLByResolvingBookmarkData 方法返回安全范围的书签。使用 bookmarkDataWithOptions 方法或NSURL的等效方法来恢复安全范围的书签。