Опубликован: 10.04.2013 | Уровень: для всех | Доступ: платный
Лекция 2:

Состояния, параметры, файлы и документы

Аннотация: Здесь читателю предлагается подробное описание особенностей обработки состояний приложения, методика работы с настраиваемыми пользователем параметрами приложения и с пользовательскими данными

Файлы к данной лекции Вы можете скачать здесь.

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

Программное обеспечение, к счастью, не связано подобными ограничениями. Отправить своих людей в гостиницу перед своим приездом не означает необходимость бронирования для них авиабилетов, не нужно платить им зарплату и обеспечивать медицинскую страховку, не нужно делать вклады в их пенсионное обеспечение. Все, что нужно – подключение к Интернету, облачные сервисы, и вуаля! Все ваши предпочтения могут автоматически путешествовать вместе с вами. То есть – перемещаться между различными устройствами, которыми вы пользуетесь.

Этот опыт работы с перемещаемыми данными (roaming experience), как он называется, встроен в Windows 8 для параметров, оказывающих влияние на систему, таких, как изображение вашего профиля, установки начального экрана, избранные интернет-страницы, тема рабочего стола, сохраненные учетные данные и так далее. Когда вы используете учетную запись Microsoft для входа в Windows на доверенном компьютере, эти параметры безопасно сохраняются в облаке и автоматически перемещаются на другие доверенные устройства под управлением Windows 8, на которых вы используете ту же учетную запись. Я был приятно удивлен, когда в ходе разработки Windows 8 мне не приходилось вручную переносить все эти данные, когда я обновлял предварительные релизы системы на своем компьютере!

Если подобное возможно для системных параметров, пользователи будут ожидать похожего поведения и от приложений. Они будут ожидать, что параметры приложения будут надлежащим образом перемещаться с одного устройства на другое. Я сказал "надлежащим образом", так как некоторые настройки не имеет смысла перемещать, особенно те, которые специфичны для аппаратного обеспечения устройства. С другой стороны, если я настраиваю почтовые учетные записи в приложении на одном компьютере, я, конечно, надеюсь на то, что они окажутся и на других! (Не могу точно сказать вам, сколько раз я настраивал четыре своих активных почтовых учетных записи в Outlook). В общем, как пользователь, я ожидаю, что мой переход между устройствами – как на уровне системы, так и на уровне приложений – будет прозрачным и гладким.

Таким образом, это означает, что каждое приложение должно выполнять свою работу по управлению собственным состоянием (включая – перемещение документов и других пользовательских данных посредством служб наподобие SkyDrive), и даже обеспечивать те виды кэширования, которые помогут увеличить производительность и сформировать хороший опыт взаимодействия пользователя и программы в условиях, когда устройство не подключено к Интернету. Как я уже говорил о многих подобных функциональных деталях, усилия, которые вы вкладываете в них, могут сыграть важную роль в том, как пользователи воспринимают ваше приложение и в том, какие оценки и отзывы о приложени они оставят в Магазине Windows.

Многие подобные параметры будут полностью внутренними по отношению к приложению, а другие пользователь может настраивать и обычно так и поступает. В прошлом это порождало сложные наборы из вложенных диалоговых окон с множеством закладок, каждая из котоых была украшена кнопками, выпадающими меню и большими взаимосвязаными группами флажков и переключателей. Как результат, в деле настройки приложений не было единообразия. Не было и постоянного места, где располагались настройки приложений. Это могли быть, кроме прочих, команды меню Инструменты > Параметры, или Правка > Предустановки, или Файл > Сведения

К счастью, те, кто проектировал Windows 8 поняли, что у большинства приложений есть какие-либо параметры, поэтому они включили чудо-кнопку Параметры в панель чудо-кнопок, вместе с другими, практически так же распространенными, кнопками для доступа к функциям поиска, для огранизации общего доступа к данным, для работы с устройствами. С одной стороны, это избавляет пользователей от необходимости помнить о том, где находятся настройки конкретного приложения. Разработчиков это избавляет от необходимости решать, как именно встроить подсистему настройки параметров в содержимое и навигационную иерархию приложения. Таким образом, помещенные в интерфейс, обеспечиваемый чудо-кнопкой Параметры, параметры эффективно устраняются из структуры содержимого приложения, что упрощает общую структуру приложения. Приложению лишь нужно предоставить различные страницы, которые отображаются, когда пользователь нажимает на чудо-кнопку Параметры.

Очевидно, данные приложения – параметры и внутренние состояния – лишь часть рассказа. Пользовательские данные (user data), такие, как документы, картинки, музыкальные и видео-файлы – тоже весьма важны. Для работы с ними мы ищем соответствующие возможности в манифесте приложения, позволяющие приложению работать с документами и медиа-библиотеками, со сменными носителями информации, позволяющие ему получать доступ к содержимому папок с помощью запросов. Мы решаем, как средство выбора файлов (file picker) позволит пользователю принять решение о доступе к другим безопасным областям файловой системы (но не к системным областям и папкам данных других приложений).

