Как обойти NSCocoaErrorDomain: 257 при извлечении файла из приложения «Файлы»? - PullRequest
1 голос
/ 03 октября 2019

Я пытаюсь получить доступ к файлу, чтобы вставить копию в мое приложение, чтобы пользователи могли связать его с соответствующей информацией. До недавнего времени он работал нормально, и теперь я неожиданно получаю следующее сообщение:

Не удалось прочитать файл, ошибка Ошибка Domain = NSCocoaErrorDomain Code = 257 "Файл" [Имя файла]”Не может быть открыт, потому что у вас нет разрешения на его просмотр."UserInfo = {NSFilePath = / private / var / mobile / Библиотека / Мобильные документы / com ~ apple ~ CloudDocs / [Имя файла], NSUnderlyingError = 0x281b88690 {Ошибка домена = 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, поэтому там, возможно, произошли изменения, о которых я не знал.

1 Ответ

1 голос
/ 03 октября 2019

Оказывается, есть функция «using», которая сообщает приложению, что оно обращается к файлам за пределами своей песочницы. Методы startAccessingSecurityScopedResource и stopAccessingSecurityScopedResource в NSURL необходимо обернуть вокруг кода с помощью 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, который требует этого, когда раньше этого не делал, но это единственное реальное изменение между тем, что он работает и не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...