Создание подключенных приложений Магазина Windows

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

В данной статье мы рассмотрим некоторые полезные советы по обеспечению быстрого, плавного и беспроблемного опыта работы, соответствующего концепции непрерывного подключения к сети, для пользователей приложений Магазина Windows:

  • Выбирайте подходящий API для ваших сценариев.
  • Выбирайте правильные сетевые возможности.
  • Адаптируйте работу приложения для сетей с лимитным тарифным планом.
  • Реагируйте на изменения состояния сети.
  • Кэшируйте данные для обеспечения плавной работы.

А теперь давайте подробно рассмотрим каждую из этих рекомендаций.

Выбор подходящего API

Если вы собираетесь строить дом, вам понадобятся подходящие инструменты. Нужен молоток для забивания гвоздей, пила для разрезания досок и отвертка для закручивания шурупов. Аналогичным образом при разработке подключенного приложения Магазина Windows вам нужны подходящие сетевые API. Windows 8 предлагает широкий спектр сетевых API, которые ваше приложение может использовать для взаимодействия с другими компьютерами и устройствами через Интернет или частные сети. Поэтому первым делом необходимо выяснить, какие сетевые компоненты требуются приложению.

Наиболее распространенный сценарий работы с сетью заключается в доступе к веб-сайту для получения или сохранения информации. В качестве простого примера можно привести игру, использующую веб-сайт для сохранения информации о пользователе и игрового счета. Более сложным примером является приложение, подключающееся к веб-службе на базе REST и использующее библиотеку, предоставляемую этой веб-службой, для считывания или сохранения информации. В Windows 8 есть несколько API, обеспечивающих подключение к веб-службам и веб-сайтам. С помощью этих API ваше приложение может осуществлять доступ к веб-службам, поддерживающим REST, или отправлять простые команды протокола HTTP (такие как GET и POST) на веб-сервер. API для обеспечения веб-доступа выбирается в зависимости от языка, используемого для разработки приложения:

  • XMLHTTPRequest и WinJS.xhr — приложения, написанные на JavaScript и HTML.
  • HttpClient — приложения, написанные на C# или Visual Basic .NET и XAML.
  • XML HTTP Request 2 (IXHR2) — приложения, написанные на C++ и XAML.

В следующем фрагменте кода показано, как выполнить базовый запрос и ответ с использованием веб-службы на базе REST. В данном случае веб-служба может выполнить сценарий ASP.NET на веб-сервере.

