Как в android принято хранить конфигурацию?
В целом задача выглядит так: хочу сделать «витрину», где будет изображение предмета, его название и цена
Детали: предметов фиксированное количество, т.е. их набор статичен и не меняется. Это предметы из компьютерной игры, соответственно я просто надергал изображений, названия и цену из файлов игры и хочу оформить для себя в виде приложения. Это не какой-то интернет магазин с динамическими ценами, запросами на сервер — все гораздо проще.
Как я планирую сделать:
1. изображения загрузить в качестве ресурсов
2. взять идентификаторы, которые андроид студия присвоит фотографиям
3. создать какой-нибудь файл, где записи будут формата «название, идентификатор, цена»
4. программно обойти записи этого файла и добавить в активити
Если в целом план годный, то меня интересуют такие вопросы по файлу:
1. какой принято использовать формат для таких целей в андроид-разработке — json, xml, мб еще что-то?
2. где именно мне нужно хранить этот файл? Я думаю в ресурсах, но это понятие растяжимое — там есть пакеты values, xml, а может быть такие файлы еще куда-то принято класть. UPD. С момента создания вопроса я узнал, что существуют еще ассеты — возможно это мне лучше подойдет? Т.к. предметы делятся на категории («оружие», «артефакты» и т.д.) и хотелось бы их рассортировать по папкам, а не хранить вперемешку
- Вопрос задан более года назад
- 82 просмотра
Как разрабатывать безопасные Android-приложения
Создание безопасных мобильных приложений — это первоочередная задача для большинства разработчиков, поскольку важно сохранять доверие пользователей и целостность данных. В этой статье мы познакомимся с некоторыми рекомендациями, которые следует соблюдать при создании Android приложений, чтобы не допускать уязвимостей.
Поддерживайте безопасное взаимодействие с другими приложениями
A. Используйте неявные Intent, чтобы показывался экран, с помощью которого пользователь сможет выбрать одно из нескольких приложений для дальнейшего действия. Это позволит пользователям передавать конфиденциальную информацию тому приложению, которому они доверяют.

