הכרות ראשונה עם ה- Windows Push Notification Service

10 בספטמבר 2012

אין תגובות

cloud-services-azure-logoהמשתמשים המודרנים מצפים ליותר מהאפליקציות שלהם. אחת היכולות הנפוצות שאפליקציות מודרניות צריכות לספק היא חווית ה-always connected אשר משמעותה היא חווית משתמש שמרגיש כי הוא תמיד מחובר ומעודכן עם המידע הרלוונטי ביותר. הדרך לספק למשתמש את החוויה הזו היא אחת משתיים: דגימה של השרת ובדיקה האם יש מידע חדש להציג למשתמש, או לחילופין קבלת הודעות/עידכונים בדחיפה מהשרת.

 

להשאר תמיד מעודכן באמצעות Azure

במיקרוסופט הבינו כי תסריט ה-always connected הינו תסריט בסיסי של כמעט כל האפליקציות המודרניות ובנו פתרון מובנה לדחיפת מסרים לאפליקציות windows 8:
ה-Windows Push Notification Service הינו שירות ענני של מיקרוסופט המספק רכיב backend לאפליקציות windows 8 ש"דוחף" אליה מסרים. היות ושירות ה-Push notification מתארח ב-Azure הוא מסוגל להגיע ל-scales גדולים במיוחד. השימוש במנגנון הזה חוסך למפתחי האפליקציה הרבה מאד זמן בפיתוח יכולות backend לאפליקציות שלהם. בצד הקליינט, לפלטפורמה של Windows 8 יש אינטגרציה מובנית עם ה-Windows Push Notification, שהופכת את תסריט דחיפת ה-notifications למאד פשוט למימוש.

את המשמעות של push notifications אפשר לתמצת בשתי מילים: חסכון במשאבים (כן, שוב הנושא הזה J). מצב של דחיפת מסרים לאפליקציה לעומת מצב של משיכת מסרים (push vs. pull) הוא יעיל יותר מבחינת העומס על משאבי ה-device הן בהיבט של חיי סוללה והן בהיבט של תעבורת רשת ולכן על פי ה"רוח" של windows8 מדובר על תסריט מועדף.

 

סוגי Notifications

ישנם מספר סוגי notifications שניתן לשלוח לאפליקציה:Toast push notifications, Badge push notification , Tile push notification, raw push notification. בשלושת המקרים הראשונים, כמעט ולא נדרשת עבודת פיתוח בצד האפליקציה על מנת לקבל את ה-notifications הללו ומערכת ההפעלה עושה את מרבית העבודה בשבילנו, ומציגה את ה-toast או מעדכנת את ה-tile של האפליקציה. כאשר מדובר ב-raw push notification, מדובר בעצם ב-notification שמכיל data בלבד, ובמקרה זה יש לרשום background task שיגיב לארוע של קבלת notification (ארחיב על תסריט זה בעתיד).

 

הארכיטקטורה המאפשרת את השימוש ב- Push Notifications

הפתרון מורכב ממספר רכיבים, חלקם שייכים לאפליקציה וחלקם שייכים לפלטפורמות של Windows 8 ו-Azure

  • רכיב ה- Notification Client Platform הינו חלק מ-WinRT ודרכו מבקשת האפליקציה Notification Channel. ה-Notification Channel הוא הערוץ באמצעותו יגיעו ה-notifications אל האפליקציה.
  • רכיב ה- Windows Notification Server או בקיצור WNS,  הינו שירות ענני (Azure) שמפיץ לקליינטים את ה-Notifications.
  • ה- Cloud Service הוא בעצם ה-backend של האפליקציה שלנו שמפעיל את הלוגיקה העיסקית ומייצר את ה-notifications שיש לשלוח לקליינטים השונים.
  • ה- Metro Style App היא האפליקציה שלנו שנרשמת לקבל Notifications ומגיבה עם קבלתם.

image

 

תהליך קבלת ה- Notification

