Criando aplicativos conectados da Windows Store

As pessoas estão sempre cercadas por dispositivos conectados a uma rede. Até mesmo as geladeiras e máquinas de lavar mais modernas podem se conectar à Internet e a redes domésticas. Por isso, é claro que os usuários finais esperam que seus aplicativos também estejam conectados. Esses ¨aplicativos conectados¨ consomem o conteúdo mais recente da Web: mídias sociais, mídias digitais, blogs e outros tipos de conteúdo. O desenvolvimento de aplicativos conectados tornou-se a norma, ainda assim pode ser desafiador lidar com problemas comuns, como a perda da conexão à rede, os custos de redes limitadas ou problemas de desempenho. Mais do que nunca, o Windows 8 facilita a escrita de um aplicativo conectado.

Nesta postagem, apresentaremos algumas dicas úteis para você proporcionar uma experiência de conexão rápida, fluida e descomplicada aos usuários dos seus aplicativos da Windows Store.

  • Escolha a API certa para os seus cenários
  • Escolha as funcionalidades de rede certas
  • Adapte o comportamento do aplicativo para redes limitadas
  • Reaja à alteração de status da rede
  • Conteúdo de cache para fluidez

Agora, vamos falar mais sobre os detalhes de cada dica.

Escolha a API certa

Para construir uma casa, você vai querer usar as ferramentas certas. Um martelo para martelar pregos, uma serra para cortar tábuas e uma chave de fenda para apertar os parafusos. Da mesma forma, você buscará as APIs de rede certas para desenvolver um aplicativo conectado da Windows Store. O Windows 8 oferece uma grande variedade de APIs de rede que seu aplicativo pode usar para se comunicar com outros computadores e dispositivos pela Internet ou em redes privadas. Por isso, o primeiro passo é determinar os recursos de rede de que seu aplicativo precisa.

O cenário de rede mais comum é o acesso a um site para obter ou armazenar informações. Um exemplo simples seria um jogo que usa um site para armazenar informações e pontuações dos usuários. Um exemplo mais complexo seria um aplicativo que se conecta a um serviço Web baseado em REST e usa uma biblioteca fornecida pelo serviço Web para acessar ou armazenar informações. O Windows 8 conta com várias APIs que se conectam a sites e serviços Web. Com essas APIs, seu aplicativo pode acessar serviços Web que dão suporte a REST ou enviar comandos básicos de protocolo HTTP (como GET e POST) a um servidor Web. Para o acesso à Web, a API certa depende da linguagem que você usa para desenvolver o aplicativo:

O código a seguir mostra como executar uma solicitação/resposta básica com um serviço Web baseado em REST. Neste caso, o serviço Web poderia executar um script ASP.NET no servidor Web.

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.
    }
}