И здесь Windows 8, на самом деле, выводит нас за пределы локальной файловой системы. Подавляющее большинство данных, к которым имеет доступ современный пользователь, обычно расположены в сетевых хранилищах данных, а не в локальной файловой системе. Проблема здесь в том, что подобные данные обычно скрыты за специализированными API или веб-сервисами, что означает, что пользователь должен самостоятельно работать с веб-приложениями для просмотра данных, загружать и сохранять их в локальную файловую систему, и затем импортировать их в другие приложения. Видя такую модель взаимодействия, разрабочтики Windows 8 нашли другую возможность, которая представляет новый уровень интеграции и единообразия, которая позволяет приложениям представлять данные, хранящиеся в различных сервисах так, что они выглядят для других приложений как часть локальной файловой системы. Подобное реализуется посредством контракта средства выбора файлов (file picker contract), предоставляя пользователям возможность бесшовного опыта взаимодействия с локальными и сетевыми данными. Здесь мы рассмотрим ситуацию с точки зрения пользователя, а в лекции 1 курса "Программная логика приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript и их взаимодействие с системой", поговорим о провайдерах данных.

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

Рассказ о состояниях приложения

Продолжая сравнение, о котором мы говорили в начале лекции, когда мы приезжаем в новые места и останавливаемся в гостинице, большинство из нас признает тот факт, что им, по прибытии, придется потратить некоторое время на то, чтобы распаковать вещи и расставить все в комнате так, как нам нравится. С другой стороны, мы ожидаем полной противоположености от наших домов: мы ожидаем преемственности или сохранения состояния (statefulness). За последний год я дважды переезжал (один раз – во временное жилище, пока наш дом не был достроен), и я способен оценить достоинства сохранения состояния. Представьте себе, что все в вашем доме упаковывается в коробки каждый раз, когда вы уезжаете. В итоге вам приходится тратить несколько часов, дней или недель на то, чтобы все распаковать! Нет, дом – это место, в котором, по нашим ожиданиям, вещи остаются на своих местах, даже если мы на некоторое время уезжаем. Думаю, именно поэтому многие люди любят путешествовать в домах на колесах!

Приложения для Магазина Windows рассчитаны на такую вот неизменность состояния, что означает, что они поддерживают у пользователя ощущение преемственности между сеансами работы, даже если приложение было приостановлено или остановлено между сеансами. Таким образом, приложения воспринимаются больше как дом, а не как временное пристанище. Они становятся местом, в которое пользователь приходит, чтобы отдохнуть среди данных, которые ему нужны. В итоге, чем меньше усилий ему потребуется, чтобы начать наслаждаться подобным опытом взаимодействия с программой – тем лучше.

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

Чтобы четко осознавать понятие "состояние приложения", вернемся ненадолго к пользовательским данным. Пользовательские данные, наподобие документов, изображений, музыкальных записей, видеофайлов, плейлистов и других подобных данных, создаются и используются приложением, но не зависят от приложения. Пользовательские данные подразумевают возможность работы с ними из разных приложений, и такие данные всегда остаются в системе, вне зависимости от существования приложения. Поэтому данные пользователя не являются частью состояния приложения. То есть, хотя приложение может запоминать пути (paths) к документам и другим файлам в составе списков избранных материалов или среди недавно использованных объектов реальное содержимое (content) этих файлов не является частью состояния приложения. Пользовательские данные, таким образом, не имеют прочной взаимосвязи с событиями жизненного цикла приложения. Их обычно сохраняют либо по непосредственной команде пользователя, либо, неявно, по событию наподобие visibilitychange, вместо использования такого события, как suspending. Опять же, приложение может запомнить список загруженных файлов как часть состояния сеанса работы при обработке события suspending, но содержимое файлов следует сохранить вне этого события, так как у вас есть лишь пять секунд на то, чтобы совершить все необходимые действия.

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

