iOS 7 Ошибка создания папки после обновления приложения
У меня действительно странная проблема с приложением для iOS, над которым я сейчас работаю. Эффект существует только в том случае, если я тестирую приложение с помощью специального распределения. После обновления приложения (оно должно быть установлено ранее) оно работало некорректно. Я мог отследить ошибку, и это вызвано следующей строкой кода:
[fileManager createDirectoryAtPath:folder withIntermediateDirectories:YES attributes:nil error:&error];
Конечно, теперь вы можете сказать: никогда не пишите в сам пакет приложений, но базовый путь - это папка Documents через:
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
imgDir = [docsDir stringByAppendingPathComponent:@"images"];
folder = [imgDir stringByAppendingPathComponent:md5]; // md5-Hash is created before
Полное сообщение об ошибке (записано в системный журнал iphone):
Ошибка домена =NSCocoaErrorDomain Code=513 "Операция не может быть завершена. (Ошибка какао 513.)" UserInfo=0x14d44f30 {NSFilePath=/var/mobile/Applications/280C6D36-3667-4589-A74F-42F3F17ABA71/Documents/images/39b6cd45a05a2276ef065b2ecf33b1eb, NSUnderlyingError=0x14d4e340 "Операция не может быть завершена. Операция не разрешена"}
Интересно, что, как я уже отмечал, если я удаляю приложение перед установкой через специальный дистрибутив (Testflight для iPhone 5 с iOS 7.0.4), папка создается и приложение работает, как и ожидалось. Единственными ссылками, которые я мог найти, были разработчики, которые не использовали stringByAppendingPathComponent и не писали напрямую в пакет приложений. Может быть, у кого-то еще возникла проблема или есть идея?
1 ответ
Я наконец нашел причину, почему папка не может быть создана. Впоследствии это кажется довольно простым и глупым, но если бы вы могли взглянуть на полный исходный код, вы бы поняли, как это могло произойти. В свою защиту я должен сказать, что я пришел в этот проект для дальнейшего развития, потому что первоначальный разработчик покинул проект. Для вашего лучшего понимания я сильно упростил код.
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
imgDir = [docsDir stringByAppendingPathComponent:@"images"];
На самом деле imgDir был сохранен в userPreferences, и прокси-класс всегда возвращал сохраненный путь, что является очень плохой идеей. В процессе обновления приложение получает новый guid, который отражается в пути к документам приложения. Поэтому попытка создать папку в папке с документами предыдущей версии потерпела неудачу, так как она больше не существует. Я исправил код, чтобы никогда не сохранять путь и всегда возвращал текущий с кодом выше.