Para obter mais informações sobre WinJS.xhr, consulte Conectando serviços Web (aplicativos da Windows Store em JavaScript e HTML). Para obter mais informações sobre HttpClient, consulte Início rápido: Conectando com o uso de HttpClient (aplicativos da Windows Store em C#/VB/C++ e XAML) e a amostra de HttpClient.

Outro cenário de rede comum é baixar e carregar arquivos em transferências que podem levar algum tempo. Um exemplo seria um aplicativo de câmera ou galeria de fotos que precisa carregar ou baixar fotos ou álbuns de fotos de um serviço Web. Essas transferências podem levar muito tempo, por isso não faz sentido obrigar o usuário a esperar até que a transferência termine. A API Windows.Networking.BackgroundTransfer oferece a capacidade de baixar ou carregar arquivos mesmo quando seu aplicativo não está mais em execução. O aplicativo começa a transferência quando está em execução em primeiro plano, com foco, e o Windows 8 continua a transferência em segundo plano, mesmo se o aplicativo não estiver mais em execução.

Outro cenário mais especializado é o acesso a conteúdo sindicalizado. A API Windows.Web.Syndication pode obter feeds nos formatos RSS ou Atom. Além disso, a API Windows.Web.AtomPub permite que um aplicativo publique dados em vários formatos AtomPub.

Em cenários para os quais não há um protocolo de rede de nível superior específico disponível por meio de uma API, o Tempo de Execução do Windows também oferece suporte para soquetes TCP e UDP (juntamente com multicast). A API Windows.Networking.Sockets oferece uma StreamSocket (TCP) e a DatagramSocket (UDP) para que você possa implementar outros protocolos de camada superior.

Observação: O Windows 8 apresenta um novo tipo de soquete chamada WebSocket. Para obter mais informações sobre WebSockets e quando usá-las, consulte Conectando-se com WebSockets.

A tabela a seguir apresenta uma lista mais completa de recursos de rede suportados, com links para informações adicionais.

 

APIs

Recursos

Exemplos

Obtenção de feeds nos formatos RSS ou Atom em várias versões. Essas APIs facilitam a implementação de suporte para novos formatos, como OData. O Tempo de Execução do Windows também oferece suporte para o protocolo de publicação Atom, permitindo a publicação de coleções Atom. Para obter mais informações, consulte Acessando e gerenciando conteúdo sindicalizado.

Windows.Networking.BackgroundTransfer

Download e carregamento de conteúdo ininterrupto, continuável e com reconhecimento de custos, mesmo quando o aplicativo de chamada não está em primeiro plano. Essa API oferece suporte para transferências de conteúdo com o uso de protocolos HTTP, HTTPS e FTP. Para obter mais informações, consulte Transferindo dados em segundo plano.

Interação com serviços Web baseados em REST e outros protocolos baseados em HTTP. Para obter mais informações, consulte Conectando serviços Web.

Windows.Networking.Proximity

Detecção da proximidade entre dois dispositivos, para que os aplicativos possam ativar a comunicação em rede entre eles com o uso de APIs de soquete. Para obter mais informações, consulte Suportando proximidade e toque.

Windows.Storage.Pickers

Comunicação com compartilhamentos de arquivos remotos. Para obter mais informações, consulte Acessando dados e arquivos.

Windows.Networking.Sockets

Conexão a um serviço que usa um protocolo não suportado pelas APIs já mencionadas, como SMTP, MAPI ou telnet, ou conexão com outro dispositivo na mesma rede local. Usada também para aplicativos que requerem semântica semelhante a de soquetes (assíncrona, bidirecional) para se conectarem pela Web (incluindo proxies HTTP) a um novo serviço. Para obter mais informações, consulte Conectando-se com soquetes.

Windows.Storage.ApplicationData

O Windows 8 transfere automaticamente determinados dados de aplicativos entre os dispositivos dos usuários. O roaming de dados de aplicativos beneficia os aplicativos que os usuários utilizam em mais de um dispositivo, como um PC no trabalho e um tablet em casa, e instala o aplicativo em vários dispositivos. Para obter mais informações, consulte Diretrizes de dados de aplicativo de roaming.

Escolha as funcionalidades de rede certas

O isolamento da rede é parte do modelo de segurança de aplicativos usado pelo Windows 8. O Windows detecta limites de rede ativamente e aplica restrições de acesso à rede para o isolamento da mesma. Quando implantadas adequadamente, essas funcionalidades ajudam a proteger seus usuários e aplicativos de ataques mal-intencionados.

Os aplicativos devem declarar funcionalidades de isolamento de rede para definir o escopo do acesso à rede. Sem declarar essas funcionalidades, seu aplicativo não terá acesso aos recursos da rede. Consulte Como definir as funcionalidades de rede para saber mais sobre como o Windows aplica o isolamento da rede para aplicativos.

Você não pode usar a rede como um mecanismo de comunicação interprocessual entre um aplicativo da Windows Store e um aplicativo de desktop no mesmo dispositivo. Por esse motivo, não é possível usar endereços de loopback IP em um aplicativo da Windows Store. Há exceções limitadas para fins de desenvolvimento que permitem o uso de endereços de loopback IP em operações no depurador do Visual Studio. Para obter mais informações, consulte Como habilitar loopback e solucionar o isolamento de rede.

As solicitações de acesso à rede se dividem em duas categorias:

  1. Solicitações de saída iniciadas pelo cliente: Seu aplicativo age como o cliente e inicia o acesso à rede enviando uma solicitação de rede inicial a um computador remoto, normalmente um servidor. O aplicativo envia uma ou mais solicitações ao servidor, e o servidor envia de volta uma ou várias respostas. Por exemplo, todo tráfego de um aplicativo de cliente Web a um servidor Web se inclui nessa categoria.
  2. Solicitações de entrada não solicitadas: Seu aplicativo age como um servidor de rede e escuta solicitações de rede de entrada de um computador remoto. O computador remoto inicia o acesso à rede enviando uma solicitação inicial ao seu aplicativo, que age como um servidor. O computador remoto envia uma ou mais solicitações ao seu aplicativo, que envia de volta uma ou várias respostas ao computador remoto. Por exemplo, um aplicativo que funciona como um servidor de mídia se inclui nessa categoria.

Siga o princípio do mínimo de privilégios e adicione apenas as funcionalidades de que seu aplicativo precisa. Talvez seu aplicativo precise apenas de solicitações de saída iniciadas pelo cliente ou também precise de solicitações de entrada não solicitadas. Alguns aplicativos podem precisar também de acesso a certificados e credenciais de usuário no processo de autenticação em uma rede.

A tabela a seguir mostra detalhes das funcionalidades de isolamento de rede e outros recursos relacionados que costumam ser necessários para aplicativos conectados. As três primeiras são funcionalidades primárias de isolamento de rede que os aplicativos conectados usam. Na verdade, seu aplicativo conectado deve ter pelo menos uma destas três primeiras funcionalidades. Os outros itens na tabela são funcionalidades adicionais que muitas vezes são necessárias por alguns aplicativos conectados.

 

Funcionalidade de rede

Descrição

Aplicativos de exemplo

Internet (cliente)

Fornece acesso de saída à Internet e a redes em locais públicos como aeroportos e cafés. A maioria dos aplicativos que requerem acesso à Internet devem declarar essa funcionalidade.

       

  • Leitores de RSS
  • Redes sociais
  • Jogos

Internet (cliente e servidor)

Fornece acesso de entrada e saída à Internet e a redes em locais públicos como aeroportos e cafés. O acesso de entrada a portas essenciais é sempre bloqueado. Essa funcionalidade é um superconjunto da funcionalidade Internet (cliente); não é necessário declarar as duas.

  • Aplicativos P2P
  • Jogos multiplayer que detectam jogadores com o uso de multicast

Redes privadas (cliente e servidor)

Fornece acesso de entrada e saída à rede em locais privados listados como confiáveis pelo usuário. Esses locais são geralmente as redes de casa ou do trabalho. O acesso de entrada a portas essenciais é sempre bloqueado.

  • Aplicativos que acessam conteúdo NAS
  • Aplicativos de linha de negócios
  • Jogos multiplayer que detectam jogadores com o uso de multicast em uma rede privada (em casa ou no trabalho)

Proximidade

Necessária para comunicação de proximidade a curta distância com dispositivos. Permite que os aplicativos acessem a rede para se conectar a um dispositivo a curta distância, com consentimento do usuário para enviar ou aceitar um convite.

  • Jogos multiplayer com usuários a curta distância

Autenticação empresarial

Fornece a funcionalidade para se conectar a recursos da intranet empresarial que requerem credenciais de domínio.

  • Aplicativos de linha de negócios

Certificados compartilhados de usuário

Fornece a funcionalidade para acessar certificados de software e hardware, como certificados de cartão inteligente, para validar a identidade de um usuário. Quando APIs relacionadas são chamadas no tempo de execução, o usuário deve realizar uma ação (inserir um cartão ou selecionar um certificado).

  • Aplicativos de rede privada virtual
  • Aplicativos de linha de negócios

Use esta lista de verificação para garantir que o isolamento de rede está configurado no seu aplicativo:

  • Determine a direção do acesso à rede de que o seu aplicativo precisa, as solicitações de saída iniciadas por clientes, solicitações de entrada não solicitadas, ou ambos.
  • Determine o tipo de recursos de rede com os quais o seu aplicativo se comunicará: recursos confiáveis em uma rede doméstica ou corporativa, recursos na Internet ou ambos.
  • Configure a capacidade de isolamento mínima necessária da rede no manifesto do aplicativo. Você pode fazer isso usando o Designer de Manifesto de Aplicativo no Microsoft Visual Studio 2012, ou adicione-os manualmente.
  • Implante e execute o seu aplicativo para testá-lo usando as ferramentas de isolamento da rede para solucionar problemas. Para obter mais informações, consulte Como habilitar loopback e solucionar o isolamento de rede.

A captura de tela seguinte mostra como habilitar as funcionalidades da rede, usando o Designer de Manifesto de Aplicativo no Microsoft Visual Studio 2012.

Selecione funcionalidades de rede no package.appxmanifest do seu aplicativo no Visual Studio 2012

Selecione funcionalidades de rede no package.appxmanifest do seu aplicativo no Visual Studio 2012

Adapte o comportamento do aplicativo para redes limitadas

Pense sobre a última vez em que você estava chegando ao seu limite mensal de dados ou, talvez, na última vez em que você viajou para o exterior. Nestas situações, eu normalmente acabava usando o meu dispositivo e os meus aplicativos com cautela para evitar tarifas de rede desnecessárias.

O Windows 8 trata desse problema do usuário permitindo que os aplicativos monitorem os recursos disponíveis da rede e se comportem adequadamente quando estiverem em redes limitadas. Para promover a confiança dos usuários em seu aplicativo, você pode torná-lo capaz de identificar quando uma conexão pode incorrer em custos e adaptar o comportamento do aplicativo para evitar ou reduzir essas tarifas.

A API Windows.Networking.Connectivity fornece informações sobre o tipo e o custo de uma conexão de rede. Isto permite que o seu aplicativo determine quando usar os recursos da rede normalmente, quando usá-los de maneira conservadora ou quando solicitar a permissão do usuário.

Uma ConnectionProfile representa uma conexão de rede. O seu aplicativo pode usar a ConnectionCost de uma ConnectionProfile para determinar se deve ou não adaptar o seu comportamento. A propriedade NetworkCostType indica o tipo de conexão de uma rede. Existem quatro valores possíveis:

  • Irrestrita: o uso desta conexão de rede é ilimitado. Ela não tem tarifas de uso ou restrições na capacidade.
  • Fixa: o uso desta conexão de rede é irrestrito até um limite específico.
  • Variável: o uso desta conexão de rede é limitado por uso de bytes.
  • Desconhecida: a informação de custo não está disponível para esta conexão de rede.

Diversas outras propriedades boolianas para a ConnectionCost oferecem ainda mais informações.

  • Roaming: a conexão é com uma rede fora do provedor doméstico.
  • ApproachingDataLimit: a conexão está chegando ao limite de uso especificado pelo plano de dados.
  • OverDataLimit: a conexão excedeu o limite de uso especificado no plano de dados.

Faça o seu aplicativo responder às condições indicadas por essas propriedades. Sempre que uma conexão estiver Roaming, os custos de dados associados ao uso da rede podem ser elevados. Quando a NetworkCostType for Variável, a rede é uma rede limitada, onde o usuário paga pelo volume de dados enviados ou recebidos na rede. Quando a NetworkCostType for Fixa, existe causa para preocupação caso o usuário já esteja acima ou chegando próximo ao limite de dados.

Utilizando estas informações, um aplicativo pode seguir essas diretrizes para decidir como melhor utilizar os recursos da rede.

Comportamento

Custo da conexão

Diretrizes do aplicativo

Exemplos

Normal

A NetworkCostType é irrestrita ou desconhecida e a ConnectionCost não está Roaming

O aplicativo não implementa restrições. O aplicativo trata a conexão como sendo Ilimitada em custo e sem restrições derivadas de tarifas de uso ou restrições de capacidade.

  • O aplicativo de media player pode reproduzir um filme HD inteiro.
  • O aplicativo pode fazer o download de um arquivo grande sem quaisquer restrições ou consultas.

Conservador

A NetworkCostType é Fixa ou Variável e a ConnectionCost não está Roaming ou OverDataLimit

O aplicativo implementa restrições para o uso otimizado da rede de modo que possa lidar com operações em redes limitadas.

  • O aplicativo de media player pode reproduzir filmes em resoluções mais baixas.
  • O aplicativo pode atrasar downloads que não sejam importantes.

Opções

A ConnectionCost está Roaming ou OverDataLimit

O aplicativo lida com casos excepcionais onde o custo de acesso da rede é significativamente mais alto do que o custo do plano.

  • O aplicativo avisa o usuário para acessar a rede.
  • O aplicativo suspende todas as atividades de rede dos dados em segundo plano.

Este código de exemplo verifica o custo da conexão e faz sugestões para o comportamento adequado do aplicativo.

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.";
        }
    }
}

