Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

Azure Mobile Services - Implementando Push Notifications

From Wiki
Jump to: navigation, search

Este artigo explica como implementar as “push notification” em Windows Phone com Azure Mobile Services

WP Metro Icon Web.png
SignpostIcon XAML 40.png
WP Metro Icon WP8.png
Article Metadata

Testado com
SDK: Windows Phone 8.0 SDK
Aparelho(s): Nokia Lumia 925, Nokia Lumia 920

Compatibilidade
Plataforma(s):
Windows Phone 8

Platform Security
Capabilities: ID_PUSH_NOTIFICATION

Artigo
Tradução:
Por saramgsilva
Última alteração feita por hamishwillee em 18 Nov 2013

Contents

Introdução

Este artigo explica como implementar “push notification” em Windows Phone usando Azure Mobile Services e fornece o código do cliente para registrar para receber “push notification” e também um formulário básico de HTML e script PHP para enviá-los a todos os dispositivos registrados (o serviço móvel envia um “push notification” cada vez que um registro é inserido). O artigo assume que você está familiarizado com os serviços móveis, mas se não, por favor consulte em primeiro lugar: Azure Mobile Services on Windows Phone.

Implementar “push notification” em Azure é simples, e o código produzido aqui foi escrito em menos de 20 minutos. Partilhar a informação com vocês aqui no wiki levou mais tempo do que escrever o código!

Note.pngNote: Na hora de escrever quando você envia a menos de 500 mensagens por usuário a cada dia, você não precisa se registrar ou autenticar o seu aplicativo de serviço móvel com MPNS.

Definido capacidades

Pode parecer trivial, mas, como um primeiro passo, precisamos definir a capacidade correta de usar Push Notifications.

Setting capabilities

Criando tabelas

Entrar com sua conta no into Windows Azure Management Portal, selecione um Mobile Service (criado anteriormente) e crie duas tabelas: uma para gerir assinaturas push notification ( PushNotificationChannel ), o segundo para gerir mensagens que enviar para seus usuários ( mensagens).

Creating tables

Você também precisa criar classes em seu código para representar as tabelas recém-criadas.

public class PushNotificationChannel
{
public int Id { get; set; }
 
[DataMember(Name = "uri")]
public string Uri { get; set; }
}
 
public class Messages
{
public int Id { get; set; }
 
[DataMember(Name = "text")]
public string Text { get; set; }
}

Bibliotecas Azure

Em sua App.xaml.cs adicione o namespace

using Microsoft.WindowsAzure.MobileServices;

e o objeto para conectar ao Mobile Service

public static MobileServiceClient MobileService = new MobileServiceClient("https://nokiadeveloper.azure-mobile.net/", "YOUR KEY HERE");

Adicionar Push Notifications à sua aplicação

Primeiro de tudo, precisamos importar o namespace apropriado:

using Microsoft.Phone.Notification;

Criar classes para representar o que você criou

public static HttpNotificationChannel CurrentChannel { get; private set; }

HttpNotificationChannel creates a notification channel between the Microsoft Push Notification Service and the Push Client and creates a new subscription for raw notifications. cria um canal de comunicação entre o Microsoft Push Notification Service” e o cliente e cria uma nova assinatura para receber notificações.

private void AcquirePushChannel()
{
string PushChannelName = "MyPushChannel";
 
CurrentChannel = HttpNotificationChannel.Find(PushChannelName);
 
if (CurrentChannel == null)
{
CurrentChannel = new HttpNotificationChannel(PushChannelName);
 
// Register for all the events before attempting to open the channel.
CurrentChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(PushChannel_ChannelUriUpdated);
CurrentChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(PushChannel_ErrorOccurred);
 
// Register for this notification only if you need to receive the notifications while your application is running.
CurrentChannel.ShellToastNotificationReceived += new EventHandler<NotificationEventArgs>(PushChannel_ShellToastNotificationReceived);
 
CurrentChannel.Open();
CurrentChannel.BindToShellTile();
CurrentChannel.BindToShellToast();
}
 
if (CurrentChannel != null)
{
try
{
var channel = new PushNotificationChannel { Uri = CurrentChannel.ChannelUri.ToString() };
App.MobileService.GetTable<PushNotificationChannel>().InsertAsync(channel);
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(e.Message);
}
}
}

PushChannelName é o nome do serviço de Push Notification que deseja criar. Tenha certeza de que é única. HttpNotificationChannel.Find verifica um serviço registrado com o nome já existe. Se não, ele retorna null para uma nova HttpNotificationChannel objeto é criado e inicializado . Como etapa final, precisamos registrar o dispositivo do utilizador está executando uma inserção na tabela PushNotificationChannel.

var channel = new PushNotificationChannel { Uri = CurrentChannel.ChannelUri.ToString() };                  
App.MobileService.GetTable<PushNotificationChannel>().InsertAsync(channel);

É isso aí! Agora a aplicação é capaz de receber Push Notification do canal criado. O código a seguir não é obrigatória e será implementado com base em suas necessidades.