JavaScript

 function makeXHRCall() {
    WinJS.xhr({ uri: "https://www.microsoft.com/en-us/default.aspx” }).done(
 function onComplete(result) {
 print(result.responseText);
 },
 function onError(err) {
 print("Error: " + err.responseText);
        });
}

C#

 private async void MakeHttpCall()
{
    HttpClient httpClient = new HttpClient();
    try {
        string response = await httpClient.GetStringAsync("https://www.microsoft.com/en-us/default.aspx");
    }
    catch (Exception) {
        // Handle exception.
    }
}

Подробнее о WinJS.xhr можно прочитать в статьеПодключение к веб-службам (приложения Магазина Windows с использованием JavaScript и HTML). Дополнительную информацию об HttpClient можно найти в статье Краткое руководство: подключение с использованием HttpClient (приложения Магазина Windows на C#, VB, C++ и XAML) и в примере HttpClient.

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

Более узкоспециализированным сценарием является доступ к сводному контенту. API Windows.Web.Syndication может получать веб-каналы в форматах RSS или Atom. Кроме того, API Windows.Web.AtomPub позволяет приложению публиковать данные в различных форматах AtomPub.

Для сценариев, для которых особый сетевой протокол более высокого уровня недоступен через API, среда выполнения Windows также поддерживает сокеты TCP и UDP (наряду с многоадресной рассылкой). API Windows.Networking.Sockets предоставляет StreamSocket (TCP) и DatagramSocket (UDP) для реализации других протоколов более высокого уровня.

Примечание. В Windows 8 представлен новый тип сокетов — WebSocket. Дополнительную информацию о сокетах WebSocket и их использовании можно найти в статье Подключение с использованием WebSocket.

В следующей таблице приведен более полный список поддерживаемых сетевых компонентов со ссылками на дополнительную информацию.

 

API

Функциональные возможности

Примеры

 

 

 

 

Получение веб-каналов в форматах RSS или Atom из нескольких разных версий. Эти API упрощают реализацию поддержки более новых форматов, таких как OData. Среда выполнения Windows также поддерживает протокол публикации Atom, что позволяет публиковать коллекции Atom. Подробнее можно прочитать в статье Доступ к сводному содержимому и управление им.

 

 

 

 

 

    • Средства чтения RSS

 

 

 

Windows.Networking.BackgroundTransfer

 

 

Непрерывная и возобновляемая загрузка и отправка контента с минимальным объемом передаваемых данных, осуществляемая даже при отсутствии вызывающего приложения на переднем плане. Этот API поддерживает передачу контента с использованием протоколов HTTP, HTTPS и FTP. Подробнее можно прочитать в статье Передача данных в фоновом режиме.

 

 

 

 

    • SkyDrive

 

    • Видео Xbox

 

 

 

 

 

 

 

 

 

 

Взаимодействие с веб-службами на базе REST и другими протоколами на основе HTTP. Подробнее можно прочитать в статье Подключение к веб-службам.

 

 

 

 

 

    • Карты Bing

 

 

 

Windows.Networking.Proximity

 

 

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

 

 

 

 

    • Игры

 

    • Приложения для совместной работы

 

 

 

Windows.Storage.Pickers

 

 

Взаимодействие с удаленными общими файловыми ресурсами. Подробнее можно прочитать в статье Доступ к данным и файлам.

 

 

 

 

    • Xbox Music

 

    • Фотографии

 

 

 

Windows.Networking.Sockets

 

 

Подключение к службе, использующей протокол, не поддерживаемый уже упомянутыми API, например SMTP, MAPI или telnet, либо подключение к другому устройству в той же локальной сети. Используется также для приложений, которым для подключения к новой веб-службе через Интернет (включая прокси-серверы HTTP) требуется семантика, аналогичная семантике сокетов (асинхронная и двунаправленная). Подробнее можно прочитать в статье Подключение с помощью сокетов.

 

 

 

 

 

 

 

    • Lync, доска для совместной работы или финансовая аналитика

 

 

 

Windows.Storage.ApplicationData

 

 

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

 

 

 

Выбор правильных сетевых возможностей

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

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

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

Запросы на доступ к сети делятся на две категории:

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

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

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

 

Сетевая возможность

Описание

Примеры приложений

Интернет (клиент)

 

 

Предоставляет исходящий доступ к Интернету и сетям в общественных местах, таких как аэропорты или кафе. Данная возможность должна объявляться большинством приложений, которым требуется доступ в Интернет.

 

       

    • Средства чтения RSS

 

    • Социальные сети

 

    • Игры

 

 

 

Интернет (клиент и сервер)

 

 

Предоставляет входящий и исходящий доступ к Интернету и сетям в общественных местах, таких как аэропорты или кафе. Входящий доступ к критически важным портам всегда блокируется. Данная возможность представляет собой расширение возможности "Интернет (клиент)", поэтому объявлять обе эти возможности не требуется.

 

 

 

    • Приложения P2P

 

    • Многопользовательские игры, в которых обнаружение игроков осуществляется посредством многоадресной рассылки

 

 

 

Частные сети (клиент и сервер)

 

 

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

 

 

 

    • Приложения, осуществляющие доступ к данным на запоминающих устройствах, подключаемых к сети (NAS)

 

    • Бизнес-приложения

 

    • Многопользовательские игры, в которых обнаружение игроков осуществляется посредством многоадресной рассылки в частной (домашней или рабочей) сети

 

 

 

Близкое взаимодействие

 

 

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

 

 

 

    • Многопользовательские игры, в которых игроки находятся поблизости друг от друга

 

 

 

Корпоративная проверка подлинности

 

 

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

 

 

 

    • Бизнес-приложения

 

 

 

Общие сертификаты пользователей

 

 

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

 

 

 

    • Приложения виртуальной частной сети

 

  • Бизнес-приложения

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

  • Определите направление доступа к сети, необходимого вашему приложению. Приложению могут требоваться только исходящие запросы, инициированные клиентом, незапрошенные входящие запросы или запросы обоих типов.
  • Определите тип сетевых ресурсов, с которыми будет взаимодействовать ваше приложение: надежные ресурсы в домашней или рабочей сети, ресурсы в Интернете или ресурсы обоих этих типов.
  • Настройте минимально необходимые возможности сетевой изоляции в манифесте приложения. Для этого вы можете использовать конструктор манифеста приложения в Microsoft Visual Studio 2012 либо добавить их вручную.
  • Выполните развертывание приложения и запустите его, чтобы протестировать с применением доступных диагностических средств сетевой изоляции. Подробнее можно прочитать в статье Включение замыкания на себя и устранение неполадок сетевой изоляции.

На следующих снимках экрана показано, как включить сетевые возможности с помощью конструктора манифеста приложения в Microsoft Visual Studio 2012.

Выбор сетевых возможностей в package.appxmanifest вашего приложения в Visual Studio 2012

Выбор сетевых возможностей в package.appxmanifest вашего приложения в Visual Studio 2012

Адаптация работы приложения для сетей с лимитным тарифным планом

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

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

API-интерфейс Windows.Networking.Connectivity предоставляет сведения о типе и стоимости сетевого подключения. Это позволяет вашему приложению определить, имеет ли смысл использовать сетевые ресурсы в обычном режиме, умеренно или с запросом разрешения у пользователя.

API-интерфейс ConnectionProfile представляет сетевое подключение. Потребность в адаптации режима работы ваше приложение может определять с помощью ConnectionCost из ConnectionProfile. Свойство NetworkCostType указывает тип сетевого подключения. Возможны четыре значения:

  • Unrestricted — использование этого сетевого подключения не ограничивается. Оно не связано с затратами на использование или ограничениями объема передаваемых данных.
  • Fixed — использование этого сетевого подключения не ограничивается до определенного предела.
  • Variable — использование этого сетевого подключения оплачивается по количеству байт.
  • Unknown — информация о стоимости использования этого сетевого подключения недоступна.

Несколько логических свойств для ConnectionCost предоставляют дополнительную информацию.

  • Roaming — подключение к сети за пределами зоны охвата домашнего поставщика услуг Интернета.
  • ApproachingDataLimit — для подключения почти исчерпан лимит использования, предусмотренный тарифным планом.
  • OverDataLimit — для подключения исчерпан лимит использования, предусмотренный тарифным планом.

Предусмотрите в своем приложении реагирование на ситуации, обозначенные этими свойствами. Если подключение имеет свойство Roaming, затраты на передачу данных по сети могут быть очень высокими. Когда NetworkCostType имеет значение Variable, используется сеть с лимитным тарифным планом, где пользователь платит за объем данных, отправленных или принятых по этой сети. Если NetworkCostType имеет значение Fixed, следует уделить внимание ситуации, когда пользователь превысил либо почти превысил лимит трафика.

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Поведение

Стоимость использования подключения

Рекомендации для приложений

Примеры

Обычное использование

 

 

NetworkCostType имеет значение Unrestricted или Unknown, а значение ConnectionCost отлично от Roaming

 

 

Приложение не применяет какие-либо ограничения. Приложение считает, что подключение работает без ограничений с точки зрения затрат или объема передаваемых данных.

 

 

 

    • Приложение проигрывателя мультимедиа может воспроизвести весь фильм с высоким разрешением.

 

    • Приложение может загрузить большой файл без ограничений или запросов.

 

 

 

Умеренное использование

 

 

NetworkCostType имеет значение Fixed или Variable, а значение ConnectionCost отлично от Roaming или OverDataLimit

 

 

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

 

 

 

    • Приложение проигрывателя мультимедиа может воспроизводить фильмы с более низким разрешением.

 

    • Приложение может откладывать загрузку данных, не имеющих критически важного значения.

 

 

 

Явное согласие

 

 

ConnectionCost имеет значение Roaming или OverDataLimit

 

 

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

 

 

 

    • Приложение запрашивает разрешение пользователя на доступ к сети.

 

  • Приложение приостанавливает все фоновые операции по обмену данными с сетью.

Этот пример кода проверяет стоимость использования подключения и выводит предложения относительно подходящего режима работы приложения.

JavaScript

 var CostGuidance = { Normal: 0, Conservative: 1, OptIn: 2 };
// GetCostGuidance returns an object with a Cost (with value of CostGuidance), 
// CostName (a string) and Reason, which says why the cost is what it is.
function GetCostGuidance() 
{
    var connectionCost = Windows.Networking.Connectivity.NetworkInformation.getInternetConnectionProfile().getConnectionCost();
    var networkCostConstants = Windows.Networking.Connectivity.NetworkCostType;
    var Retval = new Object();
    if (connectionCost.roaming || connectionCost.overDataLimit)
    {
        Retval.Cost = CostGuidance.OptIn;
        Retval.CostName = "OptIn";
        Retval.Reason = connectionCost.roaming
            ? "Connection is roaming; using the connection may result in additional charge."
            : "Connection has exceeded the usage cap limit.";
    }
    else if (connectionCost.networkCostType == networkCostConstants.fixed
        || connectionCost.networkCostType == networkCostConstants.variable)
    {
        Retval.Cost = CostGuidance.conservative;
        Retval.CostName = "Conservative";
        Retval.Reason = connectionCost.networkCostType == NetworkCostType.fixed
            ? "Connection has limited allowed usage."
            : "Connection is charged based on usage. ";
    }
    else
    {
        Retval.Cost = CostGuidance.Normal;
        Retval.CostName = "Normal";
        Retval.Reason = connectionCost.networkCostType == networkCostConstants.unknown
            ? "Connection is unknown."
            : "Connection cost is unrestricted.";
    }

    return Retval;
}

C#

 public enum NetworkCost { Normal, Conservative, OptIn };
public class CostGuidance
{
    public CostGuidance()
    {
        var connectionCost = NetworkInformation.GetInternetConnectionProfile().GetConnectionCost();
        Init(connectionCost);
    }
    public NetworkCost Cost { get; private set; }
    public String Reason { get; private set; }


    public void Init(ConnectionCost connectionCost)
    {
        if (connectionCost == null) return;
        if (connectionCost.Roaming || connectionCost.OverDataLimit)
        {
            Cost = NetworkCost.OptIn;
            Reason = connectionCost.Roaming
                ? "Connection is roaming; using the connection may result in additional charge."
                : "Connection has exceeded the usage cap limit.";
        }
        else if (connectionCost.NetworkCostType == NetworkCostType.Fixed
            || connectionCost.NetworkCostType == NetworkCostType.Variable)
        {
            Cost = NetworkCost.Conservative;
            Reason = connectionCost.NetworkCostType == NetworkCostType.Fixed
                ? "Connection has limited allowed usage."
                : "Connection is charged based on usage. ";
        }
        else
        {
            Cost = NetworkCost.Normal;
            Reason = connectionCost.NetworkCostType == NetworkCostType.Unknown
                ? "Connection is unknown."
                : "Connection cost is unrestricted.";
        }
    }
}

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

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

На вкладке "Журнал приложений" в диспетчере задач пользователи могут просмотреть данные об использовании ресурсов центрального процессора и сети различными приложениями

На вкладке "Журнал приложений" в диспетчере задач пользователи могут просмотреть данные об использовании ресурсов центрального процессора и сети различными приложениями

Реагирование на изменения состояния сети

В любом сценарии работы мобильного устройства сети могут как появляться, так и пропадать. В гараже или доме пользователя мобильная широкополосная сеть 3G или 4G, в отличие от сети Wi-Fi, может становиться недоступной. Аналогичным образом подключение к сети Wi-Fi может прерываться, когда пользователь выходит из дома. Иногда доступные сети могут вообще отсутствовать. Учитывая распространение Wi-Fi и мобильных широкополосных сетей, такие изменения в состоянии сетевого подключения будут возникать достаточно часто.

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

Потеря подключения из-за ошибки

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

Потеря подключения к сети

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

Доступность новой сети

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

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

Если вы считаете, что ваше приложение будет часто сталкиваться с необходимостью смены сетей, при обнаружении новой сети следуйте приведенным ниже рекомендациям:

  1. Проверьте стоимость использования текущей и новой сетей. Если переключение на новую сеть имеет смысл, попробуйте установить новое сетевое подключение и повторить сетевую операцию в соответствии с приведенными выше указаниями. Windows 8 автоматически выбирает сеть без ограничений трафика вместо сети с лимитным тарифным планом и более быструю сеть вместо медленной.
  2. Если подключение к новой сети выполнено успешно, используйте его в приложении и отмените исходную сетевую операцию, использующую предыдущую сеть, если такое соединение уже установлено.

Изменение стоимости сетевого подключения

Изменение стоимости сетевого подключения может произойти, когда NetworkCostType имеет значение Fixed и пользователь превысил либо почти превысил лимит трафика. Кроме того, изменение стоимости сетевого подключения может произойти, когда для NetworkCostType устанавливается значение Variable или для Roaming устанавливается значение true. В этих случаях адаптируйте поведение приложения, следуя рекомендациям из предыдущего пункта.

В следующих примерах кода используется событие NetworkStatusChanged для обеспечения удобного опыта работы с приложением при различных изменениях состояния сети. В обоих примерах используется глобальная логическая переменная registeredNetworkStatusNotification, для которой изначально задано значение false.

JavaScript

 // Register for NetworkStatusChanged notifications, and display new 
// Internet ConnectionProfile info upon network status change.
function registerForNetworkStatusChange() {
    try {

        // Register for network status change notifications.
        if (!registeredNetworkStatusNotification) {
            var networkInfo.addEventListener("networkstatuschanged", onNetworkStatusChange);
            registeredNetworkStatusNotification = true;
        }
    }
    catch (e) {
        print("An unexpected exception occurred: " + e.name + ": " + e.message);
    }
}

// Event handler for NetworkStatusChanged event
function onNetworkStatusChange(sender) {
    try {
        // Get the ConnectionProfile that is currently used to connect 
        // to the Internet.
        var internetProfile = networkInfo.getInternetConnectionProfile();
        if (internetProfile === null) {
            print("Not connected to Internet\n\r");
        }
        else {
            internetProfileInfo += getConnectionProfileInfo(internetProfile) + "\n\r";
            print(internetProfileInfo);
        }
        internetProfileInfo = "";
    }
    catch (e) {
        print("An unexpected exception occurred: " + e.name + ": " + e.message);
    }
}

C#

 // Register for NetworkStatusChanged notifications, and display new 
// Internet ConnectionProfile info upon network status change.
void NetworkStatusChange()
{
    // Register for network status change notifications.
    try
    {
        var networkStatusCallback = new NetworkStatusChangedEventHandler(OnNetworkStatusChange);
        if (!registeredNetworkStatusNotification)
        {
            NetworkInformation.NetworkStatusChanged += networkStatusCallback;
            registeredNetworkStatusNotification = true;
        }
    }
    catch (Exception ex)
    {
        rootPage.NotifyUser("Unexpected exception occurred: " + ex.ToString(), NotifyType.ErrorMessage);
    }
}

// Event handler for NetworkStatusChanged event
async void OnNetworkStatusChange(object sender)
{
    try
    {
        // Get the ConnectionProfile that is currently used to connect 
        // to the Internet 
        ConnectionProfile InternetConnectionProfile = NetworkInformation.GetInternetConnectionProfile();

        if (InternetConnectionProfile == null)
        {
            await _cd.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                rootPage.NotifyUser("Not connected to Internet\n", NotifyType.StatusMessage);
            });
        }
        else
        {
            connectionProfileInfo = GetConnectionProfile(InternetConnectionProfile);
            await _cd.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                rootPage.NotifyUser(connectionProfileInfo, NotifyType.StatusMessage);
            });
        }
        internetProfileInfo = "";
    }
    catch (Exception ex)
    {
        rootPage.NotifyUser("Unexpected exception occurred: " + ex.ToString(), NotifyType.ErrorMessage);
    }
}