Б. Используйте разрешения на основе подписей при обмене данными между двумя вашими приложениями. Такие разрешения не требуют дополнительных подтверждений от пользователя. Вместо этого происходит проверка того, что приложения, которые обращаются к данным, подписаны с помощью одного и того же ключа. Следовательно, для пользователя всё выглядит проще и безопаснее.
< manifest xmlns : android = "http://schemas.android.com/apk/res/android"
package = «com.example.myapp» >
< permission android : name = "my_custom_permission_name"
android : protectionLevel = «signature» />
C. Неэкспортируемые поставщики контента. Если вы не собираетесь делиться данными с другими приложениями, явно запретите им обращаться к вашему ContentProvider, прописав в манифесте android:exported=»false» (по умолчанию «true» для версий Android ниже 4.4).
Обезопасьте сетевые взаимодействия
Обеспечьте безопасность сетевых соединений с помощью HTTPS и SSL — для любых сетевых запросов, используйте HTTPS (вместо обычного HTTP) с правильно настроенными сертификатами. Подробнее смотрите здесь.
Безопасное соединение с сервером можно настроить следующими способами:
А. Для взаимодействия с веб-сервером, у которого настроен сертификат от известного доверенного центра, дополнительные действия при выполнении HTTP-запросов не требуются.
val url = URL ( «https://www.google.com» )
val urlConnection = url . openConnection ( ) as HttpsURLConnection
urlConnection . connect ( )
urlConnection . inputStream . use {
.
}
Б. Добавив конфигурацию сетевой безопасности: если ваше приложение использует новые или пользовательские центры сертификации, можно задать собственные настройки сетевой безопасности в конфигурационном файле. Это позволит вам создать конфигурацию не изменяя код приложения.
Чтобы добавить файл конфигурации в приложение, нужно сделать следующее:
i) Пропишите конфигурацию в манифесте приложения:
< manifest . >
< application
android : networkSecurityConfig = «@xml/network_security_config»
. >
element here . —>
application >
manifest >
ii) Создайте XML-файл ресурсов res/xm/network_security_config.xml.
Укажите, что весь обмен данными с соответствующими доменами должен производиться только по HTTPS, отключив незащищённые сетевые взаимодействия:
< network - security - config >
< domain - config cleartextTrafficPermitted = "false" >
< domain includeSubdomains = "true" >secure . example . com domain >
.
domain - config >
network - security - config >
В процессе разработки можно использовать элемент , чтобы явно разрешить пользовательские сертификаты. Этот элемент переопределяет критически важные параметры сетевой безопасности при отладке и тестировании приложения, не влияя на релизную конфигурацию. Следующий отрывок кода показывает, как использовать этот элемент в XML-файле конфигурации сетевой безопасности:
В. Создайте собственный доверительный менеджер, если веб-сервер использует сертификат, подписанный новым или пользовательским центром сертификации, которому не доверяет мобильное устройство и при этом нет возможности задать конфигурацию сетевой безопасности.
В таком случае потребуется настроить доверительный менеджер и обрабатывать все предупреждения, возникающие в SSL.
Г. Привязка сертификатов. Можно настроить приложение на работу только с определённым набором сертификатов путем ограничения списка доверенных центров сертификации или же с помощью привязки сертификатов.
Это достигается путем предоставления набора сертификатов с помощью хэша открытого ключа (SubjectPublicKeyInfo для сертификата X.509). При таком подходе цепочка сертификатов пройдёт проверку успешно только в том случае, если будет содержать хотя бы один из предоставленных открытых ключей.
Другие сценарии: есть ещё несколько моментов, которые следует учитывать при получении вашим приложением доступа к данным через Интернет:
- Используйте объекты WebView осторожно: объекты WebView в вашем приложении не должны позволять пользователям переходить на сайты, которые вам неподконтрольны. Кроме того, поддержка JavaScript должна быть разрешена только в том случае, если вы полностью контролируете и доверяете содержимому в объектах WebView вашего приложения.
Для связи между веб-сайтом и приложением используйте HTML каналы сообщений вместо evaluateJavascript(). Ознакомьтесь с документацией Android, чтобы узнать больше о безопасном использовании WebView. - Используйте высокоуровневую аутентификацию. Механизмы аутентификации играют ключевую роль в безопасности мобильных приложений. Конфиденциальную информацию можно надёжно защитить при помощи многофакторной аутентификации, продуманного управления сессиями и системой отключения. Также, для большей безопасности приложений, важно настроить расширенную авторизацию с поддержкой таких инструментов как OAuth 2.0 или JSON веб-токены.
Запрашивайте правильные разрешения
Приложение должно запрашивать лишь минимум разрешений, необходимый для его корректной работы.
Не следует добавлять разрешения для действий, которые могут быть выполнены в другом приложении. Вместо этого используйте Intent, чтобы делегировать действие другому приложению, уже имеющему необходимое разрешение.
На пример, если вашему приложению нужно добавить контакт, то делегируйте это действие приложению Контакты, у которого уже есть соответствующее разрешение WRITE_CONTACTS.
Безопасность хранения данных
Криптография является наиболее эффективным способом обеспечить безопасность данных. Поэтому, используйте подходящий механизм шифрования, при работе с данными в приложении. Для достижения большей безопасности ключей используйте систему Android Keystore. Хорошую статью о шифровании можно прочитать здесь.
Ниже приведены рекомендации по хранению данных на устройстве.
А. Храните личные данные во внутреннем хранилище
Храните все личные данные пользователей во внутреннем хранилище устройства, которое изолировано от других приложений. Для доступа к этим файлам не нужно запрашивать разрешение, но другим приложениям такие файлы недоступны. Если пользователь удалит приложение, то все файлы, которые приложение сохраняло во внутреннее хранилище, также будут удалены. Кроме того, рассмотрите вариант использования EncryptedFile из библиотеки Security, вместо объектов File.
Б. Осторожно используйте внешнее хранилище
По умолчанию Android не применяет ограничения безопасности для данных, которые находятся во внешнем хранилище. Также не гарантируется, что сам носитель данных будет всё время подключен к устройству. Поэтому для обеспечения безопасности при доступе к информации из внешнего хранилища примите следующие меры:
Используйте ограниченный доступ к директориям: если приложению нужно обращаться лишь к определенной директории во внешнем хранилище устройства, то используйте область видимости, тем самым ограничив вашему приложению доступ к внешнему хранилищу устройства.
Файлы, связанные с приложением: если файл не содержит персональную или конфиденциальную информацию, но является значимым для пользователя только в контексте вашего приложения, то храните файл в директории конкретного приложения во внешнем хранилище.
В. Храните неконфиденциальные данные в файлах кэша
Для предоставления быстрого доступа к неконфиденциальным данным приложения храните их в кэше устройства. Если размер кэша превышает 1 Мб, то используйте getExternalCacheDir(). В противном случае используйте getCacheDir(). Оба метода вернут вам объект File, который содержит закэшированные данные приложения.
Г. Используйте SharedPreferences в приватном режиме
Используйте MODE_PRIVATE при создании и получении объектов SharedPreferences с помощью getSharedPreferences(), чтобы ваше приложение смогло получить информацию из файла общих настроек.
Кроме того, для усиления безопасности следует использовать EncryptedSharedPreferences, который оборачивает класс SharedPreferences и автоматически шифрует ключи и значения.
Постоянно обновляйте зависимости и библиотеки, чтобы обеспечить их большую безопасность
Сжимайте, обфусцируйте и оптимизируйте код с помощью компилятора R8
Если вы собираете проект с помощью Android Gradle 3.4.0 или более поздней версии, то в данном плагине больше не используется ProGuard для оптимизации кода во время компиляции. Вместо этого задействуется компилятор R8, чтобы во время компиляции выполнить следующие задачи:
- Сжатие кода (или перетряхивание дерева): обнаруживает и безопасно удаляет неиспользуемые классы, поля, методы и атрибуты из приложения и его зависимостей (что делает его ценным инструментом для обхода ограничения в 64k ссылок).
- Сжатие ресурсов: удаляет неиспользуемые ресурсы из упакованного приложения, а так же из его зависимостей.
- Обфускация: сокращает имена классов и методов, благодаря чему уменьшаются размеры DEX-файлов приложения.
- Оптимизация: проверяет и реорганизует код так, чтобы еще больше уменьшить размер DEX-файлов приложения.

