BETA
Aby się zalogować, najpiew wybierz portal.
Aby się zarejestrować, najpiew wybierz portal.
Podaj słowa kluczowe
Słowa kluczowe muszą mieć co najmniej 3 sąsiadujące znaki alfanumeryczne
Pole zawiera niedozwolone znaki

Baza wiedzy











WP7 dla programistów. Część 9 - Notyfikacje PUSH

22-03-2011 09:00 | Maciej Grabek
Zapraszam do lektury dziewiątego artykułu poświęconego Windows Phone 7. Dziś przyjrzymy się nowemu podejściu do komunikacji z urządzeniem a mianowicie notyfikacjom PUSH.

Wstęp

Zapraszam do lektury dziewiątego artykułu poświęconego Windows Phone 7. W poprzedniej części zapoznaliśmy się z zagadnieniem integracji naszej aplikacji z systemem oraz z możliwością modyfikacji live tile na ekranie startowym telefonu. Dziś przyjrzymy się nowemu podejściu do komunikacji z urządzeniem a mianowicie notyfikacjom PUSH. Artykuł ten ściśle nawiązuje do równoległego cyklu webcastów dostępnych na Channel 9 poświęconych programowaniu na platformie Windows Phone 7. Gorąco zachęcam do obejrzenia dziewiątej części, która jest czwartym z odcinków mojego autorstwa.

Odcinek 9

Notyfikacje - jak i dlaczego

Na nowej platformie nie ma możliwości uruchamiania wątków w tle. Dodatkowo z racji na cykl życia aplikacji, który poznaliśmy w szóstej części nasza aplikacja jest dezaktywowana gdy użytkownik z niej wyjdzie. W związku z tym nie możemy przeprowadzać obliczeń tak jak było to możliwe we wcześniejszych wersjach systemów mobilnych. W związku z tym powstał mechanizm notyfikacji PUSH. Dzięki niemu istnieje możliwość przeniesienia obliczeń poza urządzenie a następnie po ich wykonaniu można zwyczajnie poinformować telefon i aplikację o wynikach. Dzięki temu uzyskujemy zmniejszenie zużycia baterii oraz ograniczenie ilości danych, które są przesyłane. Schemat działania notyfikacji widoczny jest na rysunkach 1 i 2.


Rysunek 1. Rejestracja aplikacji w Microsoft Push Notification Services

Rysunek 2. Wysłanie wiadomości do telefonu

Aplikacja przy pierwszym uruchomieniu wysyła żądanie do Microsoft Push Notification Services o unikalny adres url, który będzie ją identyfikował. Adres należy następnie przekazać do serwisu zewnętrzengo, który będzie w razie potrzeby przesyłał wiadomosci właśnie na ten adres.

RAW

Istnieją trzy rodzaje notyfikacji: raw, toast i tile. Pierwsza z nich pozwala przesłać do aplikacji dane w postaci XML. Ich struktura zależy od naszej aplikacji. W kodzie, który będzie działał na telefonie należy wykonać kroki widoczne na listingu 1.

Listing 1. Utworzenie kanału i obsługa wiadomości RAW

string channelName = "WP7Push_Channel";
//create channel
httpChannel = new HttpNotificationChannel(channelName);
//Subscribe to Raw Notification
httpChannel.HttpNotificationReceived += new EventHandler(httpChannel_HttpNotificationReceived);
//open channel
httpChannel.Open();
//register httpChannel.ChannelUri to external service


private void httpChannel_HttpNotificationReceived(object sender, HttpNotificationEventArgs e)
{
	string result = ParseRawMessage(e.Notification.Body);
}

Dzięki temu mamy możliwość przekazania do aplikacji obliczeń, które zleciliśmy zewnętrznemu serwisowi bez konieczności odpytywania go co chwilę o status zadania.

Toast i Tile

Oprócz wiadomości typu raw są jeszcze dwa rodzaje wiadomości specjalnych, które posiadają określony format i są obsługiwane przez system. Są nimi wiadomości toast i tile. Ich wygląd widać na rysunku 3. W przeciwieństwie do wiadomości RAW, która wymaga działania aplikacji, są one odbierane w momencie gdy nie jest ona uruchomiona. Warto też zaznaczyć, że wiadomość toast jest obsługiwana w obu tych przypadkach (aplikacja uruchomiona lub nie).


Rysunek 3. Wygląd notyfikacji typu toast i tile

Wspomniałem o określonym formacie wiadomości. Jest on widoczny na listingu 2. Dodatkowo w wysyłanym żądaniu musimy dodać stosowne dla tych wiadomości nagłówki, dzięki czemu system będzie w stanie rozpoznać je jako "predefiniowane".

Listing 2. Formaty wiadomości toast i tile i dodatkowe nagłówki wiadomości

<?xml version="1.0" encoding="utf-8"?>
<wp:Notification xmlns:wp="WPNotification">
	<wp:Toast>
		<wp:Text1>{0}</wp:Text1>
		<wp:Text2>{1}</wp:Text2>
	</wp:Toast>
</wp:Notification>

//additional header
request.Headers["X-WindowsPhone-Target"] = "toast";


<?xml version="1.0" encoding="utf-8"?>
<wp:Notification xmlns:wp="WPNotification">
	<wp:Tile>
		<wp:BackgroundImage>{0}</wp:BackgroundImage>
		<wp:Count>{1}</wp:Count>
		<wp:Title>{2}</wp:Title>
	</wp:Tile>
</wp:Notification>

//additional header
request.Headers["X-WindowsPhone-Target"] = " token";

Aby nasza aplikacja działajaca na telefonie poinformowała system o odbieraniu takich notyfikacji musimy poczynić w niej pewne zmiany dodając kod widoczny na listingu 3.

Listing 3. Obsługa wiadomości toast i tile w aplikacji

//toast
httpChannel.BindToShellToast();
//process toast message if received when app is running
httpChannel.ShellToastNotificationReceived += new EventHandler(httpChannel_ShellToastNotificationReceived);

void httpChannel_ShellToastNotificationReceived(object sender, NotificationEventArgs e)
{
	foreach (var key in e.Collection.Keys)
	{
		//e.Collection[key]
	}
}


//tile
//optional - list of allowed tile icons uris
//Collection uris = new Collection();
//uris.Add(new Uri("..."));
//httpChannel.BindToShellTile(uris);
httpChannel.BindToShellTile();

Podsumowanie

Tymczasem dotarliśmy do końca dziesiejszego tematu. Teraz wiemy w jaki sposób odciążyć naszą aplikację, oszczędzić baterię w telefonie oraz ograniczyć ilość przesyłanych danych do minimum. Przypominam, że równolegle z tym cyklem na Channel 9 jest również publikowana seria webcastów poświęcona Windows Phone 7. Tym samym zapraszam do obejrzenia dzięwiątego odcinka. Materiały dotyczące tego artyułu jak i nagrania będzie można znaleźć na moim blogu w kategorii Windows Phone 7.

Maciej Grabek
Maciej Grabek
Pasjonat technologii oferowanych przez Microsoft , współzałożyciel i lider Toruńskiej Grupy Deweloperów .NET. Na co dzień programista .NET w jednej z największych firm e-commerce w Polsce.

Podobne artykuły

Komentarze 0

pkt.

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.