Чтобы больше узнать о событии NetworkStatusChanged, ознакомьтесь со статьей Краткое руководство: управление событиями подключения и изменениями доступности и примером сетевой информации.

Кэширование данных для обеспечения плавной работы

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

Windows 8 предоставляет класс ApplicationData в пространстве имен Windows.Storage. Этот класс предоставляет доступ к хранилищу данных приложения. Это хранилище состоит из файлов и параметров, являющихся локальными по отношению к устройству, перемещаемых между несколькими устройствами или являющихся временными.

Файлы оптимально подходят для хранения больших наборов данных, баз данных или данных в распространенном формате. Файлы могут находиться в перемещаемых, локальных или временных папках. Вот что это значит:

  • Перемещаемые файлы синхронизируются на нескольких компьютерах и устройствах, где пользователи выполнили вход с использованием подключенных учетных записей. Перемещение файлов осуществляется не мгновенно. Система анализирует несколько факторов, определяя подходящий момент для отправки данных. Старайтесь не допускать превышения квоты (доступной через свойство RoamingStorageQuota) на объем перемещаемых данных, так как в противном случае операции перемещения данных будут приостановлены. Файлы нельзя перемещать, пока приложение записывает в них данные, поэтому обязательно закрывайте объекты файлов своего приложения, которые больше не нужны.
  • Локальные файлы между компьютерами не синхронизируются. Они остаются на том компьютере, где были изначально созданы.
  • Неиспользуемые временные файлы подлежат удалению. При принятии решения об удалении временного файла система учитывает такие факторы, как свободное место на диске и возраст файла.

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

