提问人:Piotr Witkoś 提问时间:6/15/2023 更新时间:6/15/2023 访问量:48
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
问:
我需要使用共享到我的 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
答:
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];
关键是使用方法,在使用文件之前和完成后使用方法startAccessingSecurityScopedResource
NSURL *url
stopAccessingSecurityScopedResource
评论