此文章由机器翻译。

Microsoft Azure

蔚蓝通知航空枢纽港:设备管理的最佳做法

Sara Silva

下载代码示例

移动应用程序市场增长更快,更快,并提高任何应用程序的用户体验是至关重要的因为它增加了用户的忠诚度。现代应用程序的最重要的特征之一是他们能继续存活,这意味着保持了解最新的事件发生在应用程序中,即使它未被使用的用户。这是可能通过推式通知。

每个移动平台都有其自身推送通知服务 (PNS) 负责推通知 — — 短消息 — — 到设备。Windows 应用程序允许应用程序接收不同的推送通知类型来代表不同的方式来显示消息:烤面包片,瓷砖、 原料和徽章。对于 Android 应用程序,另一方面,只是键/值的消息发送到设备和布局由负责管理推式通知的类定义中的应用。在苹果的 iOS 应用中,过程是这些方法的组合。

三七总皂苷传递通知,虽然每个应用程序需要一个后端 Web 或桌面应用程序定义的消息,并要连接到的推送通知提供程序发送它。

蔚蓝的通知中心是微软 Azure 服务,为从任何后端向任何移动平台发送推式通知提供容易使用的基础设施。其实,有两个主要模式和管理通知集线器设备的两种模型。在这篇文章中,我将展示如何应使用每种模式 ; 讨论优点、 缺点和可能出现的情况,为每个 ; 并描述可以使用不同的模型。我会专注于发送使用通知集线器的跨平台和自定义的推式通知的最佳做法,还显示如何通知集线器集成到 Azure 移动服务。

推送通知生命周期

推送通知生命周期包括三个主要步骤:

  1. 应用程序发出请求的推送通知服务句柄,可以是一个令牌、 信道的 URI 或 registrationId,具体取决于移动平台。
  2. 应用程序发送了三七总皂苷的句柄后端来存储它。
  3. 后端将请求发送到的期票,然后提供了推式通知。

从概念上说这个过程是很简单,但在实践中它并非那么容易因为执行此流程所需的基础设施是复杂的。如果为不同的客户端平台提供了应用程序,它为每个需要执行 (在现实中,它将代表每个平台提供的每个接口的一个实现)。此外,每个推式通知的格式有其自身平台的具体规格,在结束时,这些可以很难维持。这并不是所有:后端需要能够扩展不支持广播到多个设备 ; 一些推送通知服务 目标推送通知到不同的利益群体 ; 和监测为交付状态推式通知。这些问题必须在后端处理,因此,这就需要一个复杂的基础结构。

使用通知集线器

如上所述,Azure 通知集线器轻松将从任何后端的移动推式通知发送到任何移动的平台,它支持不同的利益群体发送推式通知和提供监控、 遥测和调度的推式通知。在这种方式,通知集线器是第三方服务,可帮助将跨平台性和个性化推送通知发送到应用程序和工具的推送通知基础结构的所有需求。