Данные приложения используются для управления следующими видами состояний:

  • Состояние сеанса (Session state). Это состояние, которое приложение сохраняет при приостановке для восстановления его после возможной остановки. Сюда включаются данные форм, история навигации по страницам и так далее. Как мы видели в лекции 3 курса "Введение в разработку приложений для Windows 8 с использованием HTML, CSS и JavaScript", перезапуск после приостановки и последующей остановки – это единственный случай, в котором приложение восстанавливает состояние сеанса. Состояние сеанса обычно сохраняют инкрементно (при изменении состояния), либо при обработке событий suspending или checkpoint.
  • Локальное состояние приложения (Local app state). Это – параметры, которые обычно загружаются при запуске приложения. Состояние приложения включает в себя кэшированные данные, сохраненные результаты поиска, списки недавно просмотренных элементов и различные параметры поведения приложения, которые отображаются в панели Параметры в виде настроек отображаемых элементов, предпочитаемых видеоформатов, настроек, зависящих от устройства и так далее. Локальное состояние приложения обычно сохраняется при его изменении, а не при обработке событий жизненного цикла приложения.
  • Перемещаемое состояния приложения (Roaming app state). Это состояние приложения, которое перемещается между экземплярами одного и того же приложения, исполняющимися на различных Windows 8 – устройствах, на которых пользователь выполнил вход. Это – списки избранного, позиция воспроизведения видео, параметры учетной записи, URI для важных файлов в облачном хранилище данных, возможно, некоторые сохраненные результаты поиска или запросы, и так далее. Так же, как локальном состоянием приложения, этим состоянием ожно управлять посредством панели Параметры. Перемещаемое состояние так же лучше всего сохранять при изменении значений. Больше об этом мы узнаем далее в этой лекции.

