Операция не может быть завершена. операция не разрешена - PullRequest
6 голосов
/ 09 апреля 2011

Очень странная проблема с моим приложением для iPhone.У нас есть приложение, которое было одобрено и продается в App Store.Он содержит функцию для загрузки некоторых обновлений базы данных.Обновление приходит в ZIP через HTTP.Проблема заключается в том, что я не могу сохранить этот загруженный ZIP-файл, потому что я получаю сообщение об ошибке «Операция не может быть завершена. Операция не разрешена».

НО: это происходит на 2 телефонах из 10. Если телефон не можетсохранить файл, который он не может сделать вообще.Если я перезагружаю приложение из магазина, оно не меняется.Но те телефоны, которые способны сохранить ZIP, всегда способны.Все телефоны работают под управлением одной и той же версии iOS, и все они iPhone 4. Это действительно сводит меня с ума.

Если я запускаю XCode, один телефон не дает ошибок при отладке, а другой дает.И они всегда дают.

Вот код:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[activeResponse release];
[theConnection release];

NSLog(@"%d", [receivedData length]);
NSString *s = [[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding];
NSLog(@"%@", s);
[s release];
[theRequest release];   
NSString *path = [NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] resourcePath], @"temp.zip"];
NSLog(path);
NSError * error;
if ([receivedData writeToFile:path options:NSDataWritingAtomic error:&error])
    NSLog(@"Success");
else 
    NSLog(@"Error");
if (error)
    NSLog([error description]);

Есть идеи, пожалуйста?

1 Ответ

11 голосов
/ 09 апреля 2011

Вы не можете писать в комплекте приложений, я удивлен, что это работает на любом из ваших устройств. Есть несколько мест, которые вы можете написать, в зависимости от вашей цели:

  • Если вы хотите сохранить файл, пока не удалите его, напишите в каталог документов: [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
  • Если вы хотите разрешить системе удалить его, если на устройстве недостаточно места (и не волнует, сохраняется ли оно при резервном копировании устройства), используйте каталог caches: [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]
  • Если вы просто временно сохраните его во время обработки и сразу удалите его, используйте временный каталог: NSTemporaryDirectory()

Кроме того, кстати, для построения путей может быть удобнее использовать [directory stringByAppendingPathComponent:filename], а не [NSString stringWithFormat:@"%@/%@", directory, filename].

...