Обновления приложений, NSURL и каталог документов

У меня есть приложение в магазине приложений, которое использует Core Data для сохранения большей части данных. Исключением является хранение изображений. Я храню изображения в подкаталогах каталога Documents и сохраняю ссылку NSURL на это изображение в соответствующем атрибуте объекта в основном хранилище данных.

Мы заметили, что когда обновление попадает в магазин приложений, эти изображения не обнаруживаются и, следовательно, не отображаются с использованием ссылок, сохраненных в предыдущей версии приложения. Теперь у меня есть подозрение, что проблема заключается в том, что, поскольку мы используем устройства разработки для тестирования, эта проблема распространяется, потому что каталог в каталоге приложений, который использует приложение-разработчик, отличается от того, который создает/использует магазин приложений. Я заметил различия между каталогом магазина приложений для приложения в приложениях и каталогом, созданным при отладке версий в Xcode. Таким образом, URL-адрес, хранящийся в основных данных, указывает на неправильную папку приложений. Это довольно сложно отладить, так как я не могу загрузить старую версию приложения после того, как новая версия была выпущена в магазине.

Итак, у меня есть пара вопросов. Могу ли я гарантировать, что подкаталог Applications, в котором пользователи загружают версии одного и того же приложения, будет одним и тем же, и это не будет проблемой для устройств, не предназначенных для разработки?

Должен ли я хранить относительные URL-адреса изображений или строки для представления местоположения этих ресурсов, или я должен быть в порядке с сохранением того, что в конечном итоге является абсолютными URL-адресами?

Большое спасибо, Фелипе


person flizit    schedule 07.03.2012    source источник


Ответы (2)


Вы должны использовать относительные URL-адреса для хранения ссылок на файлы. Абсолютный URL-адрес может измениться после обновления приложения.

Файлы, сохраняемые во время обновления приложения

Когда пользователь загружает обновление приложения, iTunes устанавливает обновление в новый каталог приложения. Затем он перемещает файлы данных пользователя из старой установки в новый каталог приложения перед удалением старой установки. Файлы в следующих каталогах гарантированно сохранятся в процессе обновления:

  • Application_Home/Документы
  • Application_Home/Библиотека

Хотя файлы в других пользовательских каталогах также могут быть перемещены, вы не должны полагаться на их присутствие после обновления.

https://developer.apple.com/library/ios/#ДОКУМЕНТАЦИЯ/iPhone/Conceptual/iPhoneOSProgrammingGuide/PerformanceTuning/PerformanceTuning.html

Спасибо песочнице, дом приложения также является домом пользователя. Таким образом, можно использовать тильду unix, которая является короткой рукой для дома пользователя, то есть ~/Documents, ~/Library и так далее.

Используйте -[NSString stringByAbbreviatingWithTildeInPath], чтобы превратить полный путь в относительный ~ путь. И переверните его с помощью -[NSString stringByExpandingTildeInPath].

person Scott Bossak    schedule 07.03.2012
comment
Большое спасибо! Это как раз то, что мне нужно было знать! - person flizit; 08.03.2012
comment
Я не знал, что новый каталог приложений был создан, когда iTunes устанавливал обновления: в итоге у меня были символические ссылки с использованием абсолютных путей, которые стали недействительными. Так что остерегайтесь такого поведения разработчиков iOS! :) - person Dirty Henry; 15.03.2012
comment
Эта ссылка не работает. Попробуйте: developer.apple.com/library/ ios/documentation/iPhone/Conceptual/ - person Chris Prince; 20.03.2016

Я думаю, что вы ищете следующее:

NSString *appDocumentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
person fbernardo    schedule 07.03.2012