此文章由机器翻译。

Microsoft Azure

科尔多瓦与微软 Azure 的应用程序推送通知

Glenn Gailey

下载代码示例

随着移动设备增殖和成为无处不在我们的日常生活的一部分,消费者期待有更多从他们的手机。而这是一次可以接受你的移动应用程序,只需连接到云以获得最新的股票报价或存储用户生成的数据,用户现在希望您的应用程序,通知他们在事件发生时 — — 例如当他们的股票达到某一价格或当他们团队的分数。今天,所有的本机设备平台支持推送通知,使您可以与您用户近实时交互。

我将演示基本的利用微软 Azure 平台开发的 Apache 科尔多瓦使用 Visual Studio 工具应用程序发送推式通知。我开始与现有的科尔多瓦样例应用程序项目、 创建和配置所需的服务,然后修改应用程序注册为推式通知,所有在 Visual Studio 中。我将重点介绍将推式通知发送到 Android 的应用程序,但已完成的科尔多瓦应用程序示例支持 Android 和 iOS 平台。我将展示如何使用 Android 模拟器,不是因为它是伟大的 (它不是),但因为它不支持推送通知。我推荐使用 Android 设备,而不是仿真程序,如果可以的话。(请注意将推式通知发送到 iOS 设备需要一个物理设备和苹果开发者账户和移动服务插件当前不支持 Windows Phone)。

若要使用 Visual Studio 2013 模具在这篇文章中强调,你必须安装的更新 4。您还需要 Visual Studio 工具 Apache 科尔多瓦 (aka.ms/uopu9r),其中也包含在 Visual Studio 2015 预览。这些工具的更全面的概述,请参见这篇文章,"写混合跨平台的应用程序在 Visual Studio 中与 Apache 科尔多瓦",在这一问题。

最后,你需要的 Azure 帐户。如果您没有帐户,您可以注册 Azure 的试用,达 10 免费的移动服务,即使在您的试用期结束后,您可以继续使用。有关详细信息,请参阅 Azure 免费试用页 (aka.ms/qepjcc)。

如何推进通知工作

不论是本机设备平台,所有的推送通知体系结构是基于 REST,而细节是平台-­具体。图 1 显示发送推式通知使用 Azure 所需的服务架构。

推送通知服务体系结构
图 1 推送通知服务体系结构

正如你可以看到在图 1,一种推送通知体系结构的关键是平台通知服务 (PNS)。此特定于设备的平台服务是负责将消息发送到本机设备,并实际上处理通知,不该应用程序的设备。你可以看到在图 1 后, 端服务亦须将通知发送到设备 (这是 Azure 的进来)。在大多数情况下后, 端服务必须原发性肾病综合征必须能够发送通知,这是为了防止恶意使用三七总皂苷进行身份验证。发送推式通知的基本过程是这样的:

  1. 移动应用程序联系人 PNS 请求服务使用来标识设备的句柄。这些句柄并不持久,需要管理和定期刷新。
  2. 该应用程序将该句柄发送到它的后端服务,它的存储位置,通常与其他使服务能够正确目标设备的数据。你会看到,Azure 很好。
  3. 当发送推式通知后, 端服务发送一个请求通知服务,其中包括手柄和消息,在一种特定于平台的格式 (通常是 JSON 或 XML)。
  4. 三七总皂苷对请求进行身份验证,并将请求的消息发送到特定的设备,所提供的句柄标识。

每个本机设备平台有其自身的期票。这意味着,当您创建一个跨平台的应用程序使用科尔多瓦和想要发送消息,您必须提供您的应用程序与一个或多个下列服务:

  • 苹果推送通知服务 (APN) 为 iPad 和 iPhone 的设备的
  • 谷歌云消息服务 (GCM) 的安卓设备
  • Windows 通知服务 (wns 系列) 为 Windows 设备的
  • 微软推送通知服务 (镶嵌) 为 Windows Phone 设备的

推式通知插件为 PhoneGap (aka.ms/xltv38) 用来向您科尔多瓦的应用程序注册本机设备三七总皂苷。然而,即使这方便的插件,你仍然有对双方管理注册为您的应用程序在各种平台上你支持,所有这些完全不同的平台之间发送的的信息。除了这一切,您还需要创建和维护发出通知的后端服务。幸运的是,Azure 来到救援提供这两种简化的方法来注册和管理设备的登记,以及一种方便的从中将通知发送到您的科尔多瓦应用程序的后端服务。

为什么用推式通知的 Azure 吗?

在 Azure 专门旨在可以很容易地将推式通知发送到您的跨平台移动设备应用程序中有两个服务:蔚蓝通知集线器和蔚蓝的移动服务。

通知中心可伸缩的、 跨平台的解决方案,用于将推式通知发送到移动设备,通知枢纽工程和科尔多瓦的应用程序。通知中心管理与每个 PNS 登记。更重要的是,通知中心允许您创建模板登记,以便您可以发送消息到所有注册的设备,无论使用什么平台,与只有一行代码。此外可以使用标记来只向特定登记设备发送有针对性的通知。有关通知中心的详细信息,请参阅在 Azure 网站 aka.ms/nkn4n4

移动服务特别旨在支持移动应用程序,通知集线器与集成的移动服务。当您创建一个新的移动服务时,一个新的通知中心是自动提供。撰写这篇文章时,甚至在免费的层级中运行的移动服务允许 100 万推每月免费。除了推式通知,移动服务还提供了为您的应用程序数据在 SQL Azure 数据库和身份验证与最受欢迎的供应商,例如 Facebook、 Google、 Azure Active Directory,微软账户和 Twitter 的简单存储。有关移动服务的详细信息,请参阅在 Azure 网站 aka.ms/az48v5

因为移动服务与通知中心集成,您可以注册使用流动电话服务客户端的推式通知。那里是没有需要处理的通知中心访问策略或连接字符串。

在撰写本文时,流动电话服务客户端仅支持注册为 iOS 和 Android 应用程序。如果你还需要在 Windows Phone 使用镶嵌上支持您科尔多瓦的应用程序,请参见我的博客后,"推送通知到 PhoneGap 应用程序使用通知集线器一体化,"在 aka.ms/r197ab

获取限定的时间内示例应用程序

移动服务是关于连接你的手机 — — 包括基于科尔多瓦的应用程序 — — 到 Azure 存储、 身份验证和推送通知。因此,它真的没关系我用来证明推式通知,只是,只要它是科尔多瓦应用程序的应用程序。有出版由 Visual Studio 乡亲,每人用一种不同的 JavaScript 框架的几个基于科尔多瓦的 Todo 样本应用程序项目。你可以找到这些基于 Visual Studio 的科尔多瓦样品在 aka.ms/dxrr30

虽然 AngularJS 无疑是更流行的框架中,AngularJS 版本的 Todo 示例演示如何使用移动服务其他 Api 用于远程数据存储。骨干­JS 示例使用移动服务插件,所以扩展此示例添加推式通知是更直接。因此,我选择使用 BackboneJS 版本的示例 (aka.ms/sffl1f)。无论您使用您的应用程序 (如果有) 的 JavaScript 框架,适用于相同的基本步骤。

在这一点上,你应该打开该项目 index.html 文件和删除或注释掉现有的移动服务引用,看起来像这样:

<script src="https://ajax.aspnetcdn.com/ajax/mobileservices/
  MobileServices.Web-1.1.3.min.js"></script>
<script src="services/mobile services/todolist-xplat/service.js"></script>

您可能还应该删除整个现有的 \services 文件夹,其中包含原始样本 service.js 文件。这将有助于避免以后的多个 MobileServiceClient 变量之间的混淆。在下一节,您将使用 Visual Studio 创建一个新的移动服务,并将其连接到您的科尔多瓦应用程序。你也会向项目中添加 PushPlugin,设备和控制台插件。

