2016-10-19 4 views
4

Я портирую свое приложение с XCode7 и iOS 9.x на XCode8 и iOS10. Я борюсь с обработкой файлов.Переместить файл из документов в tmp XCode 8 iOS 10

Мне нужно загрузить файл с моего бэкэнда, а затем переместить его с /Documents на /tmp. Вот мой код:

AFURLSessionManager *manager = ... 

    NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { 
     NSURL *documentsDirectoryPath = [NSURL fileURLWithPath:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]]; 
     return [documentsDirectoryPath URLByAppendingPathComponent:[response suggestedFilename]]; 
    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { 
     if(error) { 
      ... 
     } else { 

      NSFileManager *fileManager = [NSFileManager defaultManager]; 

      NSError *error; 
      NSString *tmpDirectory = NSTemporaryDirectory(); 
      NSString *tmpPDFPath = [tmpDirectory stringByAppendingPathComponent:[[response suggestedFilename] stringByReplacingOccurrencesOfString:@" " withString:@""]]; 

      if ([fileManager fileExistsAtPath:tmpPDFPath] == YES) { 
       [fileManager removeItemAtPath:tmpPDFPath error:&error]; 
      } 

      NSLog(@"readable %d", [fileManager isReadableFileAtPath:filePath]); 
      // Print TRUE 
      NSLog(@"tmpWritable %d", [fileManager isWritableFileAtPath:[NSURL URLWithString:tmpDirectory]]); 
      // Print TRUE 

      BOOL move = [fileManager moveItemAtPath:filePath toPath:tmpPDFPath error:&error]; 

      ... 
     } 
    }]; 

Все отлично работает, если я бегу мое приложение в IOS 9.3 тренажере, но сбой приложения при запуске в iOS10 один. Первое изменение, которое я должен был сделать, - перейти к методу moveItemAtPathfilePath.absoluteString вместо filePath. Несмотря на это редактирование, метод шаг всегда терпит неудачу с этой ошибкой:

Error Domain=NSCocoaErrorDomain Code=4 "“XXXX.pdf” couldn’t be moved to “tmp” because either the former doesn't exist, or the folder containing the latter doesn't exist." UserInfo={NSSourceFilePathErrorKey=/file:/Users/XXX/Library/Developer/CoreSimulator/Devices/24CAB2B2-F495-4CFF-90A7-5C51AF38C194/data/Containers/Data/Application/3D8EEEF9-F639-4D6C-BD5E-17A571F7B836/Documents/XXXX.pdf, NSUserStringVariant=( Move ), NSFilePath=/file:/Users/XXXX/Library/Developer/CoreSimulator/Devices/24CAB2B2-F495-4CFF-90A7-5C51AF38C194/data/Containers/Data/Application/3D8EEEF9-F639-4D6C-BD5E-17A571F7B836/Documents/“XXXX.pdf, NSDestinationFilePath=/Users/“XXXX/Library/Developer/CoreSimulator/Devices/24CAB2B2-F495-4CFF-90A7-5C51AF38C194/data/Containers/Data/Application/3D8EEEF9-F639-4D6C-BD5E-17A571F7B836/tmp/“XXXX.pdf, NSUnderlyingError=0x7b0a3500 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}

Кто-нибудь уже имели дело с такого рода ошибки?

ответ

3

Мой первый обходной путь должен пройти через NSData:

NSError* errorWrite = nil; 
NSData* data = [NSData dataWithContentsOfURL:filePath]; 
BOOL write = [data writeToFile:tmpPDFPath options:NSDataWritingAtomic error:&errorWrite]; 

Этот код работает отлично, но я хотел бы понять, почему предыдущий не делает.

1

У меня была такая же проблема, и решение для меня состояло в том, чтобы обновить до последней версии Dropbox SDK (в настоящее время 3.2.0) из 3.0.15. В частности, я все еще был нацелен на iOS 8.x, поэтому обновление CocoaPods не собирало новые версии Dropbox, и эта ошибка была исправлена ​​вокруг версии 3.0.18. См. this forum QA для более подробной информации.

Смежные вопросы