Use a amostra de informação da rede para saber mais sobre como adaptar o comportamento de aplicativos para redes limitadas.

Os usuários também podem executar o Gerenciador de Tarefas para verificar o volume de dados de rede que cada aplicativo está consumindo. Esta captura de tela mostra um exemplo.

A guia Histórico de Aplicativos no Gerenciador de Tarefas permite que os usuários vejam o consumo de CPU e rede por aplicativo

A guia Histórico de Aplicativos no Gerenciador de Tarefas permite que os usuários vejam o consumo de CPU e rede por aplicativo

Reaja à alteração de status da rede

Em qualquer situação com um dispositivo móvel, as redes podem se conectar ou desconectar. Uma rede de banda larga móvel 3G ou 4G pode ficar fora do alcance na casa ou na garagem de um usuário enquanto o Wi-Fi ainda está disponível. Da mesma forma, um Wi-Fi pode ficar fora do alcance quando um usuário deixa a sua casa. Pode haver situações onde nenhuma rede esteja disponível. Dada a proliferação de redes Wi-Fi e de redes de banda larga móveis, tais alterações na rede ocorrem com frequência.

Um evento NetworkStatusChanged indica que o custo disponível ou as opções de conectividade podem ter sido alterados. Para reagir a alterações no status da rede e fornecer ao usuário uma ótima experiência quando as alterações ocorrerem, faça com que os seus aplicativos conectados sigam as seguintes diretrizes.

