我试图访问一个文件,以便将一个副本拖到我的应用程序中,这样用户就可以将其与相关信息联系起来。直到最近,它还能正常工作,现在我突然收到了以下信息:
读取文件失败,错误Domain=NSCocoaErrorDomain Code=257“文件名”无法打开,因为您没有查看它的权限。UserInfo={NSFilePath=/private/var/mobile/Library/Mobile文档/com~apple~CloudDocs/文件名,NSUnderlyingError=0x281b88690 {Error Domain=NSPOSIXErrorDomain Code=1“不允许操作”}
这是抛出错误的代码:
//AppDelegate.m
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
if (![url.pathExtension isEqualToString:@"pdf"] && ![url.pathExtension isEqualToString:@"png"] && ![url.pathExtension isEqualToString:@"jpg"] && ![url.pathExtension isEqualToString:@"jpeg"]){
return false;
}
NSError* error = nil;
NSString *path = [url path];
NSData *data = [NSData dataWithContentsOfFile:path options: 0 error: &error];
if(data == nil) {
NSLog(@"Failed to read file, error %@", error);
}
//Do stuff with the file
return true;
}
我确实更新了xcode 11和iOS 13,所以可能有一个我不知道的变化。
发布于 2019-10-03 17:10:53
结果是有一个“使用”函数告诉应用程序它在沙箱之外访问文件。NSURL上的startAccessingSecurityScopedResource和stopAccessingSecurityScopedResource方法需要使用url包装在代码周围,如下所示:
BOOL isAcccessing = [url startAccessingSecurityScopedResource];
NSError* error = nil;
NSString *path = [url path];
NSData *data = [NSData dataWithContentsOfFile:path options: 0 error: &error];
if(data == nil) {
NSLog(@"Failed to read file, error %@", error);
}
if (isAccessing) {
[url stopAccessingSecurityScopedResource];
}
我不确定iOS 13是否有任何特定的东西需要它,而以前它并不需要这样做,但这是它工作和不工作之间唯一的真正变化。
https://stackoverflow.com/questions/58223929
复制相似问题