התהליך העקרוני מורכב מהשלבים הבאים:

  1. תהליך הבקשה לקבלת notifications מתחיל עם האפליקציה, שפונה לקבל Notification Channel מה-Notification Client Platforn דרך ה-CreatePushNotificationChannelForApplicationAsync API.
  2. WNS מקצה Channel לקליינט ומחזיר אותו אל ה-Notification client platform. ה-Channel מתקבל כ-Uri.
  3. ה-Notification Client Platform מחזיר את ה-channel אל האפליקציה,
  4. האפליקציה שולחת את פרטי ה-channel (uri) אל השרת שלה (cloud service).
  5. שרת האפליקציה מחליט כי מתקיימים התנאים המתאימים לשלוח notification אל הקליינט, הוא משתמש במזהה ה-channel על מנת לשלוח בקשה ל-WNS.
  6. WNS שולח notification ל-Notification client platform ו-WinRT מטפל ב-Notification: אם מדובר ב-toast notification לדוגמא windows 8 מציג אותו.

להלן דוגמת קוד לקבלת push notification channel (שלבים 1+2+3) ושליחה של ה-uri שהתקבל לשרת של האפליקציה (שלב 4):

 

public async Task<string> OpenAndRegisterChannelAsync(String currentChannelUrl)
{
//Get Channel from PushNotificationChannelManager
PushNotificationChannel channel = await
PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();


//check if the channel uri identical to the channel the app already holding from previoud run.
//if it is different one, sending it to app's server side to update its the clients list
if (channel.Uri != currentChannelUrl)
{
await MyAppBackendService.UpdateChannelUriAsync(ClientID, channel.Uri);
return channel.Uri;
}
return currentChannelUrl;
}

 

שלבים מקדימים: על מנת שה-backend האפליקטיבי יוכל לשלוח notifications באמצעות ה-WNS, הוא צריך להיות מזוהה (authenticated) ורק שירות שזוהה בהצלחה יכול להשתמש ב-WNS. על מנת ששירות יוכל להזדהות יש לרשום אותו ב-Live Connect Developer Center. בתהליך הרישום יתקבלו Package Security identifier ו-secret key שישמשו את השירות במהלך ה-authentication.

 

דגשים חשובים כאשר משלבים Push Notifications באפליקציה

 

  • המסר נשלח לאפליקציה גם כאשר היא אינה רצה וגם כאשר ה-device אינו מחובר ויתכן מסרים אלו לא יגיעו ל-device. כדאי לממש באפליקציה יכולת של משיכת מסרים בנוסף לקבלת push notification (זוכרים את ה-post על ה-background task? אפשר להשתמש ב-system event על מצב הרשת שיופעל בעת החיבור לרשת ולבדוק מול השרת אלו מסרים מיועדים לקליינט בזמן שה-device לא היה מחובר).
  • אין התחייבות ל-guaranty delivery או על סדר מסרים, ואם התסריט העיסקי שלכם אינו מאפשר איבוד מסרים בסבירות מסויימת או מחייב הגעת מסרים על פי סדר, כדאי לחשוב על פתרון ארכיטקטוני אחר.
  • בעת תכנון האפליקציה חשוב לא להגזים עם כמות ה-notifications ששולחים למשתמש בפרק זמן נתון, קיימת סכנה שה-notifications יכולים להפריע למשתמש ולגרום לחווית משתמש פחות טובה מהאפליקציה שלכם.
  • תוקף ה-notification channel פג אחרי 30 יום, וממולץ לבקש notification channel בכל פעם שהאפליקציה launches, להשוות את ה-uri שהתקבל מול הישן, ואם יש שינוי לעדכן את פרטי ה-channel שנשמרו בשירות ה-backend של האפליקציה.

אלו מכם שרוצים להוסיף תמיכה ב-push notification לאפליקציה, אני מציעה להתחיל עם ה-Windows Azure Toolkit for Windows8 המכיל דוגמאות קוד, תעוד ו-project templates.

לשאלות נוספות אתם מוזמנים להגיב או להתייעץ עם מומחי הקהילה בפורום החדש של פיתוח אפליקציות לווינדוס 8 או בפורום Windows Azure

 

 

MayaShenhav_222FD2B1[1]הפוסט נכתב ע"י מאיה שנהב, יועצת בכירה בקבוצת היועצים של מיקרוסופט
(MCS ) העוסקת בייעוץ בתחומי ארכיטקטורה, פיתוח, Azure ו- ALM.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *