Данные приложения это: прогресс игры, внутренние покупки, рекорды которые будут поститься в GameCentre. Если сохранять эти данные в NSUserDefaults, то теоретически пользователь, который сможет залезть в файлы приложения, сможет задать себе огромный счет, или открыть платные объекты и т.п. И без интернета правильность этого не проверишь...
С другой стороны, iPhone сильно закрыт и, вероятно, доступ к файлам можно не предусматривать...
Посмотрев различные ресурсы не нашел освещения этой темы. Хотелось бы узнать можно ли все сливать в NSUserDefaults или шифровать все-таки надо. И если надо, то где почитать примеры записи шифрованных файлов (типо зашифровать свой plist и записать в файл) либо просто как работать с архивами ресурсов вообще.
kZUraX
> С другой стороны, iPhone сильно закрыт и, вероятно, доступ к файлам можно не
> предусматривать...
На голом айФоне нельзя, а на джейл брейкнутом - запросто. У нас была такая проблема - очки геймцентра, которые кешировались на диске в отсутствие интернета выкручивали на максимум. С этого момента у нас все шифруется :)
Если это игра то не парься пиши в NSUserDefaults даже если пара тройка мудаков и доберется туда то удачи им, все колупать айфон не станут а те что колупают и так не платят.
Другое дело если там действительно какие то важные данные типа пароли ко всяким акаунтам банковская инфа тогда шифровать все таки нужно.
kZUraX
> сможет задать себе огромный счет
ага, я так делал на джеилбрейкнутом телефоне )
Думаю, достаточно будет записать в бинарный файл. Расковыривать его вряд ли кто-то будет. А в текстовом плисте октрыть хранить - это fail.
Sergio
+1
TioRio
Я так понимаю, +1 это к накрутке очков? :)
неа к "Думаю, достаточно будет записать в бинарный файл. Расковыривать его вряд ли кто-то будет. А в текстовом плисте октрыть хранить - это fail."
Sergio
> Думаю, достаточно будет записать в бинарный файл. Расковыривать его вряд ли
> кто-то будет. А в текстовом плисте октрыть хранить - это fail.
Эх... расковыриваются бинарники за милую душу. Помню в юную юность (ну как сказать юность... лет в 16) решил загамать в одну игруху, файл save.dat или что-то типа этого весил совсем мало и ничего не стоило понаблюдать за его изменением в отдельные моменты времени. Замена всего на FF открыла все.
kZUraX
Будут свободные 20 минут - почитай
http://imaladec.com/story/zip
авось пригодится.
Я пока не заморачиваюсь, делаю через NSUserDefaults.
Мне уж если и надо будет шифрование позарез - то переписать пару функций для получении купленных contentID из файла / запись туда - дело максимум пары/тройки часов.
CasDev
> делаю через NSUserDefaults.
У меня эта хрень после чтения постоянно отнимала в памяти как раз размер данных (а их было много). Я так и не понял, как от этого избавиться и сделал по православному (еще и кросс-платформенно) - fopen()\fread()\fwrite(), чего и вам желаю ;)
Sergio
> Думаю, достаточно будет записать в бинарный файл
+1
для сейвов достаточно делать 2 вещи:
1) Привязывать сейвы к девайсу (UDID/Mac-Address)
2) Шифрование с ключем length >= 5
ну и валидация всех покупок при наличии инета - само-собой разумеется
0r@ngE
> UDID
Кстати, его отменили, начиная с iOS 5
>У меня эта хрень после чтения постоянно отнимала в памяти как раз размер данных (а их было много).
Когда то на developers.apple.com читал, что следует воздержаться от хранения большого объема данных в defaults system, т.к. оно не совсем предназначено для этих целей.
> Думаю, достаточно будет записать в бинарный файл
Делал запись в бинарник давно - ещё на заре своей карьеры написания apps под iPhone.
Вместо
>fopen()\fread()\fwrite()
использовался NSData со своими dataWithContentsOfFile\writeToFile, который в свою очередь инициализировался из структуры (возможно не самый лучший способ, но, повторюсь, это было на заре моей практики).
В принципе работало.
Отказался из-за того, что если в новой версии приложения изменялся формат сохраняемых данных (ну мало ли чего начальству захочется добавить), то необходимо было совершить определённые нелепые телодвижения по проверке соответствия формата сохранённых данных и формата новых данных и что-то сделать в случае их несоответствия.
После NSData попробовал хранить данные в NSMutableDictionary с их dictionaryWithContentsOfFile\writeToFile. Останавливаться на этом способе не буду, т.к. это в принципе то же самое что и хранить данные в NSUserDefaults, только, опять таки, с лишними телодвижениями.
После этого перешёл на NSUserDefaults - храню там не очень критичные данные.
Особо заморачиваться с шифрованием не стал - использую нечто похожее на расширение Secure-NSUserDefaults, которое позволяет проверить валидность сохранённых данных.
Ну и если необходимо хранить важные данные (например признак покупки чего-то-там с помощью in app purchase), то сохраняю их в keychain девайса (примеры классов для работы с кейчейном можно нарыть в инете).
Обыкновенный BOOL YES там хранится в виде binary 192 byte, желающие могут попробовать заменить всё на FF и сообщить о результатах :)
Достоинство этого способа в том, что даже если пользователь что-то там купил и не синхронизируя приложение с iTunes удалил приложение, то после повторной загрузки приложения тот же признак купленного товара присутствует на девайсе (а то я устал отвечать в сапорте дебилам которые требуют деньги назад из-за того, что он/ребёнок/кум/брат/сват случайно удалил приложение, а теперь у него опять заблокированы возможности за которые он заплатил деньги).
Ну а если всё же хочется пошифровать, то вот что нарыл у себя в закладках Saved state encryption. Возможно найдёте пример и получше - просто у меня не было такой необходимости :)
CasDev
Cпасибо за
>http://imaladec.com/story/zip
Занёс в закладочки :)
Sergio
а что там с UDID-ами в пятой версии? можно ссылку какую-нибудь?
Mikrokot
> а что там с UDID-ами в пятой версии?
uniqueIdentifier
An alphanumeric string unique to each device based on various hardware details. (read-only) (Deprecated in iOS 5.0. Instead, create a unique identifier specific to your app.)
@property (nonatomic, readonly, retain) NSString *uniqueIdentifier
Special Considerations
Do not use the uniqueIdentifier property. To create a unique identifier specific to your app, you can call the CFUUIDCreate function to create a UUID, and write it to the defaults database using the NSUserDefaults class.
Тема в архиве.