2016 年 4 月

第 31 卷,第 4 期

本文章是由機器翻譯。

標新立異 - 將通知推送至 Mobile Apps

Dino Esposito | 2016 年 4 月

Dino Esposito我過去的幾個資料行,在我寫了多半關於軟體設計與架構。雖然建置軟體系統架構的角色應該永遠不會低估或遭到拒絕,執行的應用程式的最終結果中的個別功能的總和。它是成功的相同使用者體驗導向開發 (UXDD) 原理,指出測量的軟體應用程式經驗使用者是成功的當她處理應用程式經歷。如果您的軟體系統 comprehends 行動的前端,則您不太略過功能要推播通知。

在本專欄中,我將摘要說明如何加入行動應用程式,不論行動作業系統本身的上層通知圖層。如此一來,我將檢視 Microsoft Azure 通知中心的平台的服務。

一眼的推播通知

推播通知時,行動裝置接收來自應用程式的後端的訊息,而不是第一次傳送明確要求。大部分的應用程式的用戶端和伺服器元件之間的互動都會透過明確的動作,一般而言,使用者的動作 —,徵求意見。方式,將推播通知是來路不明的意見反應,某些重要的資訊可用時後, 端會傳送訊息的排序。若要精確地說,「 不明 」 一詞這裡並不完全精確。任何行動應用程式必須提供摘要訂閱以接收推播通知。但是,一旦訂閱服務時,通知會到達來路不明的方式。

推播通知使用者的唯一影響是傳遞相關的更新他正在使用應用程式。例如,可能安裝 airliner 應用程式可讓您接收快速且即時更新排程與閘道的變更。在某個時間點,您的電話發出嗶聲或組,並顯示意見反應出現電話的介面上的某處。它完全顯示,不過,完全取決於您的裝置為基礎的作業系統,以及應用程式組態和使用者設定的版本。視作業系統而定的推播通知可以達到這種頂端列、 快顯通知訊息、 徽章更新中的圖示,依此類推。