JavaScript

 var roamingFolder = Windows.Storage.ApplicationData.current.roamingFolder;
var filename = "serverResponse.txt";

function cacheResponse(strResponse) {
    roamingFolder.createFileAsync(filename, Windows.Storage.CreationCollisionOption.replaceExisting)
        .done(function (file) {
            return Windows.Storage.FileIO.writeTextAsync(file, strResponse);
        });
}

function getCachedResponse() {
    roamingFolder.getFileAsync(filename)
        .then(function (file) {
            return Windows.Storage.FileIO.readTextAsync(file);
        }).done(function (response) {
            print(response);
        }, function () {
            // getFileAsync or readTextAsync failed. 
            // No cached response.
        });
}

C#

 MainPage rootPage = MainPage.Current;
StorageFolder roamingFolder = null;
const string filename = "serverResponse.txt";

async void cacheResponse(string strResponse)
{
    StorageFile file = await roamingFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
    await FileIO.WriteTextAsync(file, strResponse);
}

async void getCachedResponse()
{
    try
    {
        StorageFile file = await roamingFolder.GetFileAsync(filename);
        string response = await FileIO.ReadTextAsync(file);
    }
    catch (Exception)
    {
        // getFileAsync or readTextAsync failed.
        // No cached response.
    }
}

Дополнительную информацию о хранилище данных приложения можно найти в статье о перемещении данных приложения и примере данных приложения.

Заключение

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

- Сухаил Халид (Suhail Khalid), руководитель программы II, Windows

Соавторы: Стивен Бейкер (Steven Baker) и Питер Смит (Peter Smith)