Objective-C NSFileManager 在模拟器上工作正常,但检查文件大小时,设备上出现不允许操作错误 Domain=NSCocoaErrorDomain Code=257

Objective-C NSFileManager works fine on simulator but Operation not permitted error Domain=NSCocoaErrorDomain Code=257 on device when check file size

提问人:Piotr Witkoś 提问时间:6/15/2023 更新时间:6/15/2023 访问量:48

问:

我需要使用共享到我的 react native 应用程序的外部文件的 Objective-C 检查大小。

我得到了无需获取文件属性即可正常工作的网址:

file:///private/var/mobile/Containers/Shared/AppGroup/61894F8B-0001-40C2-856E-F30D4663F7A7/File%20Provider%20Storage/Instrukcja_Welcome_to.pdf

NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:url.relativePath error:&error];
NSNumber *fileSize = fileAttributes[NSFileSize];

在模拟器上完美运行,但是当我使用物理设备时出现错误:

Error Domain=NSCocoaErrorDomain Code=257 “文件 无法打开“Instrukcja_Welcome_to.pdf”,因为您没有 查看它的权限。 UserInfo={NSFilePath=/private/var/mobile/Containers/Shared/AppGroup/61894F8B-0001-40C2-856E-F30D4663F7A7/File 提供程序存储/Instrukcja_Welcome_to.pdf, NSUnderlyingError=0x280eeb240 {错误域 = NSPOSIXErrorDomain 代码 = 1 “不允许操作”}}

我试过了:

  NSFileCoordinator *fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil];
  [fileCoordinator coordinateReadingItemAtURL:url options:NSFileCoordinatorReadingWithoutChanges error:&error byAccessor:^(NSURL *newURL) {
      fileAccessGranted = YES;
  }];

并添加了

<key>NSFileUsageDescription</key>
<string>This app requires access to files.</string>

到 info.plist

ios objective-c iphone react-native 文件

评论


答:

1赞 Piotr Witkoś 6/15/2023 #1

事实证明,解决方案非常简单:

NSURL *url = = [NSURL fileURLWithPath:@"/private/var/mobile/Containers/Shared/AppGroup/61894F8B-0001-40C2-856E-F30D4663F7A7/File Provider Storage/Downloads/Instrukcja_Welcome_to.pdf"];
BOOL isAccessGranted = [url startAccessingSecurityScopedResource]; 
if (isAccessGranted) {
    NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:url.relativePath error:&error];
    NSNumber *fileSize = fileAttributes[NSFileSize];
}
[url stopAccessingSecurityScopedResource];

关键是使用方法,在使用文件之前和完成后使用方法startAccessingSecurityScopedResourceNSURL *urlstopAccessingSecurityScopedResource