推播通知的重點是所有其技術層面都嚴格的平台特定。比方說,推播通知服務的應用程式訂閱的方式是在 iOS、 Android、 Windows Phone 和通用 Windows 平台 (UWP) 應用程式不同。同樣地,每個平台使用它自己的裝載將訊息傳遞到已連接的裝置,每個平台會要求您設定不同的分派引擎。在實際實作有顯著的差異,儘管我敢說是相當常見的推播通知系統 (PNS) 的整體架構,並看起來像圖中 [圖 1

平台特定的推播通知系統的整體架構
圖 1 的平台特定的推播通知系統的整體架構

使用多個推播通知系統

它提供的各種行動平台那裡也會反映各種推播通知的平台不奇怪。建立多個平台行動應用程式開發人員必須熟悉使用多個不同的推播通知引擎,並必須設定每個適當的伺服器環境。除非您正在開發的應用程式移植到其他平台沒有可預見的計劃使用單一行動平台,您可能想要查看跨平台 PNSes 中所示 [圖 2。相較於圖中 [圖 1, ,新的架構新增一個層級,並提供單一進入點進行程式設計。

跨平台推播通知系統的整體架構
圖 2 的跨平台推播通知系統的整體架構

使用一般的推播通知中心和應用程式的後端註冊的行動應用程式中樞的佇列訊息。接下來,中樞會將實體的訊息傳遞至使用適當的通訊協定和內容的特定行動平台。藉由使用其中一種跨平台行動通知系統,您可以使用單一 API 來推播到 Android、 iOS 和 Windows Phone 裝置的單一擷取的訊息。

Azure 通知中樞只是個跨平台通知系統。我們來看看它的運作方式。

Azure 通知中樞

使用 Azure 通知中樞的第一個步驟設定 Azure 的計劃。服務提供在三個層級,最低的免費和設定在連線到裝置 (500) 和最大的通知,您可以傳送 (1 百萬個) 的數目限制。如需詳細資訊,請參閱 bit.ly/1Tbimew。若要開始,您只需要建立通知中樞和命名空間中的免費帳戶。這項資訊能派上用場稍後若要建立應用程式的後端裝置適用的佇列訊息的連線。

最麻煩的部分使用推播通知的未處理的跨平台集線器,但您想要連線到符合每個行動平台的需求。比方說,若要將更新傳遞至 iOS 或 Android 裝置,您必須先完全設定您的應用程式使用個別的原生 PNSes。如需詳細資訊,請移至 bit.ly/1o15uv2。您可能已經知道,只有已註冊之 iOS 應用程式可以接收推播通知。原生 Apple 推播通知服務註冊您的應用程式必須先取得憑證從 Apple 做的目的是用來唯一識別來自您的應用程式的通知。Android 的相同工作需要改為您的 Android Studio 介面來透過取得 API 金鑰。用於 UWP 應用程式,您必須先向 Windows 市集。任何您想要支援的平台必須完成所有的平台專屬步驟。任何您所取得的註冊資訊必須輸入 Azure 通知中心,它將會是代表您對於原生 PNSes。

註冊應用程式與中樞

讓我們假設您已啟用以接收來自 Apple 系統通知您 iOS 應用程式保存.p12 憑證檔案和更新的佈建設定檔。即可大部分完成如果您沒有使用 Azure 通知中樞。您應該確實使用中繼集線器系統?

重點是工作的任何特定平台 PNS 仍然不夠令許多開發人員執行常被要求的工作,例如一般廣播到所有已連線的裝置或只在特定的使用者,例如使用特定地區設定中的裝置群組。廣播,特別是,不是簡單的工作因為當裝置數目增加時,它可能會造成重要的延展性問題。寫入,以減少核心平台專屬的中間可擴充的基礎結構服務的程式碼的原因是極大的好處。若要使用 Azure 通知中樞,不過,您也要上傳 Apple.p12 憑證,並以程式設計方式在 Azure 中心註冊您的應用程式。如果您要寫入的 iOS 應用程式使用 Xamarin.iOS,絕佳的逐步教學課程會在 bit.ly/1KaySJ3

行動應用程式有兩個主要的責任。首先,它必須納入 Azure 摘要的通知訂閱的程式碼。第二,它必須包含以某種方式處理任何內送通知的程式碼。所以需要訂閱 iOS 應用程式實際從 Apple 服務接收推播通知。這是透過 UIApplication.SharedApplication.RegisterForRemoteNotifications 方法來完成。在結束時,這個方法會叫用名為 RegisteredForRemoteNotifications 的應用程式委派類別中覆寫的方法。在這裡,您訂閱 Azure 中樞。這個方法會從作業系統接收裝置權杖和您的程式碼只會將它轉送集線器。Azure 中樞由路徑和連接字串,就像這樣 ︰

var hub = new SBNotificationHub(connectionString, hubPath);
hub.RegisterNativeAsync(deviceToken, null);

接下來,當實際收到通知時,就會叫用另一個應用程式委派類別中覆寫的方法 ︰ ReceivedRemoteNotification。方法會接收從 OS 推送訊息的實際內容 (可能是巢狀) 的字串字典的形式。方法覆寫會負責擷取實際的訊息,並透過適合應用程式 — 徽章、 聲音或警示。

Azure 中樞的訊息佇列

到目前為止完成的所有工作都是只有一半的代價。剩下找出如何將訊息傳送到 Azure 中心並從該處向連接的裝置。換句話說,您需要有應用程式後端,知道集線器連接詳細資料,並將訊息傳遞的使用者。這類應用程式後端可以是任何類型的.NET 應用程式,包括 ASP.NET 應用程式。如果您有行動應用程式以接收推播通知的理由,商務網域中的項目會產生相關的訊息。它可以是軟體觸發程序傳送訊息或中所示,它可以是系統管理使用者的動作 [圖 3

ASP.NET 後端傳送的地區設定特定的訊息至 iOS 和 Android 應用程式透過 Azure 中樞
[圖 3 ASP.NET 後端傳送的地區設定特定的訊息至 iOS 和 Android 應用程式透過 Azure 中樞

若要將 ASP.NET 後端中的推播通知,您只需要 Microsoft Azure NotificationHubs Nuget 封裝。此外,您的程式碼會負責建構適當的連接字串。連接字串會包含相關的 Azure 服務匯流排 URL 端點,並已加密的權杖的相關資訊。服務匯流排端點會包含您設定 Azure 服務時所建立的命名空間的名稱。就像 sb://your-ns.servicebus.windows.net。從您的命名空間 「 連接字串 」 標籤底下的 [組態] 頁面讀取加密的權杖 您必須建立有效的中樞執行個體的程式碼如下 ︰

var hub = NotificationHubClient.CreateClientFromConnectionString(
  connString, hubName);

下一個步驟所組成每一個做為目標平台建立適當的裝載。內容是採用固定的模式的 JSON 字串。您可以建立的任何方式的 JSON 字串。在下列範例中,$ 是要傳送的實際訊息的預留位置 ︰

const string iosFormat = "{\"aps\":{\"alert\":\"$\"}}";
const string androidFormat = "{\"data\":{\"message\":\"$\"}}";
var iosAlert = iosFormat.Replace("$", actualMessage);
var androidAlert = androidFormat.Replace("$", actualMessage);

一旦建構裝載時,將它傳送至中樞是像下列程式碼一樣簡單 ︰

var task1 = hub.SendAppleNativeNotificationAsync(iosAlert);
var outcome1 = task1.Result;
var task2 = hub.SendGcmNativeNotificationAsync(androidAlert);
var outcome2 = task2.Result;

結果中的變數的程式碼片段是 NotificationOutcome 型別的執行個體,並傳回作業結果的詳細的資訊。

傳送範本為基礎的訊息

上述程式碼範例示範只是最簡單的方式傳送推播通知,一般會廣播的文字字串不變,可連接的裝置。此外,您必須格式化為有興趣的每個行動平台。更常見的案例傳送範本為基礎的訊息。範本為基礎的訊息會傳遞至 Azure 的字典字串的形式,而且 Azure 中樞可確保它準時傳遞給該帳戶已設定任何行動平台。索引鍵背後的範本為基礎的訊息是應用程式會使用比預設更豐富的格式。比方說,讓我們了解如何將不同的訊息傳送給使用者遵循不同的地區設定 ︰

var locale = "EN";
var template = String.Format("{{\"aps\":{{\"alert\":\"$(News_{0})\"}}}}", locale);

此範例顯示要向 Apple PNS 名為的 News_XX 其中 XX 是兩個字母地區設定的任何內送範本為基礎訊息的範本。在此範本的好處是,應用程式後端可能會在單一的字典中,傳送多個項目,但每個裝置會接收只有它已註冊的訊息。這是其中一個額外的服務,例如,Azure 通知中樞中繼集線器的。若要傳送地區設定特定的訊息中,您需要下列程式碼 ︰

var messages = new Dictionary<string, string>
{
  {"News_EN", "..."},
  {"News_ES", "..."},  {"News_PT", "..."},
  {"News_IT", "..."}
};var task = hub.SendTemplateNotificationAsync(messages);
var outcome = task.Result;

使用單一的推播,您會看到裝置跨平台與每個使用者會看到只適用於他所選取的地區設定通知,在電話上的保證。請注意,這是自動當地語系化的訊息所提供,例如,在 iOS 裝置上稍有不同的功能。IOS 裝置上,事實上,您可以傳送訊息,以及對應至項目已當地語系化的字串字典中的預留位置,而且作業系統本身神奇的自動轉譯呼叫警示之前的訊息。範本訊息,反而是 Azure 的功能,可讓您傳送不同的訊息到分割群組的使用者,並決定如何區隔的使用者群組。

排定的訊息

另一個有趣的功能,您會發現 Azure 通知中心內為排程的訊息。排程的訊息會通知傳送至 Azure,但只在指定時間傳送至連接的裝置。若要傳送已排程的通知,您只使用稍微不同的 API:

var notification = new TemplateNotification(messages);
var task = hub.ScheduleNotificationAsync(notification, new DateTime(...));
var outcome = task.Result;

值得注意的是已排程的通知需要標準層訂閱並不提供的免費測試訂閱。

一個優良

如何註冊及傳送推播通知,透過 Azure 中樞只技術層面,超過實際痛苦點推播通知的使用它們與使用者的成功通訊的內容中。

您不想要白天與晚上 bug 的一般資訊通知使用者。因為這是 「 推入 」 通知,您會想要確定真正想要從使用者被推入。在這方面,分段的使用者群組是很棒的功能,來使用。訊息的大小會影響太。我建議您保留任何訊息接近推文的大小。IOS 8,直到,例如推播通知的最大大小是 256 個位元組,2 K 架較新的系統中。它是在 Android 上 4 K。最後,一點也不容忽視,確定您的目標 OS,讓整個功能容易退出。通常是使用最新的作業系統,則為 true,但最好再次確認。


Dino Esposito是每個 「 Microsoft.NET: 架構的企業應用程式 」 (Microsoft Press,2014年) 和 [使用 ASP.NET 最新 Web 應用程式] (Microsoft Press,2016年)。.NET 和 Android 平台在 JetBrains,並在世界各地的產業活動的技術推廣人員 Esposito 分享軟體的願景 software2cents@wordpress.com 和 Twitter: @despos

感謝以下的微軟技術專家對本文的審閱: 喬恩 · Arne Saeteras