Имеет ли приложение iOS доступ к записи внутри своего пакета?

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

Может создавать выходные файлы в указанном пути кэширования шейдера "/var/mobile/Applications/CB064997-B40E-4FE3-9834-B3217CE33489/SimedTest.app/Ogre3D/assets/RTShaderLib/cache/

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

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

Ответ 1

Пакет доступен только для чтения. Вы не хотите обходиться с ним по двум причинам:

  • Подписание кода: подпись проверяется на предмет содержимого пакета; если вы возитесь с пакетом, вы нарушите подпись.
  • Обновления приложений: обновляет работу, заменяя весь комплект приложений новым загруженным; любые сделанные вами изменения будут потеряны.

Где вы должны сохранить материал:

  • Документы: если вы хотите, чтобы он сохранялся и выполнялся резервное копирование.
  • Библиотека/Кэши: если вы просто хотите кэшировать загруженные данные, например, фотографии профиля; будет автоматически удаляться системой, если она находится на низком уровне, если вы не укажете специальный флаг do-not-delete.
  • tmp: временные файлы, удаленные, когда ваше приложение не запущено

Для полного объяснения ознакомьтесь с Руководство по программированию файловой системы и QA1719.

Ответ 2

Нет, каждый раз, когда вы меняете свой пакет, вы аннулируете свою подпись.

Если вы хотите писать файлы, вам нужно писать в лучшей папке в зависимости от того, что вы хотите сделать с этим файлом.

  • Папка документов для файлов с длительным сроком хранения
  • Кэш для небольших операций
  • и т.д.

ИЗМЕНИТЬ

Чтобы получить path вам понадобится что-то вроде этого:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"filename.ext"];

С помощью этого path вы можете писать или читать так:

записи:

NSString *content = @"One\nTwo\nThree\nFour\nFive";
[content writeToFile:fileName atomically:NO encoding:NSStringEncodingConversionAllowLossy error:nil];

:

NSString *content = [[NSString alloc] initWithContentsOfFile:fileName usedEncoding:nil error:nil];