Где хранить личные важные данные пользователя, когда каталог Documents не подходит?

#iphone #ios #ipad #filesystems

#iPhone #iOS #iPad #файловые системы

Вопрос:

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

Я потратил часы на чтение этих документов, но это беспорядок, и я надеюсь, что кто-нибудь знает по опыту. Во-первых, в одном месте говорится, что я должен поместить эти файлы в каталог Библиотеки.

В этом техническом Q amp; A Apple говорит, что это сохранено. Насколько я понимаю, это означает, что я могу безопасно размещать важные пользовательские данные, такие как файлы базы данных sqlite3, в этом каталоге. Когда пользователь обновится до новой версии, содержимое внутри этого каталога будет сохранено, оно сохранится и будет доступно после обновления:

приложения могут создавать свои собственные каталоги в /Library /, и эти каталоги будут сохраняться в резервных копиях и при обновлениях

So /Library / сохраняется в резервных копиях и во всех обновлениях.

Для меня с плохим английским это означает: ДА, данные сохранятся. Они не будут потеряны при создании резервной копии пользователем. Они не будут потеряны при обновлении пользователя. Я посмотрел слово «сохраненный» в нескольких словарях и уверен, что оно означает «это сохранится».

Но с другой стороны, в руководстве по программированию приложений для iOS есть это примечание, в котором говорится о чем-то совершенно другом! Здесь говорится о каталоге Library:

 <Application_Home>/Library/
You should not use this directory for user data files.
The contents of this directory (with the exception of the Caches
subdirectory) are backed up by iTunes.
Your application is generally
responsible for adding and removing
these files. It should also be able to
re-create these files as needed
because iTunes removes them during a
full restoration of the device.
  

«Не следует использовать для файлов пользовательских данных». (???)

Но в то же время они признают, что у него есть резервная копия iTunes. ОК. Тогда почему я не должен помещать туда файлы пользовательских данных?

/Library /Caches Используйте этот каталог для записи любых файлов поддержки для конкретного приложения, которые вы хотите сохранить между запусками приложения или во время обновлений приложения. (…) Также должна быть возможность повторного создания этих файлов по мере необходимости, поскольку iTunes удаляет их во время полного восстановления устройства.

Что?! Я должен поместить эти файлы в библиотеку / кэши. Но этот каталог не поддерживается iTunes, как они сказали выше. Таким образом, это сохранение только для обновлений, но не для резервного копирования. И данные могут быть удалены системой в любое время.

Теперь это полностью сбивает меня с толку. Насколько я понимаю, я могу выбирать между злом и дьяволом: данные в / Library / не сохраняются при обновлениях, но поддерживаются iTunes. Данные в /Library / Caches сохраняют обновления, но не поддерживаются iTunes и могут быть удалены системой (поскольку это «Кэш») в любое время.

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

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

Итак, теперь, действительно, один из обоих документов ДОЛЖЕН быть неправильным. Но какой именно? В чем правда? Пожалуйста, без домыслов! Я ищу ответы из собственного опыта и чувствую, что нет способа разобраться в этом, кроме как выпустить приложение и помолиться. Может быть, кто-то хочет поделиться своим опытом, что действительно сработало.

Ответ №1:

Я видел, что Библиотека / настройки (где хранятся NSUserDefaults) сохраняются при восстановлении, поэтому я думаю, что большая часть библиотеки сохранена. Каталоги кэша, вероятно, исключены.

В общем, просто используйте API для извлечения путей и верьте, что iTunes сохранит их, если они не предназначены для представления временных папок. Это означает, что вы должны использовать подкаталог вашего NSApplicationSupportDirectory, названный в честь вашего приложения:

 NSArray * urls = [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask];
NSAssert([urls count], @"Can't get app support directory");

NSURL * url = [urls objectAtIndex:0];
url = [url URLByAppendingPathComponent:@"MyAppName"];
  

На практике в вашей изолированной среде это в конечном итоге будет «Библиотека / Поддержка приложений / MyAppName», но вы все равно должны использовать API, чтобы гарантировать, что это сохранится в будущем.

(Если вас интересует поддержка iOS 3 или 2, используйте NSSearchPathForDirectoriesInDomains() функцию вместо -URLsForDirectory:inDomains: метода.)

Комментарии:

1. Является ли этот путь частным, или несколько приложений могут считывать данные из этой папки?

2. @f2prateek На iOS или в изолированном приложении macOS этот путь будет указан в контейнере вашего приложения.

Ответ №2:

Содержимое внутри папки Library (кроме кэша) создается резервной копией itunes.

Что Apple имеет в виду, говоря «Не следует использовать для файлов пользовательских данных». (???) это то, что не используйте эту папку для данных, которые вы хотите просмотреть в системе общего доступа к файлам через itunes.

Итак, если вы хотите, чтобы пользователь получил доступ к данным через itunes, напишите в /Document folder

Если вы хотите скрыть данные от пользователя, напишите в папку /Library

Ответ №3:

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

Документация по связке ключей от Apple

Комментарии:

1. Если вы собираетесь использовать связку ключей, ознакомьтесь с этим проектом с открытым исходным кодом. Это оболочка вокруг связки ключей для легкого доступа к ней. 😉 github.com/ldandersen/scifihifi-iphone