创建后端 Azure 服务

Visual Studio 容易地提供所需的 Azure 服务,你可以直接从 IDE。接下来,我将介绍如何从 Visual Studio (假设你有积极的蔚蓝订阅) 创建一个新的移动服务权利。

在 Visual Studio 解决方案资源管理器,右键单击该项目,然后单击添加 |连接的服务。在服务管理器中,单击创建服务。在创建移动服务对话框中设置下列字段,显示在图 2,然后单击创建:

  • 订阅:这是你蔚蓝的订阅。
  • 名称:这是服务的您的新手机,它必须是服务的唯一的 Azure,并且成为该服务的 URL 的一部分的名称。一个红色的 X 显示当您输入的名称不是可用的。
  • 运行时:此应用程序使用 JavaScript (Node.js) 后端,只是更有意义的 JavaScript 程序员比.NET 后端 (ASP.NET Web API 项目)。
  • 区域:您的移动服务的位置 — — 理想的情况是在您的 SQL 数据库相同的位置。
  • 数据库:在同一区域中选择一个现有的数据库,或创建一个新的数据库,理想的情况是一个人的自由。当您选择一个现有的数据库时,表属于是移动服务名称,所以就没有风险对您当前的数据的架构。
  • 服务器的用户名和服务器密码:这些都是重要的凭据,所以保证他们的安全。移动服务不需要他们再一次,但你会当你想要的东西,如使用此数据库以支持另一种移动服务。

创建移动服务对话框
图 2 创建移动服务对话框

当您单击创建时,一个新的移动服务提供以及一个新的通知中心)。回在服务管理器对话框中,选择这项新服务并单击确定。这向科尔多瓦项目中添加一个版本移动服务插件和 InAppBrowser 插件,移动服务使用的身份验证。它还会添加并打开新的代码文件中,然后限定的时间内-cordova.js,它定义用来连接到移动服务的 MobileServiceClient 实例等。使该文件保持打开状态 ; 你以后会更新在这里。

接下来,您需要在您的 SQL 数据库,应用程序可以用来存储项目中创建一个新的 TodoItem 表。打开服务器资源管理器中,展开蔚蓝的节点,然后移动服务节点,右键单击移动服务并选择创建表。为表名称,请键入 TodoItem,然后单击创建。在服务器资源管理器中的移动服务节点下添加一个新的 TodoItem 表。此节点对应于一个新的 SQL 数据库表,作为一个新的表,在您的移动服务公开。

在这一点上,您需要更新默认插入脚本 exe­前不久通过移动服务时插入到新表。在服务器资源管理器中,展开您刚添加的 TodoItem 表、 打开 insert.js 文件和用在所示的代码替换现有的插入函数图 3

图 3 在 TodoItem 表中插入项目时执行的脚本

function insert(item, user, request) {
  // Execute the request and send notifications.
  request.execute({
    success: function () {
      // Create a template-based payload.
      var payload = '{ "message" : "New item added: ' + item.text + '" }';
      // Write the default response and send a template notification
      // to all registered devices on all platforms.           
      push.send(null, payload, {
        success: function (pushResponse) {
          console.log("Sent push:", pushResponse);
          // Send the default response.
          request.respond();
        },
        error: function (pushResponse) {
          console.log("Error Sending push:", pushResponse);
          // Send the error response.
          request.respond(500, { error: pushResponse });
        }
      });
    }
  });
}

中的代码图 3 调用 send 方法推对象,将基于模板的推式通知发送到所有注册的设备上。而不是将 null 传递给第一个参数 (标签) 在这种情况下,你也可以传递一个标记值或数组的标签。当您使用标记时,通知集线器才会向其注册包含这些标记之一的设备发送通知。有关标签的详细信息,请参阅 aka.ms/cwr4l4