Заключение
Данным рекомендациям должен следовать каждый разработчик, чтобы защитить свои мобильные приложения от уязвимостей. Они помогут разрабатывать приложения с высокой степенью защиты, которые предотвратят утечки ценной пользовательской информации и позволят сохранить доверие клиентов.
Мобильное приложение ESMART® Конфигуратор
ESMART® Конфигуратор позволяет настраивать считыватели ESMART® Reader без демонтажа.
Пользователи могут изменить режимы чтения физических и мобильных идентификаторов, настройки Wiegand, а так же звуковой и световой индикации.
Пользовательские конфигурации

Теперь вы можете создавать и хранить конфигураций внутри приложения для всех моделей считывателей, которые находятся в продаже. Для этого в приложении реализована удобная структура меню, разделенная на Серии, Линейки и размеры корпуса устройств (обычный или mullion).
Настройка Карт
Производите настройку каждого из поддерживаемых считывателем идентификаторов, выбирая именно тот режим работы, который требуется на объекте. Можно выбрать чтение UID, работу с памятью карты в режиме DATA или запретить чтение карт такого типа.

Для каждого типа карты, с учетом длины считанных данных, реализована возможность настройки формата и порядка передачи. Пользователь может выбрать один из предустановленных форматов или настроить свой:
– Magic, формат совместимый с большинством СКУД контроллеров
– Прямой порядок байт, данные будут переданы ровно так, как считаны с карты
– Обратный порядок байт, данные будут перевернуты
– Свой, в этом режиме вы сможете самостоятельно настроить порядок передаваемых байт с помощью удобного интерфейса по-байтово, а так же добавить префиксы или постфиксы в виде фиксированных значений, если это требуется.

Настройка чтения шифрованных данных для карт MIFARE®
Долгожданная функция для пользователей и объектов с повышенным уровнем безопасности. Нередко наши заказчики не хотели передавать ключи шифрования от собственных объектов в службу технической поддержки ESMART®, руководствуясь требованиями к безопасности. Для таких запросов мы реализовали возможность задавать ключи шифрования внутри приложения и производить настройку работы с памятью карт MIFARE® ID, Classic, Plus (SL1) и карт MIFARE® Plus (SL3) самостоятельно.
Пользователи имеют возможность создания ключа шифрования (Crypto1 или AES128), выбора сектора и блока данных, смещения данных внутри блока, их длины, а так же порядка передаваемых байт. Для удобства мы реализовали регулятор, который позволяет выбрать объем памяти чипа и не ошибиться в выборе сектора и блока.

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

Приложение не обменивается и не пересылает данные через интернет и может работать, даже тогда, когда телефон находится в Авиарежиме. Данные хранятся внутри и передаются в зашифрованном виде, поэтому вы можете не беспокоиться за их сохранность.
Дополнительной гарантией служит бейдж о Конфиденциальности, выданный специалистами App Store. Бейдж находится на странице приложения в разделе Конфиденциальность приложения и поясняет, что приложение не ведет сбор пользовательских данных.

Интерфейсы
Приложение позволяет настроить параметры интерфейса передачи данных. Для считывателей с Wiegand интерфейсом можно выбрать одну из распространенных предустановленных настроек Wiegand 26 или Wiegand 34, а так же самостоятельно настроить выходной интерфейс, задав Длину данных (от 2 до 255 байт), включить или выключить биты четности, а так же настроить временные параметры интерфейса, такие как: Ширину импульса и Интервал между импульсами. Для удобства пользователя интерфейс отображает формат Wiegand, который получается после настроек, а так же информирует о рекомендуемых стандартом параметрах.
Настройка Bluetooth и Индикации
Приложение постоянно будет получать обновления и в следующем релизе мы планируем внедрить возможность настройки параметров Bluetooth для настройки дальности, а так же настройки световой и звуковой индикации считывателя. Следите за обновлениями.
На момент, пока следующая версия приложения не запущена вы можете, как и раньше, запрашивать требуемые настройки Bluetooth и Индикации у специалистов Технической Поддержки ESMART® письмом на help@esmart.ru
Раздел объекты
Для удобства сортировки и хранения конфигураций внутри приложения мы разработали новый раздел – Объекты. В этом разделе пользователь имеет возможность создания объектов с уникальным именем и фотографией. После создания объекта появляется возможность привязки конфигураций к нему, для этого нажмите на саму конфигурацию, а затем свяжите ее с созданным объектом. Привязанные к объекту конфигурации можно увидеть в разделе По объектам для соответствующей модели считывателей.