Есть два других компонента состояния приложени, которыми, на самом деле, управляют вне папки данных приложения или контейнеров параметров. Один из них – это список файлов, которые изначально получены посредство средства выбора файлов, к которым приложению может понадобиться программный доступ в будущем. Для подобных файлов недостаточно сохранить лишь путь – нужно сохранить и сведения о факте предоставления пользователем разрешения на доступ к ним с помощью средства выбора файлов. Это – цель использования API Windows.Storage.AccessCache ( http://msdn.microsoft.com/library/windows/apps/windows.storage.accesscache.aspx), и, в целом, является частью локального состояния приложения.

Второй компонент – это учетные данные, которые вы получили от пользователя и хотите использовать в будущем. Так как эти данные имеют критическую важность, в плане безопасности, приложению никогда не следует хранить их в составе собственных данных. Вместо этого используйте API хранилища учетных данных Windows.Security.Credentials.PasswordVault (http://msdn.microsoft.com/library/windows/apps/windows.security.credentials.passwordvault.aspx). Содержимое хранилища будет перемещаться между доверенными ПК пользователя, и, таким образом, составлять часть перемещаемого состояния приложения. Больше об этом вы узнаете в лекции 3 курса "Программная логика приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript и их взаимодействие с системой".

Параметры и состояние приложения

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

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

В панели чудо-кнопки Параметры следует отображать те параметры приложения, которые влияют на приложение в целом и изменяются лишь изредка. Состояния, которые применимы только к отдельным страницам или рабочим процессам, не следует отображать в интерфейсе чудо-кнопки Параметры: их следует разместить прямо на странице (на полотне приложения) или в панели приложения, как мы видели в "Командный пользовательский интерфейс" . Все это по-прежнему входит в состав состояния приложения, подлежит соответствующему управлению, но не все подходит для чудо-кнопки Параметры.

Вот некоторые примеры хороших кандидатов на размещение в интерфейсе чудо-кнопки.

  • Отображение предустановок, наподобие единиц измерения, цветовых тем, выравнивающих сеток и предустановок.
  • Предпочтения, касающихся перемещаемых данных, которые позволяют пользователю настроить перемещение данных приложения, такое, как, например, раздельное хранение настроек для рабочего и домашнего компьютеров.
  • Настройки учетной записи и профиля, а так же – команды для входа в аккаунт и выхода от него, и для управления аккаунтами и профилями. Никогда не следует хранить пароль в составе локальных или перемещаемых состояний, используйте вместо этого Хранилище учетных данных.
  • Параметры, влияющие на поведение приложения, наподобие оффлайнового и онлайнового режима, авто-обновления данных, интервалов обновления данных, предпочитаемого качества потокового аудио и видео. Здесь же находятс параметры передачи данных в сетях с лимитными тарифными планами, расположения, из которых приложению следует загружать данные и так далее.
  • Форма или ссылка для обратной связи, с помощью которой вы можете получить от пользователя какую-то особую информацию.
  • Дополнительные сведения о приложении, такие, как Справка, О программе, страница с информацией об авторских правах, заявление о конфиденциальности, лицензионное ограничение, условия использования. Часто подобные команды перенаправляют пользователя на специальный сайт, такой подход отлично подходит для реализации.

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

Если говорить об этом, то Windows автоматически предоставляет всем приложениям команды, которые называются Разрешения (Permissions) и Отзывы и оценки (Rate and Review). Команда Отзывы и оценки ведет пользователя к странице приложения в Магазине Windows, где пользователь может поставить приложению оценку и написать отзыв. Команда Разрешения, в свою очередь, позволяет пользователю контролировать доступ к критически важным ресурсам, таким, как определение местоположения, камера, микрофон и так далее. То, что появляется в данном разделе, зависит от набора возможностей, объявленных в манифесте приложения, и это то место, где пользователь может отозвать то или иное разрешение или предоставить его приложению. Конечно, если приложение не использует подобных возможностей, команда Разрешения не отображается.

Вы можете обратить внимание на то, что я не упоинал отображение сведений об обновлениях приложения внутри интерфейса чудо-кнопки Параметры. В этом нет необходимости, так как уведомления об обновлениях обеспечиваются напрямую Магазином Windows. Это – еще один способ уменьшения количества ненужного содержимого, с которым ранее сталкивались пользователи, когда каждое приложение по-своему представляло информацию об обновлениях (и иногда это происходило слишком часто!).

Расположение данных приложения

Теперь, когда мы понимаем, какик виды информации составляют состояние приложения, следующий вопрос заключается в том, где все это хранится. Вы можете помнить, из Главы 1 курса "Введение в разработку приложений для Windows 8 с использованием HTML, CSS и JavaScript", что когда Windows устанавливает приложение для пользователя (и все приложения для Магазина Windows доступны только тому пользователю, который их устанавливает), она автоматически создает папки LocalState, TempState и RoamingState внутри папки AppData текущего пользователя. Те же папки удаляются при деинсталляции приложения. В файловой системе, если вы, с помощью Проводника, перейдете в папку %localappdata%\packages, вы увидите множество папок для различных приложений в вашей системе. Если вы зайдете в любую из них, вы увидите вышеописанные папки вместе с еще одной, которая называется "Settings", как показано на рис. 2.1 для встроенного в систему приложения Sports (Спорт). На рисунке так же показано различное содержимое этих папок.

Папка AppData приложения Sports (Спорт) и ее содержимое

Рис. 2.1. Папка AppData приложения Sports (Спорт) и ее содержимое

В папке LocalState на рис. 2.1 вы можете видеть файл с именем _sessionState.json. Это файл, где WinJS хранит, и откуда загружает содержимое объекта WinJS.Application.sessionState, как мы видели в лекции 3 курса "Введение в разработку приложений для Windows 8 с использованием HTML, CSS и JavaScript". Так как это обычный текстовый файл в формате JSON, вы можете просто открыть его в приложении Notepad (Блокнот) или в любом другом просмотрщике JSON для того, чтобы просмотреть его содержимое. Если вы взглянете на открытый файл приложения Sports (Спорт), который показан на рисунке, вы увидите что-то вроде {"lastSuspendTime":1340057531501}. Приложение Sports (Спорт) (вместе с приложениями News (Новости), Weather (Погода), и так далее), отображает содержимое, зависящее от времени, таким образом, это и другие приложения сохраняют время, когда они были приостановлены и проверяют прошедшее время при возобновлении. Если это время превышает интервал обновления данных, они могут запросить новые данные с сервиса, с которым связаны. В случае приложения Sports (Спорт), один из его параметров позволяет пользователю настроить интервал обновления данных.

Если ваше приложение использует любое API хранения данных HTML5, такое, как локальное хранилище, IndexedDB, и кэш приложения, их данные так же появятся в папке LocalState.

Примечание. Если вы внимательно посмотрите на рис. 2.1 вы увидите, что все папки с данными приложения, включая перемещаемые данные, находятся в папке пользователя AppData/Local. Есть и папка, родственная ей, AppData/Roaming, но она применяется лишь для параметров перемещаемых учетных записей пользователей в интранет-сети, как в случае, когда пользователь из присоединенного домена входит в систему с другого компьютера в корпоративной сети. Эта папка AppData/Roaming никак не связана с папкой AppData/Local…/RoamingState приложений для Магазина Windows.

Вы можете обращаться к этим расположениям различными программными способами. Во-первых, вы можете использовать URI-схему ms-appdata:///, как мы видели в лекции 3 курса "Введение в разработку приложений для Windows 8 с использованием HTML, CSS и JavaScript". Здесь ms-appdata:///local, ms-appdata:///roaming, и ms-appdata:///temp позволяют обратиться к отдельным папкам и их содержимому. (Обратите внимание на тройной слэш, что является сокращением, позволяющим вам опускать имя пакета приложения). Так же вы можете использовать объект, который возвращает метод Windows.Storage.ApplicationData.current, который содержит все необходимые API, которые нужны вам для работы с состоянием приложения.

Кстати, у вас могут быть данные только для чтения прямо в пакете приложения. С помощи URI вы можете просто использовать относительные пути, которые начинаются с /. Если вы хотите открыть и прочитать содержимое файла напрямую, вы можете использовать объект StorageFolder из свойства Windows.ApplicationModel.Package.current.installedLocation. Скоро мы вернемся к классу StorageFolder.

Дмитрий Мельник
Дмитрий Мельник
Беларусь
Сергей Ширяев
Сергей Ширяев
Россия, г. Москва