最后,您需要导航到 Azure 管理门户网站,以便您可以注册您的应用程序的三七总皂苷的凭据,您将在下一节中创建。在服务器资源管理器中,右键单击该节点为您的移动服务在 Azure,然后单击打开管理门户中的,登录到门户网站。在这一点上,你应该 (由符号只表示) 的快速入门选项卡中为您新的移动服务。单击推送选项卡并注意的通知中心在页面的顶部你移动服务所使用的名称。你需要懂得这点,如果你要解决您在 Visual Studio 中的通知集线器 (正如您稍后将看到)。向下滚动到大气环流模式设置在页面的底部。这是后推式通知调配,就设置 GCM API 密钥。

提供消息传递服务谷歌云

最耗时的配置推送通知部分通常资源调配原发性肾病综合征的应用程序。值得庆幸的是,此资源调配需要只能做一次为一个给定的应用程序和平台。安卓系统,你需要一个谷歌帐户,提供您科尔多瓦与 GCM 谷歌开发人员控制台 Web 站点上的应用程序 (aka.ms/wt80js)。登录后,单击创建项目、 指定项目名称和 (可选) 您自己独特的项目 ID、 接受条款,然后单击创建。一旦创建,就会显示新项目。写下页 ; 顶部所显示的项目数量值 稍后你会需要它了。

接下来,扩展 Api & 身份验证,请单击 Api、 android 向下滚动到谷歌云消息、 使它和接受服务条款。现在,在 Api 下 & 身份验证,单击凭据,根据公共 API 的访问,请单击创建新密钥,单击服务器的密钥,然后创建。写下的 API 密钥值。回到在 Azure 管理门户中,输入 API 密钥下"谷歌云消息设置"部分中,然后单击保存。

现在设置 API 密钥和通知中心现在可以使用大气环流模型将推式通知发送到您的应用程序。如果你有麻烦资源调配 GCM,或者如果该 Web 站点发生变化,你总是能找到最新的详细步骤,调配 GCM 在文章中,在"如何向启用谷歌云消息,"Azure 网站上网站 aka.ms/po7r8n。你可以找到等效的步骤配置 APN 在文章中,"如何到使苹果推送通知,"iOS 客户端在 Azure 网站上 aka.ms/vooydc。请注意因为通知中心是一个独立的服务,其他后端服务还可以使用此注册将通知发送到您的应用程序。

更新客户端向登记册 》 的通知

你需要做的最后一件事是更新下载的限定的时间内样例项目注册 azure 的推式通知时,应用程序开始。首先,您需要添加所需的插件。在解决方案资源管理器中,双击 config.xml 项目文件,以便在配置设计器中打开它,然后选择插件选项卡。根据核心,添加设备、 控制台和地理位置的插件。如果已经安装了插件的 Azure 移动服务,单击删除卸载它 — — 你需要安装较新版本支持推送通知。接下来,单击自定义,选择 Git,到 Azure 移动服务的插件存储库,输入以下 URL,然后单击添加:

https://github.com/Azure/azure-mobile-services-cordova.git

这将安装最新版本的插件,其中包含移动服务客户端库。重复前面的步骤,将 PushPlugin 添加到项目中,通过使用以下资源库 URL:

https://github.com/phonegap-build/PushPlugin.git

图 4 显示如何简单的 Visual Studio 现在使它将任何有效的科尔多瓦插件添加到您的项目。

PushPlugin 插件添加到应用程序项目
图 4 将 PushPlugin 插件添加到应用程序项目

打开时您添加移动服务连接到您的项目 (例如限定的时间内-cordova.js,限定的时间内科尔多瓦在哪里的服务的名称同名一) 创建的项目文件。保存现有的 MobileServiceClient 构造函数,为您的移动服务和应用程序键 (所以他们不会被覆盖),然后用中所示的代码替换生成的代码包含 URL 的副本图 5

注册与 Azure 推送通知当应用程序启动的图 5 所示代码