Функцию удобно использовать, когда конфигурирование происходит на разных объектах или в пределах одного распределенного объекта, в таком случае удобно разделять конфигурации считывателей на группы. Мы будем рады обратной связи от монтажных организаций, о том, как можно сделать эту функцию еще более удобной.
Важным замечанием по функции самостоятельного конфигурирования является ограничение на поддерживаемые устройства. Функция самостоятельного конфигурирования поддерживается всеми считывателями, начиная с прошивки 2.24.х.х. Такие считыватели мы начали выпускать одновременно с запуском устройств в корпусе mullion в Мае 2021. Считыватели, которые имеют прошивку ниже версии 2.24.х.х, как и раньше, поддерживают конфигурации, созданные специалистами Технической Поддержки ESMART® по запросу на help@esmart.ru

Введенное ограничение сделано с учетом нашей аналитики – устройства, уже установленные на запущенных объектах конфигурируют очень редко, а изменения которые все-таки могут вноситься обычно не касаются глобальных настроек Интерфейсов или Карт. При этом те объекты, которые планируются к запуску почти всегда требуют настройки, для таких объектов приобретаются новые устройства с прошивкой 2.24.х.х, которая поддерживает самостоятельное конфигурирование.
Мы открыты к обратной связи и будем ждать ваших запросов на самостоятельное конфигурирование устройств с прошивкой ниже 2.24.х.х. В случае если запросов будет много – мы будем готовы рассмотреть возможность открытия функции и для ранее выпущенных устройств.
iOS и Android
Первым обновленную версию ESMART® Конфигуратор 2.0 получает платформа iOS, следом за ней, в ближайшее время, мы выпустим версию и для Android. Следите за обновлениями приложения в Google Play.
Новые Мастер Карты
Мы реализовали еще одну удобную функцию для всех устройств с прошивкой 2.24.Х.Х и выше. В комплекте с ними идут обновленные Мастер Карты, которые поддерживают функцию записи конфигурации и выступают в качестве защищенного носителя конфигураций.

