Операция не может быть завершена. операция не разрешена

Очень странная проблема с моим приложением для 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]);

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


person Teddy    schedule 08.04.2011    source источник


Ответы (1)


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

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

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

person Anomie    schedule 08.04.2011
comment
Спасибо за ответ (обе части). 8 из 10 телефонов позволяют это сделать. Все примеры, доступные в Интернете, используют связанный путь для сохранения NSData. Вроде не должны. Но тогда не могли бы вы дать мне несколько советов, пожалуйста? Если я доставляю свое приложение с базой данных (файл XML) и хочу обновить его, как это сделать? - person Teddy; 09.04.2011
comment
@Teddy: используйте fileExistsAtPath: NSFileManager, чтобы проверить, существует ли файл в каталоге документов. Если нет, вы можете либо скопировать версию из своего пакета, либо просто прочитать ее прямо из пакета. - person Anomie; 09.04.2011
comment
Прохладный. Спасибо. Мне нужно решить проблему, если я выпущу новую версию БД с моим пакетом. Но это легко сделать. Спасибо за ваш ответ. - person Teddy; 09.04.2011