Perda da conexão devido a erro

Na maioria dos casos, as conexões podem ser restabelecidas simplesmente repetindo a operação de rede. Se isto falhar, espere por um evento NetworkStatusChanged. Recomendamos que os aplicativos usem intervalos crescentes de retirada entre as tentativas, começando com um valor de 50 milissegundos e aumentando este intervalo exponencialmente caso as conexões continuem a falhar.

Perda da rede

Informe o usuário que a conexão foi perdida, faça o registro e espere por um evento NetworkStatusChanged.

Nova disponibilidade de rede

Pode haver situações em que o dispositivo está conectado a múltiplas redes. Por exemplo, um usuário pode estar conectado a uma banda larga móvel, conversando com amigos por meio do aplicativo Windows 8 Messaging antes de chegar em casa e pode estar conectado a uma rede irrestrita ali também. A política padrão no Windows 8 é preferir uma rede irrestrita em vez de uma rede limitada e uma rede mais rápida em vez de uma mais lenta. Entretanto, conexões já estabelecidas por um aplicativo não alternam automaticamente para uma nova rede. Nesse caso, o aplicativo deve agir pois apenas o aplicativo pode tomar a melhor decisão sobre se deve ou não alternar para a nova rede.

Por exemplo, se a transmissão de um vídeo estiver quase concluída, pode não fazer sentido alternar a conexão para uma nova rede. Entretanto, se a rede atual estiver caindo, lenta demais ou se a transmissão for levar mais tempo para concluir, a alternância para uma nova rede pode ser o melhor.