要在应用程序中集成通知中心需要配置在 Azure 门户 ; 通知中心和三七总皂苷之间的连接应配置在各自的通知中心的配置分隔符。没有这些配置中,不能发送推式通知,则会发生错误。(如果你曾经怀疑关于哪些推送通知服务所支持的通知中心,配置分隔符是最好的地方,检查。若要使用通知集线器,您需要理解标签,可以使用模板和不同的方式通知集线器。

一般情况下,一个标记代表一个兴趣小组,允许您将发送推式通知到具体的目标。例如,一个体育新闻应用程序可以定义标记每项运动:骑自行车、 足球、 网球等等,使用户可以选择他想要接收基于自己的利益。身份验证是必需的重点是用户的情况,用户 id 可以被用作标签。在实践中,标签是不超过一个简单的字符串值 (如"循环"、"足球"或"网球"),它也是有用的定位 (为不同的语言,还有模式 (如"en_cycling"或"pt_cycling",即标签在英文或葡文,分别)。

模板并不是一个新的概念,但通知集线器创建一种抽象,允许您定义特定于平台的模板或泛型模板,这意味着您可以指定每个推式通知时注册设备定义的键/值对。注册然后将提供本机通知 (烤面包、 有效载荷或消息),其中包含表达式 (例如,$(message)) 具有值的后端或应用程序将定义当发送推式通知。

图 1 (用于 Windows、 iOS 和 Android) 显示的通用模板示例使用表达式。

图 1 通用模板

var toast = new XElement("toast", 
  new XElement("visual",
  new XElement("binding",
  new XAttribute("template", "ToastText01"),
  new XElement("text",
  new XAttribute("id", "1"),                                
  "$(message)")))).ToString(SaveOptions.DisableFormatting);
var alert = new JObject(
  new JProperty("aps", new JObject(new JProperty("alert", "$(message)"))),
  new JProperty("inAppMessage", notificationText))
  .ToString(Newtonsoft.Json.Formatting.None);
var payload = new JObject(
  new JProperty("data", new JObject(new JProperty("message", "$(message)"))))
  .ToString(Newtonsoft.Json.Formatting.None);

后端或应用程序将填充值,当它发送的键值 (图 2 的过程进行了说明):

{"message", "Message here!"}

将独立于平台的消息发送
图 2 将独立于平台的消息发送

注册设备

在移动开发使用通知集线器,用于管理设备和发送推式通知,可以使用两种不同模型的两种模式。一般情况下,模式可以描述如下:

案例 1: 设备直接连接到通知集线器

  • 客户端应用程序直接连接到通知集线器来注册该设备。
  • 后端或 Web 或桌面应用程序连接到通知集线器发送推式通知。
  • 三七总皂苷将提供移动推式通知。

情况 2:后端管理通知中心的设备

  • 客户端应用程序连接到后端。
  • 后端连接与通知集线器来注册的设备。
  • 后端定义了推式通知,将发出通知集线器。
  • 三七总皂苷将分发移动推式通知。

这两种模式允许您使用注册模型或安装模型 ; 这些模型描述设备到通知集线器发送所需的信息的方式。安装模型介绍了最近并用于新的应用程序或者甚至用于当前应用程序的建议。这种新模式并不使注册模式过时。下面是每个模型的一般描述:

注册模式:在此模型中,应用程序发送注册请求到通知集线器,提供的三七总皂苷处理程序和标记,和集线器返回注册 id。 为每个注册,您可以选择本机的模板或泛型模板,将定义的消息。

安装模式:在此模型中,应用程序将安装请求发送到通知集线器,提供程序所需的所有信息:InstallationId (例如,是 GUID)、 标签、 三七总皂苷处理程序、 模板和辅助模板 (用于 Windows 应用程序)。

虽然这两种模型是当前可供使用,安装模型介绍了某些技术的原因,其中包括:

  • 安装模型是易于实施和维护。
  • 安装模式允许部分更新修改、 添加或删除标签、 三七总皂苷处理程序、 模板和等等,而不发送安装对象 ; 与此相反的是,注册模式需要整个登记对象。
  • 注册模式介绍了在相同的设备后端重复注册的可能性。
  • 注册模式在维护登记列表中创建复杂。
  • 无论您使用哪个图案,流将相同。

安装模型可以用于任何.NET 或 Java 回来结束通知集线器.NET 与 Java Sdk。对于客户端应用程序,可以使用这一模型,使用 REST API,直到将支持安装模型的新 NuGet 程序包被释放。你会发现当前的 NuGet 程序包支持注册模型,WindowsAzure.Messaging.Managed,可在 bit.ly/1ArIiIK

现在,让我们看看两种模式。

案例 1: 设备直接连接到通知集线器

我要去讨论设备直接连接到通知中心,这是由开发人员最常用的模式会发生什么。为了描述这,我将使用注册模式。

注册和注销通知集线器的设备:设备请求 PNS 的句柄从三七总皂苷,然后它将连接到通知的集线器,以注册,使用三七总皂苷的句柄。通知中心 PNS 连接中使用此值。

在实践中,例如与普遍的应用,在应用程序启动请求的通道从 Windows 推送通知服务 (wns 系列) 用下面的代码:

// Get the channel from the application
var pushNotificationChannel =
  await PushNotificationChannelManager.
  CreatePushNotificationChannelForApplicationAsync();

安卓系统,谷歌云消息传递提供 registrationId,并为 iOS,苹果推送通知服务提供一个令牌。

应使用在 Azure 门户和连接字符串 (更具体地说,DefaultListenSharedAccessSignature 键) 中定义的枢纽名称创建一个通知枢纽对象:

// Create the notification hub object
var hub = new NotificationHub(HubName, ConnectionString);

请注意,NotificationHub 类提供的 Windows­Azure.Messaging.Managed NuGet 程序包 (bit.ly/1ArIiIK)。

现在应用程序可以注册通知中心:

// Register the device in Notification Hubs
var result =
  await hub.RegisterNativeAsync(pushNotificationChannel.Uri, Tags);

当你在通知中心注册的设备时,你不必提供列表的标签,但如果应用程序需要定义利益团体,这些标记应存储在该设备在注册更新中使用它们。

请注意,结果。收到的 RegistrationId 是在通知中心注册的 id 和不应混淆与 registrationId 在 Android 应用程序 (从谷歌云消息 id) 中使用。

发送推式通知:后端 (或应用程序) 连接到通知的集线器,以发送推式通知,可以发送到特定的标记 (或不) 使用特定或通用的模板。

在这种情况下,谁会连接到通知集线器、 后端或 Web 或桌面应用程序发送的通知并不重要。在实践中,应创建一个 NotificationHubClient 对象,将需要定义在 Azure 门户和连接字符串 (更具体地说,DefaultFullSharedAccessSignature 键) 的枢纽名称:

// Create the Notification Hub client object
var hub = NotificationHubClient.CreateClientFromConnectionString(
  HubName, ConnectionString);

接下来,本机推式通知必须定义,例如,如图所示,在图 3

图 3 定义本机推送通知

// Define template for Windows
var toast =
  new XElement("toast",
  new XElement("visual",
  new XElement("binding",
  new XAttribute("template", "ToastText01"),
  new XElement("text",
  new XAttribute("id", "1"),
  notificationText)))).ToString(SaveOptions.DisableFormatting);
// Define template for iOS
var alert = new JObject(
  new JProperty("aps", new JObject(new JProperty("alert", notificationText))),
  new JProperty("inAppMessage", notificationText))
  .ToString(Newtonsoft.Json.Formatting.None);
// Define template for Android
var payload = new JObject(
  new JProperty("data", new JObject(new JProperty("message", notificationText)))
  .ToString(Newtonsoft.Json.Formatting.None);

然后可以发送推式通知:

var googleResult =
  await hub.SendGcmNativeNotificationAsync(payload, tags);
var windowsResult =
  await hub.SendWindowsNativeNotificationAsync(toast, tags;
var appleResult =
  await hub.SendAppleNativeNotificationAsync(alert, tags);

发送移动推式通知时,可以提供标记列表中的,但这是可选的 (这取决于应用程序的要求)。

分发推式通知:要完成这一进程,三七总皂苷交付设备的通知。该服务将尝试推送通知的时间,为每个服务各不相同的有限期间。

此方案的优点之一是它不需要一个后端,但是有是一个缺点,当用户使用多个设备:标记不在设备之间共享,用户需要重新定义为每个标签。移动应用程序取决于该通知中心,和它需要每一次更新中的应用,可以是一个问题,如果用户不更新到最新版本 (移动应用程序的共同问题) 的标记。

对于这种情况的可能方案可以包括:

  • 移动应用程序并不需要一个后的端,如通过这种能力与桌面应用程序或后端办公室 (管理 Web 站点) 何时发送推式通知。例如,请考虑基于饲料有一个设置页面,在那里用户可以订阅他们的利益,例如开发人员的事件,IT Pro 事件等等的在线技术事件消息的应用程序。一旦选择了利益,则用户将收到这些利益的推式通知。而不是要求一个后端触发推式通知,一个桌面应用程序或后端办公室可以跟直接通知枢纽每当创建新的事件来触发推式通知已经订阅了特别感兴趣的所有设备。
  • 移动应用程序使用一个后端,但推式通知,由于某些原因,未集成的服务,由一个桌面应用程序或后端办公室发送。一个例子可能是一个客户端,有一种服务,提供的信息来显示在应用程序中,但不允许到服务 (这可以使用不同的应用程序) 的更改。但是,为了支持推送通知,客户端可以发送通知使用的后台办公室或甚至一个桌面应用程序。

案例 2: 后端管理通知中心的设备

为了描述这一模式,将先使用基于安装的新方法­公式模型,介绍了最近由通知中心队。

应用程序连接到后端:在这种情况下,应用程序连接到后端来创建或更新安装对象,它将存储在本地。

该设备从 PNS 请求 PNS 句柄并从通知集线器上,存储在设备上获取上一次安装。然后,将设备连接到后端,若要创建或更新安装,从中通知集线器的设备。(将创建一个新的安装对象第一次,但它应该重用每次的后端连接具有相同的设备的通知中心)。

例如,在普遍应用中,应用程序将开始通过从 wns 系列,用以下内容请求该信道的 URI:

// Get the channel from the application
var pushNotificationChannel =
  await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();

到后端,若要创建或更新安装请求之前,必须定义安装对象:

// Retrieve installation from local storage and
// create new one if it does not exist
var installation = SettingsHelper.Installation;
if (installation == null)
{
  installation = new Installation
  {
    InstallationId = Guid.NewGuid().ToString(),
    Platform = NotificationPlatform.Wns,
    PushChannel = pushNotificationChannel.ToString(),
    Tags = new List<string> {“news", "sports"}
  };
}

从 JSON 文档中提供创建客户端应用程序中使用的安装类。

在这一点上,您可以请求处登记,而这样的代码:

// Create a client to send the HTTP registration request
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, new Uri(_registerUri))
{
  Content = new StringContent(JsonConvert.SerializeObject(installation),
    Encoding.UTF8, "application/json")
};
var response = await client.SendAsync(request);

后端创建或更新安装过程中通知集线器的设备:当后端收到请求注册使用安装模型的设备时,它用通知的集线器,以创建或更新安装连接。例如,在 ASP.NET Web API,你可以创建 NotificationHubController 来定义服务来管理通知集线器的设备。执行需要一个通知中心客户端对象,可以定义在构造函数中,如下:

public class NotificationHubController : ApiController
{
  private readonly NotificationHubClient _notificationHubClient;
  private const string HubName = "<define the notification hub name>";
  private const string ConnectionString = "<define the connection string>"
  public NotificationHubController()
  {
    _notificationHubClient =
      NotificationHubClient.CreateClientFromConnectionString(
      ConnectionString, HubName);
  }

现在您可以编写方法,将创建或更新安装,将作为输入接收安装对象,如下所示:

[HttpPost]
[Route("api/NH/CreateOrUpdate")]
public async Task CreateOrUpdateAsync(Installation installation)
{
  // Before creating or updating the installation is possible, 
  // you must change the tags to have secure tags
  await _notificationHubClient.
    CreateOrUpdateInstallationAsync(installation);
}

请注意标签可以定义并存储在后端 (在这两种模型)。移动应用程序不需要将它们存储或甚至了解他们。例如,考虑一个银行应用程序定义标记为每个帐户的客户端。当操作完成开户后时,到该帐户的设备发送推式通知。在这种情况下,这些标记必须是安全,只有后端就会知道他们。

在安装模式下,安装将存储在该通知中心,意味着它可以检索基于 InstallationId。

后端定义了推式通知,将发送通知中心:后端负责将推式通知发送到通知集线器,并可以提供标签,并定义模板为每个平台 (当一个通用的模板并不定义)。

1,在那里后, 端或应用程序连接到通知的集线器,以发送推式通知,所以我不会提供任何额外的代码,这种情况下的情况下,执行是的情况相似。

顺便说一句,在安装模式下,有可能将推式通知发送到一个特定的安装。这是只为注册安装模型的基础的新功能。下面是代码做到这一点:

_notificationHubClient.SendWindowsNativeNotificationAsync(
  payload, "$InstallationId:{" + installationId + "}");

推送通知服务将分发推式通知:要完成这一进程,三七总皂苷将交付推式通知设备,在有限的期间。

这种情况下的优势之一是标记可以是静态还是动态的这意味着他们可以随时更改,不改变或影响移动的应用程序 ; 标签是安全的因为每个用户只可以注册为一个标签,如果他通过身份验证 ; 标签可以分担不同的设备,为同一用户 ; 移动应用程序是完全独立的通知中心。这种情况下的缺点是过程实际上也是比第一次的情况下,复杂得多,如果使用注册模式。

这包括可能的方案:

  • 一个移动的应用程序连接到后端和标记必须是安全的。这种情况下很好的例子是一个应用程序有关的银行账户,支持推送通知来保持用户及时了解他们的帐户中的交易记录。
  • 一个移动的应用程序连接到后端和标记必须是动态的。考虑一个应用程序提供了不同的音乐事件,使用标记来定义不同的事件的信息,用户可以为每个事件订阅要更新的所有相关信息。每个标记的生命周期短,每次创建新的事件,也为该事件创建一个新标记。标签,因此,是动态的可以由后端,保持独立的移动应用程序的过程。

在这两种情况下,标签应存储在后端,但这并不意味着移动客户端不知道他们。

更新登记

与注册模型,您想要更新任何有关的登记,每的次如标记正在使用,您必须恢复注册 ; 这被必需完成更新。但在安装模式中,您可以更新只是具体的细节。这意味着,如果应用程序需要更新一个标签、 模板或其他详细信息,它是可能做了部分更新。这里是更新标记的代码:

// Define the partial update
PartialUpdateOperation replaceTagsOperation =
  new PartialUpdateOperation();
replaceTagsOperation.Operation = UpdateOperationType.Replace;
replaceTagsOperation.Path = "/tags/tennis";
replaceTagsOperation.Value = "cycling";
partialUpdates.Add(replaceTagsOperation);
// Send the partial update
_notificationHubClient.PatchInstallation(
  installationId, partialUpdates);

在蔚蓝的移动服务中使用通知集线器

蔚蓝的移动服务允许您与可扩展性和安全性的后端 (使用 Microsoft.NET 框架或 Node.js) 主持在 Azure 中开发应用程序。重点放在移动应用程序,Azure 移动服务提供了一个移动应用程序的需要,例如 CRUD 操作、 社会网络的身份验证、 离线支持,推式通知和主要功能。

推式通知 Azure 移动服务中提供的通知中心,同时创建了 Azure 手机信息服务,每次通知集线器是创建并与 Azure 移动服务相关联。

使用 Azure 移动服务的移动应用程序可以快速简便的方式,实现推式通知,因为 Azure 移动服务 SDK 提供了 Api,可用于:

  • 客户端应用程序注册使用的后端设备。
  • 一个后端来管理设备的通知中心 ; 若要修改来自设备的请求,这意味着后端可以添加、 修改或删除标签从移动应用程序,所提出的要求或甚至取消了注册 ; 发送推式通知 (使用特定模板,而且如果需要标签,则为他们)。

在.NET 后端执行将类似于:

await Services.Push.SendAsync(
  GetWindowsPushMessageForToastText01(
  "My push notification message", tags));

推式通知基于一条消息,并可以实现中所示,GetWindowsPushMessageForToastText01 方法定义的模板图 4

图 4 定义基于模板的 ToastText01 WindowsPushMessage

public static IPushMessage GetWindowsPushMessageForToastText01(string message)
{
  var payload = new XElement("toast",
    new XElement("visual",
    new XElement("binding",
    new XAttribute("template", "ToastText01"),
    new XElement("text",
    new XAttribute("id", "1"), message))))
    .ToString(SaveOptions.DisableFormatting);
    return new WindowsPushMessage
    {
      XmlPayload = payload
    };
}

在客户端应用,例如在通用的应用程序,您必须从 wns 系列请求通道:

// Get the channel
var channel =
  await PushNotificationChannelManager.
  CreatePushNotificationChannelForApplicationAsync();

然后应该创建移动服务客户端,并且它将允许与后端交互:

// Create the MobileServiceClient using the
// AzureEndpoint and admin key
var mobileServiceClient =
  new Microsoft.WindowsAzure.MobileServices.MobileServiceClient(
  AzureEndPoint, AzureMobileServiceApplicationKey);

AzureEndPoint 应该是像 https://mymobileservice.azure-mobile.net/ 和 AzureMobileService­ApplicationKey 是一个字符串,它表示在 Azure 门户中定义的应用程序键。

你可以使用 RegisterNativeAsync 方法注册的设备,如下:

// Register the device
await MobileServiceClient.Client.GetPush().RegisterNativeAsync(
  channel.Uri, tags);

但是,如果你要注册的设备使用一个通用的模板,使用 RegisterTemplateAsync 方法。

在 Azure 移动服务 (.NET 后端),扩展、 修改或取消注册 Azure 通知中心,应实现 INotificationHandler 接口。通过这样做,你可以举个例子,有安全标签。

结束语

通知中心提供了一个抽象向任何移动的平台,从任何后端发送推式通知和新的模式使您可以定义一个独特的安装包含通知中心所需的基本信息。安装可以重用,避免重复登记和复杂性,为新的应用程序或甚至在当前应用程序,建议安装模型。有两个主要模式注册到通知的集线器,应根据应用程序的要求来选择设备。

这种模式允许您发送消息侧重于某些特殊利益群体使用标记,和它也是可能的定义通用或特定的模板,规模和监视应用程序的需要服务。最后,很容易使用 Sdk 在几种语言提供移动应用程序和后端。

通知中心集成在默认情况下,这是对开发人员来说有利,因为它支持推送通知功能实现快速和容易的方式。


Sara Silva 是一种数学专业毕业生和 Microsoft MVP。如今,她工作作为移动名在葡萄牙,主要重点放在 Windows 应用程序,Xamarin 和微软 Azure 的开发人员。她的博客 saramgsilva.com 和后面可以在 Twitter 上 twitter.com/saramgsilva

衷心感谢以下 Microsoft 技术专家对本文的审阅:Piyush Joshi、 圣保罗莫尔加多和 Chris 雷斯纳