Использовать обновленную Мастер Карту удобно на объектах, для которых заказана общая Мастер Карта на весь объект. В этом случае для конфигурирования всех устройств на объекте проходит очень быстро, нужно провести минимум операций:
– Создать Конфигурацию внутри приложения или получить ее от Технической Поддержки ESMART®.
– Записать Конфигурацию на Мастер Карту с помощью телефона по NFC (поддерживаются iPhone 7, 8, X, Xs, Xr, 11, 11 Pro, 12, 12 Pro и выше)
– Поочередно подносить Мастер Карту к каждому считывателю два раза (после первого раза считыватель войдет в режим Конфигурирования, на второе поднесение, применит Конфигурацию пользователя, сохраненную на Мастер карту).
Как начать пользоваться
1. Скачать приложение
Скачайте мобильное приложение ESMART ® Конфигуратор на мобильный телефон. Для скачивания пройдите по ссылке www.esmart.ru/configurator с вашего мобильного устройства. Будет произведено автоматическое перенаправление на соответствующий платформе iOS или Android магазин приложений.
2. Создать конфигурацию
Создайте конфигурацию с требуемыми параметрами под вашу модель считывателя, выбрав ее в меню или получите конфигурацию с требуемыми параметрами, отправив запрос на help@esmart.ru в свободой форме. После подготовки конфигурации, откройте письмо, полученное от специалистов Технической поддержки ESMART®. Нажмите на вложенный файл конфигурации и выберите приложение ESMART® Конфигуратор из предложенного списка программ.
3. Применить конфигурацию
На экране конфигурации нажмите кнопку «Записать» и выберите способ записи конфигурации:
В Мастер Карту по NFC* (для всех моделей считывателей):
1. Поднесите Мастер Карту к телефону и дождитесь сообщения об успешной записи конфигурации
2. Поднесите Мастер Карту к считывателю на 2 секунды, дождавшись входа в режим конфигурирования, считыватель начнем мигать синим цветом
3. Поднесите Мастер Карту к считывателю повторно, устройство будет сконфигурировано
* – Доступно только для iOS
В считыватель по Bluetooth (кроме Линейки LITE):
1. Приложение предложит поднести телефон к считывателю (поднесите), на экране появится информации о Мастер Карте
2. Поднесите Мастер Карту к считывателю на 2 секунды, дождавшись входа в режим конфигурирования, считыватель начнем мигать синим цветом
3. В приложении нажмите кнопку «Сконфигурировать» (в правом верхнем углу)
4. Конфигурация будет загружена в считыватель, устройство будет сконфигурировано.
![]() |
|
| Буклет ESMART® Конфигуратор Конфигурирование без домонтажа |
Техническая поддержка ESMART® Reader.
Обращайтесь по любым вопросам.
Позвонить: +7 (495) 133-00-13 добавочный 250
Хранение и получение параметров и других данных приложения
Данные приложения являются изменяемыми данными, которые создаются и управляются конкретным приложением. К ним относятся сведения о состоянии среды выполнения, параметры приложения, пользовательские настройки, справочная информация (например, определения слов в приложении-словаре) и другие параметры. Данные приложения отличаются от пользовательских данных, данных, которые пользователь создает и управляет при использовании приложения. Данные пользователя включают файлы документов или мультимедиа, расшифровки сообщений электронной почты или записи базы данных, которые содержат содержимое, созданное пользователем. Пользовательские данные могут быть полезными или значимыми для нескольких приложений. Часто это данные, которые пользователь хочет управлять или передавать как сущность независимо от самого приложения, например документа.
Важно отметить данные приложения: время существования данных приложения привязано к времени существования приложения. Если приложение удалено, все данные приложения будут потеряны в результате. Не используйте данные приложения для хранения пользовательских данных или каких-либо данных, которые пользователи могут воспринимать как ценные и незаменимые. Мы рекомендуем использовать библиотеки пользователя и Microsoft OneDrive для хранения таких сведений. Данные приложения идеально подходят для хранения пользовательских настроек, параметров и избранного для конкретного приложения.
Типы данных приложения
Существует два типа данных приложения: параметры и файлы.
Настройки
Используйте параметры для хранения параметров пользователя и сведений о состоянии приложения. API данных приложения позволяет легко создавать и извлекать параметры (мы рассмотрим некоторые примеры далее в этой статье).
Ниже приведены типы данных, которые можно использовать для параметров приложения:
- UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double
- Boolean
- Char16, String
- DateTime, TimeSpan
- Для C#/.NET используйте: System.DateTimeOffset, System.TimeSpan
Files
Используйте файлы для хранения двоичных данных или включения собственных настраиваемых сериализованных типов.
Хранение данных приложения в хранилищах данных приложения
Когда приложение установлено, система предоставляет ему собственные хранилища данных для пользовательских параметров и файлов. Вам не нужно знать, где или как эти данные существуют, так как система отвечает за управление физическим хранилищем, обеспечивая изоляцию данных от других приложений и других пользователей. Система также сохраняет содержимое этих хранилищ данных, когда пользователь устанавливает обновление в приложение и удаляет содержимое этих хранилищ данных полностью и чисто при удалении приложения.
В хранилище данных приложения каждое приложение имеет системные корневые каталоги: один для локальных файлов, один для перемещаемых файлов и один для временных файлов. Приложение может добавлять новые файлы и новые контейнеры в каждый из этих корневых каталогов.
Данные локального приложения
Данные локального приложения должны использоваться для любых сведений, которые необходимо сохранить между сеансами приложений и не подходят для перемещаемых данных приложения. Данные, которые не применимы на других устройствах, также должны храниться здесь. Нет общего ограничения размера для локальных данных, хранящихся. Используйте локальное хранилище данных приложения для данных, которые не имеет смысла перемещать и использовать для больших наборов данных.
Получение локального хранилища данных приложения
Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; Windows.Storage.StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;Создание и извлечение простого локального параметра
Чтобы создать или записать параметр, используйте свойство ApplicationDataContainer.Values для доступа к параметрам в контейнере localSettings , который мы получили на предыдущем шаге. В этом примере создается параметр с именем exampleSetting .
// Simple setting localSettings.Values["exampleSetting"] = "Hello Windows";Чтобы получить этот параметр, используйте то же свойство ApplicationDataContainer.Values , которое использовалось для создания параметра. В этом примере показано, как получить только что созданный параметр.
// Simple setting Object value = localSettings.Values["exampleSetting"];Создание и получение локального составного значения
Чтобы создать или записать составное значение, создайте объект ApplicationDataCompositeValue . В этом примере создается составной параметр с именем exampleCompositeSetting и добавляется в localSettings контейнер.
// Composite setting Windows.Storage.ApplicationDataCompositeValue composite = new Windows.Storage.ApplicationDataCompositeValue(); composite["intVal"] = 1; composite["strVal"] = "string"; localSettings.Values["exampleCompositeSetting"] = composite;В этом примере показано, как получить только что созданное составное значение.
// Composite setting Windows.Storage.ApplicationDataCompositeValue composite = (Windows.Storage.ApplicationDataCompositeValue)localSettings.Values["exampleCompositeSetting"]; if (composite == null) < // No data >else < // Access data in composite["intVal"] and composite["strVal"] >Создание и чтение локального файла
Чтобы создать и обновить файл в локальном хранилище данных приложения, используйте API-интерфейсы файлов, такие как Windows.служба хранилища. служба хранилища Folder.CreateFileAsync и Windows.служба хранилища. FileIO.WriteTextAsync. В этом примере создается файл с именем dataFile.txt в контейнере localFolder и записывается текущая дата и время в файл. Значение ReplaceExisting из перечисления CreationCollisionOption указывает, чтобы заменить файл, если он уже существует.
async void WriteTimestamp()
Чтобы открыть и прочитать файл в локальном хранилище данных приложения, используйте API-интерфейсы файлов, такие как Windows.служба хранилища. служба хранилища Folder.GetFileAsync, Windows.служба хранилища. служба хранилища File.GetFileFromApplicationUriAsync и Windows.служба хранилища. FileIO.ReadTextAsync. В этом примере файл, dataFile.txt созданный на предыдущем шаге, считывает дату из файла. Дополнительные сведения о загрузке файлового ресурса из различных расположений см. в разделе «Загрузка файлового ресурса».
async void ReadTimestamp() < try < StorageFile sampleFile = await localFolder.GetFileAsync("dataFile.txt"); String timestamp = await FileIO.ReadTextAsync(sampleFile); // Data is contained in timestamp >catch (Exception) < // Timestamp not found >>Перемещаемые данные
Перемещаемые данные и параметры больше не поддерживаются в Windows 11. Рекомендуемая замена — Служба приложений Azure. Служба приложений Azure широко поддерживается и хорошо описана. Это надежное решение, которое поддерживает сценарии с использованием разных платформ и экосистем, включая iOS, Android и интернет-решения.
Следующая документация относится к Windows 10 версии 1909 и более низкой.
При использовании перемещаемых данных в приложении пользователи могут легко синхронизировать данные приложения на нескольких устройствах. Если пользователь устанавливает приложение на нескольких устройствах, ОС сохраняет данные приложения в синхронизации, уменьшая объем работы установки, которую пользователь должен сделать для вашего приложения на втором устройстве. Перемещение также позволяет пользователям продолжать задачу, например создание списка, вправо, где они уволились даже на другом устройстве. ОС реплика перемещает данные в облако при обновлении и синхронизирует данные с другими устройствами, на которых установлено приложение.
Перемещаемые данные для приложения доступны в облаке, если доступ к нему осуществляется пользователем с какого-то устройства в течение требуемого интервала времени. Если пользователь не запускает приложение дольше этого интервала времени, его перемещаемые данные удаляются из облака. Если пользователь удаляет приложение, его перемещаемые данные не удаляются из облака автоматически, он сохраняется. Если пользователь переустановит приложение в течение интервала времени, перемещаемые данные синхронизируются из облака.
Перемещаемые данные выполняются и не выполняются
- Используйте роуминг для пользовательских настроек и настроек, ссылок и небольших файлов данных. Например, используйте роуминг для сохранения предпочтения цвета фона пользователя на всех устройствах.
- Используйте перемещение, чтобы пользователи продолжали задачу на разных устройствах. Например, перемещайте данные приложения, такие как содержимое черновика электронной почты или недавно просматриваемую страницу в приложении чтения.
- Обработайте событие DataChanged , обновив данные приложения. Это событие возникает, когда данные приложения только что завершили синхронизацию из облака.
- Перемещайте ссылки на содержимое, а не необработанные данные. Например, перемещайте URL-адрес, а не содержимое веб-статьи.
- Для важных параметров времени используйте параметр HighPriority, связанный сроумингом Параметры.
- Не перемещайте данные приложения, относящиеся к устройству. Некоторые сведения имеют отношение только локально, например имя пути к локальному ресурсу файла. Если вы решите перемещать локальную информацию, убедитесь, что приложение может восстановиться, если сведения не действительны на дополнительном устройстве.
- Не перемещайте большие наборы данных приложения. Существует ограничение на объем данных приложения, которые может перемещать приложение; используйте свойство Roaming служба хранилища Quota, чтобы получить это максимальное значение. Если приложение достигает этого ограничения, данные не могут перемещаться до тех пор, пока размер хранилища данных приложения больше не превышает предел. При разработке приложения рассмотрите, как поместить привязку к большим данным, чтобы не превышать предел. Например, если для сохранения игрового состояния требуется 10 КБ каждой из них, приложение может разрешить только 10 игр.
- Не используйте роуминг для данных, основанных на мгновенной синхронизации. Windows не гарантирует мгновенной синхронизации; Перемещение может быть значительно отложено, если пользователь находится в автономном режиме или в сети с высокой задержкой. Убедитесь, что пользовательский интерфейс не зависит от мгновенной синхронизации.
- Не используйте перемещение для часто изменяющихся данных. Например, если ваше приложение отслеживает часто изменяющиеся сведения, например положение в песне на секунду, не сохраняйте это как перемещаемые данные приложения. Вместо этого выберите менее частое представление, которое по-прежнему обеспечивает хороший пользовательский интерфейс, как и в настоящее время играющая песня.
Предварительные требования для роуминга
Любой пользователь может воспользоваться перемещаемыми данными приложения, если он использует учетную запись Майкрософт для входа на свое устройство. Однако пользователи и администраторы групповой политики могут отключить перемещаемые данные приложения на устройстве в любое время. Если пользователь принимает решение не использовать учетную запись Майкрософт или отключает возможности перемещения данных, он по-прежнему сможет использовать данные вашего приложения, но данные приложения будут локальными на каждом устройстве.
Данные, сохраненные в PasswordVault, перемещаются, только если пользователь присвоил своему устройству статус доверенного. Если устройство не является доверенным, данные, защищенные в этом хранилище, не будут перемещаться.
Разрешение конфликтов
Данные перемещаемого приложения не предназначены для одновременного использования на нескольких устройствах одновременно. Если во время синхронизации возникает конфликт, так как на двух устройствах была изменена определенная единица данных, система всегда будет предпочитать значение, записанное последнее. Это гарантирует, что приложение использует самые актуальные сведения. Если единица данных является составной, разрешение конфликтов по-прежнему будет происходить на уровне единицы установки, что означает, что составной с последним изменением будет синхронизирован.
Когда записывать данные
В зависимости от ожидаемого времени существования параметра данные должны записываться в разное время. Нечасто или медленно изменяя данные приложения должны быть записаны немедленно. Однако данные приложения, которые часто изменяются, следует периодически записывать только через регулярные интервалы (например, каждые 5 минут), а также при приостановке приложения. Например, музыкальное приложение может записывать параметры текущей композиции в начале воспроизведения новой композиции, при этом фактическая позиция в песне должна записываться только при приостановке.
Чрезмерная защита использования
Система имеет различные механизмы защиты, чтобы избежать неправильного использования ресурсов. Если данные приложения не переходят должным образом, скорее всего, устройство временно ограничено. Ожидание некоторого времени обычно решает эту ситуацию автоматически, и никаких действий не требуется.
Управление версиями
Данные приложения могут использовать управление версиями для обновления одной структуры данных до другой. Номер версии отличается от версии приложения и может быть задан. Хотя и не применяется, настоятельно рекомендуется использовать дополнительные номера версий, так как нежелательные осложнения (включая потерю данных)могут возникнуть при попытке перейти на более низкий номер версии данных, представляющий новые данные.
Данные приложения перемещается только между установленными приложениями с одинаковым номером версии. Например, устройства в версии 2 переключят данные между собой и устройствами версии 3 будут делать то же самое, но перемещение между устройством под управлением версии 2 и устройством под управлением версии 3 не будет. При установке нового приложения, которое использовало различные номера версий на других устройствах, только что установленное приложение синхронизирует данные приложения, связанные с самым высоким номером версии.
Тестирование и средства
Разработчики могут заблокировать свое устройство для активации синхронизации перемещаемых данных приложения. Если кажется, что данные приложения не переходят в течение определенного интервала времени, проверка следующие элементы и убедитесь, что:
- Перемещаемые данные не превышают максимальный размер (см. сведения о роуминге служба хранилища Quota).
- Файлы закрыты и освобождены должным образом.
- Существует по крайней мере два устройства с одной и той же версией приложения.
Регистрация для получения уведомления при изменении перемещаемых данных
Чтобы использовать данные перемещаемого приложения, необходимо зарегистрировать для изменения перемещаемых данных и получить перемещаемые контейнеры данных, чтобы можно было считывать и записывать параметры.
- Зарегистрируйтесь для получения уведомления при изменении перемещаемых данных. Событие DataChanged уведомляет вас об изменении перемещаемых данных. Этот пример задает DataChangeHandler обработчик для изменения перемещаемых данных.
void InitHandlers() < Windows.Storage.ApplicationData.Current.DataChanged += new TypedEventHandler(DataChangeHandler); > void DataChangeHandler(Windows.Storage.ApplicationData appData, object o) < // TODO: Refresh your data >Windows.Storage.ApplicationDataContainer roamingSettings = Windows.Storage.ApplicationData.Current.RoamingSettings; Windows.Storage.StorageFolder roamingFolder = Windows.Storage.ApplicationData.Current.RoamingFolder;Создание и получение параметров роуминга
Используйте свойство ApplicationDataContainer.Values для доступа к параметрам в контейнере roamingSettings , который мы получили в предыдущем разделе. В этом примере создается простой параметр с именем exampleSetting composite и составным значением.
// Simple setting roamingSettings.Values["exampleSetting"] = "Hello World"; // High Priority setting, for example, last page position in book reader app roamingSettings.values["HighPriority"] = "65"; // Composite setting Windows.Storage.ApplicationDataCompositeValue composite = new Windows.Storage.ApplicationDataCompositeValue(); composite["intVal"] = 1; composite["strVal"] = "string"; roamingSettings.Values["exampleCompositeSetting"] = composite;В этом примере извлекаются только что созданные параметры.
// Simple setting Object value = roamingSettings.Values["exampleSetting"]; // Composite setting Windows.Storage.ApplicationDataCompositeValue composite = (Windows.Storage.ApplicationDataCompositeValue)roamingSettings.Values["exampleCompositeSetting"]; if (composite == null) < // No data >else < // Access data in composite["intVal"] and composite["strVal"] >Создание и извлечение перемещаемых файлов
Чтобы создать и обновить файл в хранилище данных перемещаемого приложения, используйте API-интерфейсы файлов, такие как Windows.служба хранилища. служба хранилища Folder.CreateFileAsync и Windows.служба хранилища. FileIO.WriteTextAsync. В этом примере создается файл с именем dataFile.txt в контейнере roamingFolder и записывается текущая дата и время в файл. Значение ReplaceExisting из перечисления CreationCollisionOption указывает, чтобы заменить файл, если он уже существует.
async void WriteTimestamp()
Чтобы открыть и прочитать файл в хранилище данных перемещаемого приложения, используйте API-интерфейсы файлов, такие как Windows.служба хранилища. служба хранилища Folder.GetFileAsync, Windows.служба хранилища. служба хранилища File.GetFileFromApplicationUriAsync и Windows.служба хранилища. FileIO.ReadTextAsync. В этом примере открывается dataFile.txt файл, созданный в предыдущем разделе, и считывается дата из файла. Дополнительные сведения о загрузке файлового ресурса из различных расположений см. в разделе «Загрузка файлового ресурса».
async void ReadTimestamp() < try < StorageFile sampleFile = await roamingFolder.GetFileAsync("dataFile.txt"); String timestamp = await FileIO.ReadTextAsync(sampleFile); // Data is contained in timestamp >catch (Exception) < // Timestamp not found >>Временные данные приложения
Временное хранилище данных приложения работает как кэш. Его файлы не перемещаются и могут быть удалены в любое время. Задача обслуживания системы может автоматически удалять данные, хранящиеся в этом расположении в любое время. Пользователь также может очистить файлы из временного хранилища данных с помощью очистки диска. Временные данные приложения можно использовать для хранения временных сведений во время сеанса приложения. Нет никаких гарантий, что эти данные будут сохраняться после окончания сеанса приложения, так как система может освободить используемое пространство при необходимости. Расположение доступно через временное свойствоFolder .
Получение временного контейнера данных
Используйте свойство ApplicationData.TemporaryFolder для получения файлов. Следующие шаги используют temporaryFolder переменную из этого шага.
Windows.Storage.StorageFolder temporaryFolder = ApplicationData.Current.TemporaryFolder;Создание и чтение временных файлов
Чтобы создать и обновить файл во временном хранилище данных приложения, используйте API-интерфейсы файлов, такие как Windows.служба хранилища. служба хранилища Folder.CreateFileAsync и Windows.служба хранилища. FileIO.WriteTextAsync. В этом примере создается файл с именем dataFile.txt в контейнере temporaryFolder и записывается текущая дата и время в файл. Значение ReplaceExisting из перечисления CreationCollisionOption указывает, чтобы заменить файл, если он уже существует.
async void WriteTimestamp()
Чтобы открыть и прочитать файл во временном хранилище данных приложения, используйте API-интерфейсы файлов, такие как Windows.служба хранилища. служба хранилища Folder.GetFileAsync, Windows.служба хранилища. служба хранилища File.GetFileFromApplicationUriAsync и Windows.служба хранилища. FileIO.ReadTextAsync. В этом примере файл, dataFile.txt созданный на предыдущем шаге, считывает дату из файла. Дополнительные сведения о загрузке файлового ресурса из различных расположений см. в разделе «Загрузка файлового ресурса».
async void ReadTimestamp() < try < StorageFile sampleFile = await temporaryFolder.GetFileAsync("dataFile.txt"); String timestamp = await FileIO.ReadTextAsync(sampleFile); // Data is contained in timestamp >catch (Exception) < // Timestamp not found >>Упорядочение данных приложения с помощью контейнеров
Для организации параметров и файлов данных приложения можно создавать контейнеры (представленные объектами ApplicationDataContainer ), а не работать непосредственно с каталогами. Контейнеры можно добавлять в локальные, перемещаемые и временные хранилища данных приложения. Контейнеры можно вложить до 32 уровней глубоко.
Чтобы создать контейнер параметров, вызовите метод ApplicationDataContainer.CreateContainer . В этом примере создается локальный контейнер параметров с именем exampleContainer и добавляется параметр с именем exampleSetting . Значение Always из перечисления ApplicationDataCreateDisposition указывает, что контейнер создается, если он еще не существует.
Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; Windows.Storage.StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder; // Setting in a container Windows.Storage.ApplicationDataContainer container = localSettings.CreateContainer("exampleContainer", Windows.Storage.ApplicationDataCreateDisposition.Always); if (localSettings.Containers.ContainsKey("exampleContainer"))Удаление параметров и контейнеров приложений
Чтобы удалить простой параметр, который больше не требуется приложению, используйте ApplicationDataContainer Параметры. Удалить метод. В этом примере удаляется локальный exampleSetting параметр, созданный ранее.
Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; Windows.Storage.StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder; // Delete simple setting localSettings.Values.Remove("exampleSetting");Чтобы удалить составной параметр, используйте метод ApplicationDataCompositeValue.Remove . В этом примере удаляется локальный exampleCompositeSetting составной параметр, созданный в предыдущем примере.
Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; Windows.Storage.StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder; // Delete composite setting localSettings.Values.Remove("exampleCompositeSetting");Чтобы удалить контейнер, вызовите метод ApplicationDataContainer.DeleteContainer . В этом примере удаляется созданный ранее контейнер локальных exampleContainer параметров.
Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; Windows.Storage.StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder; // Delete container localSettings.DeleteContainer("exampleContainer");Управление версиями данных приложения
Связанные статьи
- Windows.Storage.ApplicationData
- Windows.Storage.ApplicationData.RoamingSettings
- Windows.Storage.ApplicationData.RoamingFolder
- Windows.Storage.ApplicationData.RoamingStorageQuota
- Windows.Storage.ApplicationDataCompositeValue