Se você determinar que a alternância de rede é plausível para a situação do seu aplicativo, siga estas diretrizes quando detectar uma nova rede:

  1. Verifique os custos da rede já existentes e da nova rede. Se fizer sentido alternar para a nova rede, tente fazer uma nova conexão de rede e tente a operação de rede novamente baseando-se nas diretrizes que acabamos de mencionar. O Windows automaticamente selecionará a rede irrestrita em vez da rede limitada e a rede mais rápida em vez da mais lenta.
  2. Se a nova conexão de rede for bem sucedida, use a nova conexão à rede no seu aplicativo e cancele a operação de rede original na rede anterior, caso a conexão já exista.

Alteração no custo da rede

Alterações no custo da rede podem ocorrer quando a NetworkCostType é Fixa e o uso já estiver acima ou chegando próximo ao limite de dados. Alterações no custo da rede também podem ocorrer se a NetworkCostType se tornar Variável, ou se o Roaming mudar para verdadeiro. Nesses casos, adapte o comportamento do aplicativo baseando-se nas diretrizes da dica anterior.

Os códigos de exemplos usam o evento NetworkStatusChanged para fornecer uma ótima experiência de aplicativo para várias alterações de status em redes. Ambos os exemplos usam uma variável booliana global denominada registeredNetworkStatusNotification, inicialmente definida como falso.

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);
    }
}