void PushChannel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
{
Dispatcher.BeginInvoke(() =>
{
// Display the new URI for testing purposes. Normally, the URI would be passed back to your web service at this point.
MessageBox.Show(String.Format("Channel Uri is {0}", e.ChannelUri.ToString()));
});
}

PushChannel_ChannelUriUpdated is called each time a new channel is created.

void PushChannel_ErrorOccurred(object sender, NotificationChannelErrorEventArgs e)
{
// Error handling logic for your particular application would be here.
Dispatcher.BeginInvoke(() => MessageBox.Show(String.Format("A push notification {0} error occurred. {1} ({2}) {3}", e.ErrorType, e.Message, e.ErrorCode, e.ErrorAdditionalData)) );
}

PushChannel_ErrorOccurred is self-explanatory - called when an error occurs.

void PushChannel_ShellToastNotificationReceived(object sender, NotificationEventArgs e)
{
StringBuilder message = new StringBuilder();
string relativeUri = string.Empty;
 
message.AppendFormat("Received Toast {0}:\n", DateTime.Now.ToShortTimeString());
 
// Parse out the information that was part of the message.
foreach (string key in e.Collection.Keys)
{
message.AppendFormat("{0}: {1}\n", key, e.Collection[key]);
 
if (string.Compare(
key,
"wp:Param",
System.Globalization.CultureInfo.InvariantCulture,
System.Globalization.CompareOptions.IgnoreCase) == 0)
{
relativeUri = e.Collection[key];
}
}
 
// Display a dialog of all the fields in the toast.
Dispatcher.BeginInvoke(() => MessageBox.Show(message.ToString()) );
}

PushChannel_ShellToastNotificationReceived, deve se registrar para essa notificação só se precisa para receber as notificações enquanto o aplicativo está sendo executado.

Adquirir o canal

Para adquirir o canal só chamar o AcquirePushChannel dentro função carregada a página do aplicativo.

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
AcquirePushChannel();
}

Enviar Push Notifications

Acima nós mostramos como receber “push notification”. Esta seção mostra como enviá-los. Como eu prefiro "casos de uso do mundo real" vamos enviar as mensagens para todos os dispositivos registrados a partir de um formulário HTML simples com uma textarea (a mensagem). Por causa do meu conhecimento eu usei PHP, mas qualquer linguagem de programação do lado do servidor (por exemplo, ASP) é bom. Primeiro, precisamos atualizar o script de inserção social no Management Portal.

Atualize o script de inserção social no Management Portal

Vamos voltar para o Windows Azure Management Portal e abra o separador “Script” da tabela "Mensagens" (criado no início do artigo) 'Script' o.

Atualizando inserção de script

Adicione o seguinte código.

function insert(item, user, request) {    
request.execute({
success: function() {
request.respond();
sendNotifications();
},
error: function(err) {
request.respond();
}
});
 
function sendNotifications() {
var channelTable = tables.getTable('PushNotificationChannel');
channelTable.read({
success: function(channels) {
channels.forEach(function(channel) {
push.mpns.sendToast(channel.uri, {
text1: "Message:"+item.Text
}, {
success: function(pushResponse) {
console.log("Sent push:", pushResponse);
}
});
});
}
});
}
 
}

push.mpns.sendToast é o método para enviar Toast notifications – mas poderá enviar outro tipo de notificações tais como Flip Tile.

O código deve ser algo parecido com o trecho abaixo:

function insert(item, user, request) {
request.execute({
success: function () {
// Write to the response and then send the notification in the background
request.respond();
push.mpns.sendFlipTile(item.channel, {
title: item.text
}, {
success: function (pushResponse) {
console.log("Sent push:", pushResponse);
}
});
}
});
}

Agora, cada vez que um registro é inserido na tabela Messages, ele irá iniciar o processo de push notification para todos os dispositivos registrados na tabela PushNotificationChannel. Este deve ter um teor, como mostrado abaixo:

Tabela de dispositivos registados no serviço

Server Side Script

Aqui, o código PHP muito simples que eu usei para enviar Push Notifications inserir um novo registro na tabela Messages.

<?php
 
if( isset($_POST['message']) ) {
 
$endpoint = "https://YOUR-MOBILE-SERVICE-NAME.azure-mobile.net/tables/Messages";
 
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $endpoint);
 
// Set so curl_exec returns the result instead of outputting it.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'X-ZUMO-APPLICATION: YOUR KEY HERE',
'Accept: application/json',
'Content-Type: application/json',
));
 
$json = "{ \"Text\": \"".$_POST['message']."\" }";
echo $json;
 
curl_setopt($ch,CURLOPT_POSTFIELDS, $json);
// Get the response and close the channel.
$response = curl_exec($ch);
curl_close($ch);
 
echo $response;
}
 
?>
 
<form method="post" action="messages.php">
<textarea name="message"></textarea>
<input type="submit" value="Invia"/>
</form>

Sem usar SDK complexo eu usei Windows Azure API REST para inserir um novo registro objeto usando JSON.

$json = "{ \"Text\": \"".$_POST['message']."\" }";

Isso é tudo! Agora, a partir do seu site, você pode enviar uma mensagem para todos.

Form web
Notification on Windows Phone
This page was last modified on 18 November 2013, at 05:10.
186 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×