var GCM_SENDER_ID = '<your_project_number>'; // Replace with your own ID.
var mobileServiceClient;
var pushNotification;
// Create the Azure client register for notifications.
document.addEventListener('deviceready', function () {
  mobileServiceClient = new WindowsAzure.MobileServiceClient(
    'https://todolist-cordova.azure-mobile.net/',
    'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
  // Define the PushPlugin.
  pushNotification = window.plugins.pushNotification;
  // Platform-specific registrations.
  if (device.platform == 'android' || device.platform == 'Android') {
    // Register with GCM for Android apps.
    pushNotification.register(successHandler, errorHandler,
      {
        "senderID": GCM_SENDER_ID,
        "ecb": "onGcmNotification"
      });
  }
});
// Handle a GCM notification.
function onGcmNotification(e) {
  switch (e.event) {
    case 'registered':
      // Handle the registration.
      if (e.regid.length > 0) {
        console.log("gcm id " + e.regid);
        if (mobileServiceClient) {
          // Template registration.
          var template = "{ \"data\" : {\"message\":\"$(message)\"}}";
          // Register for notifications.
          mobileServiceClient.push.gcm.registerTemplate(e.regid,
            "myTemplate", template, null)
            .done(function () {
              alert('Registered template with Azure!');
            }).fail(function (error) {
              alert('Failed registering with Azure: ' + error);
            });
          }
        }
        break;
      case 'message':
        if (e.foreground) {
          // Handle the received notification when the app is running
          // and display the alert message.
          alert(e.payload.message);
          // Reload the items list.
          refreshTodoItems();
        }
        break;
      case 'error':
        alert('Google Cloud Messaging error: ' + e.message);
        break;
      default:
        alert('An unknown GCM event has occurred');
        break;
  }
}

中的代码图 5 请求注册 ID 从大气环流模型,然后使用返回的注册 ID 来创建或更新通知中心登记。请注意, 图 5 只包含 GCM 代码所需的 android 操作系统,而随附的项目下载 Android 和 iOS 包含代码。若要获取此代码,以在您的项目中运行,请将 MobileServiceClient 构造函数替换那个通过 Visual Studio 工具添加的已保存。此外,将 GCM_SENDER_ID 设置为您在谷歌开发人员控制台的应用程序的项目编号。

配置推式通知的 Android 模拟器

像 iOS 模拟器中,您可以接收推式通知 Android 模拟器上的提供您执行几个额外的配置步骤。基本上,你需要使用谷歌 Api 并添加一个谷歌帐户。当使用一个物理的 Android 设备,你可以跳过这些步骤并转到下一节来运行并测试您的应用程序。(再一次,如果可能的话,你应该真的试着在一个物理的 Android 设备上运行 — — 船舶与 Android SDK 的模拟器是极度缓慢,尽管它不工作。)

从命令提示符下,键入"android avd,"显示 Android 虚拟设备 (AVD) 经理。你应该有至少一个的 AVD 可用,有时称为 MyEmulator。如果你没有 AVD,你需要创建一个。选择您的 AVD,单击编辑,然后将目标设置为谷歌 Api 并单击确定。单击启动运行这个模拟器。在仿真器中,单击应用程序图标,然后单击设置。向下滚动到帐户、 单击添加帐户,单击谷歌,和到仿真程序中添加一个新的或现有的帐户。与添加的谷歌帐户,您可以收到通知在模拟器上。

一旦你在模拟器上添加了一个谷歌帐号,您应计划继续运行 (除非您已经启用中的仿真程序选项的快照) 的仿真程序。否则,在您重新启动模拟器,和你必须重新添加一个谷歌帐户,以便能够再次收到通知时,不会保持设备的状态。

运行应用程序并生成推式通知

首次您运行该应用程序,新的注册创建在您通知中心。在随后的启动,返回用大气环流模式的最新注册 ID 更新现有注册。与选定的 Android 模拟器,按 f5 键以启动并运行该应用程序。Visual Studio 启动针对 Android 平台上,科尔多瓦生成并部署到应用程序并开始运行的仿真程序 (它还启动仿真器中,如果需要的话)。应用程序加载后,警报后显示应用程序成功地注册 (或更新的注册) 与 Azure 的推式通知。当您添加一个新的项目,onGcmNotification 函数 (所示图 5) 处理传入的消息,当应用程序正在运行,并且在警报中显示的消息。

当应用程序没有运行时,通知最终会在状态栏中。图 6 显示出现 (在左侧) 警报的通知并在状态栏中。

作为警报 (左) 和出现在状态栏中的通知消息
图 6 作为警报 (左) 和出现在状态栏中的通知消息

您可以通过从应用程序发送后右切换测试这种行为。或者,如果没有足够的时间来做到这一点,在 send 方法被调用之前,您可以插入脚本中添加延迟。当您单击状态栏中的通知时,应用程序就被开始。

另一种方式来证明这一点是通过向您的应用程序发送测试通知。

通过发送测试通知排查登记

因为涉及到多个服务和各类登记,它可以难解决推式通知。幸运的是,用于通知集线器的诊断功能已内置到 Visual Studio 2013。 从服务器资源管理器中,展开 Azure,然后通知集线器,您应该会看到您列出的通知集线器。双击此项,您将看到在 Visual Studio 中打开右诊断页面 (请参阅图 7)。此页面包含以下两个选项卡:

  • 测试发送:这允许您撰写并发送邮件使用通知集线器。你可以针对特定的本机设备登记,或在这种情况下,模板注册。当您单击发送,具体通知发送 ; 由通知中心,记录的结果,显示在消息结果。
  • 设备登记:这将枚举通知集线器中目前存在的所有登记。从这个标签,你可以删除注册或更新注册的标记集合。在此选项卡上,您应该看到至少一个注册,刚添加当您开始您的应用程序。

通知中心诊断页
图 7 通知中心诊断页

请记住,当您发送测试通知从 Visual Studio 和应用程序没有运行,则消息显示在状态栏中。已运行该应用程序,将已经被引发警报相反 (如所示图 6)。

您可以找到很多相同的推送通知测试功能在 Azure 管理门户的通知中心选项卡 (manage.windowsazure.com),但它是伟大的能够测试和做一些基本的调试 Visual Studio IDE 中的权利。

简化的通知

若要查看,移动用户现在比以往更期望其设备,以便保持与他们的利益和他们周围什么的最新。您的移动应用程序需要能够通知你的客户,在接近真正的时间,有关您的应用程序提供重要数据的更新程序。在跨平台的应用程序,如科尔多瓦基于的应用程序,处理四个或更多不同的本机推送通知平台可棘手,设置和管理。

它支持基于模板的注册,通知集线器是一个伟大的解决方案,用于向科尔多瓦应用程序发送推式通知。由 PushPlugin 启用在您的应用程序推送功能。结合移动服务的数据存储和身份验证设施,Azure 平台是便于支持科尔多瓦应用程序。有关使用 Azure 支持跨平台的应用程序的详细信息,请参阅蔚蓝的文档主题,"支持多个设备平台从单一移动服务,"在 aka.ms/w7oq0y。不只是 Visual Studio 的极好平台为开发科尔多瓦的应用程序,它也是一个伟大的工具,用于创建和管理 Azure 为您科尔多瓦的应用程序。


Glenn Gailey 是一名程序员,作家和 14 年微软资深人士为 Azure 移动服务、 通知集线器,WCF 数据服务,OData、 ADO.NET 实体框架,SQL Server 复制和 SQL Server CE,创建的文档和示例。联系到他在 glenn.gailey@microsoft.com 或通过 Twitter 在 ggailey777

衷心感谢以下 Microsoft 技术专家对本文的审阅:苏雷什 · Jayabalan、 Mike Jones 和 Piyush 乔希