Para mais informações sobre o evento NetworkStatusChanged , consulte o Guia de início rápido: Gerenciando eventos de conexão e mudanças na disponibilidade e a Network information sample (Amostra de informações da rede).

Conteúdo de cache para fluidez

Passando conteúdo de cache para o disco dá ao seu aplicativo rapidez e fluidez. Por exemplo, um aplicativo leitor de RSS feed pode exibir imediatamente os feeds que foram colocados em cache no disco em uma sessão anterior. Assim que os feeds mais recentes estiverem disponíveis, o aplicativo atualiza o conteúdo. O cache assegura que o usuário tenha conteúdo para ler logo no início, enquanto o aplicativo obtém um novo conteúdo.

O Windows 8 oferece a classe ApplicationData no namespace Windows.Storage. Esta classe oferece acesso ao repositório de dados do aplicativo. Este repositório de dados consiste de arquivos e configurações que são locais ao dispositivo, que são transferidos por múltiplos dispositivos ou que são temporários.

Arquivos são ideais para armazenar grandes conjuntos de dados, bancos de dados ou dados que estejam em um formato de arquivo comum. Arquivos podem existir em pastas roaming, locais ou temporárias. O que isso significa é o seguinte:

  • Arquivos Roaming são sincronizados em múltiplas máquinas e dispositivos nos quais os usuários entraram com contas conectadas. O Roaming de arquivos não é instantâneo; o sistema avalia vários fatores para determinar quando enviar informações. Mantenha o uso de dados de roaming abaixo da cota (disponível por meio da propriedade RoamingStorageQuota ). Se a cota for excedida, o roaming de dados será suspenso. Arquivos não podem ser transferidos enquanto um aplicativo os estiver gravando. Portanto, certifique-se de fechar os objetos de arquivos do seu aplicativo quando eles não forem mais necessários.
  • Arquivos locais não são sincronizados em múltiplas máquinas. Eles permanecem na máquina onde foram originalmente gravados.
  • Arquivos temporários estão sujeitos a serem excluídos quando não estiverem em uso. O sistema considera fatores como capacidade disponível do disco e idade de um arquivo, para determinar quando ou se deve excluir um arquivo temporário.

Estes códigos de exemplo fazem o cache de conteúdo no disco. Fazer o cache da resposta do servidor permite que o seu aplicativo exiba imediatamente o conteúdo ao usuário após um término ou um reinício de sessão. Por uma questão de concisão, estes exemplos não mostram como gravar configurações para o repositório de dados de aplicativo ou como reagir a eventos de roaming. A Application data sample (Amostra de dados do aplicativo) cobre estes detalhes.

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.
    }
}

Para obter mais informações sobre o repositório de dados de aplicativo, consulte a postagem Transferindo os dados de seu aplicativo e experimente a Application data sample (Amostra de dados do aplicativo).

Resumindo

Quando estiver planejando os seus aplicativos da Windows Store, use as diretrizes nesta postagem para fornecer uma experiência de conexão excelente e sem problemas. Estas dicas podem facilitar o seu processo de desenvolvimento e ao mesmo tempo manter a fluidez e aumentar a confiança dos usuários nos seus aplicativos.

- Suhail Khalid, gerente de programa II, Windows

Com a contribuição de: Steven Baker e Peter Smith