信息
您所需的主题如下所示。但此主题未包含在此库中。

设置您的应用以接收 Windows Phone 8 的推送通知

2014/6/18

适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

若要使用 Microsoft 推送通知服务,您必须将 Windows Phone 应用设置为从 Microsoft 推送通知服务接收推送通知。Windows Phone 中的 Microsoft 推送通知服务是一项致力于达到最佳结果的异步服务,它可为第三方开发人员提供一个通道,以采用高效节能的方法将数据从云服务发送到 Windows Phone 应用。若要查看实现接收推送通知的示例代码,请参阅如何发送和接收 Windows Phone 8 的 Toast 通知如何发送和接收 Windows Phone 8 的磁贴通知如何发送和接收 Windows Phone 8 的 Raw 通知

若要接收推送通知,您的客户端 Windows Phone 应用必须:

  • 符合 Windows Phone 的应用认证要求中的“推送通知应用”一节和Windows Phone 的应用策略的第 2.9 节中列出的要求。

  • 打开一个推送通道(如果它尚不存在),或者连接到一个现有的推送通道。如果您的应用在之前的应用实例中创建了推送通道,则可能会存在一个推送通道。如果推送通道绑定到磁贴或 Toast 通知,则仅在应用退出之后继续存在推送通道,这样,即使该应用未运行,也仍然可以接收这些通知。

  • 使用 Raw 通知时,会在该应用未运行时移除推送通道。需要持续存在的推送通道的应用(例如 VoIP 应用)应该通过调用 BindToShellTile()BindToShellToast() 将该推送通道绑定到 ShellTileShellToast。有关创建 VoIP 应用的详细信息,请参见 Windows Phone 8 的 VoIP 应用

  • 如果您想接收 Toast 通知,则应该调用 BindToShellToast() 方法将通道绑定到 Toast 通知。

  • 如果您想接收磁贴通知,则将通道绑定到磁贴通知,方法是:调用 BindToShellTile() 方法以访问设备上的本地资源或调用 BindToShellTile(Collection<Uri>) 方法以访问远程资源。若要访问远程资源,您必须提供从中访问远程图像的所允许域的集合。集合中的每个 URI 都限制为 256 个字符。

  • 注册您要接收的事件。所有应用都应该注册 ChannelUriUpdated 事件,防止推送通知 URI 发生更改。 即使您已打开了一个通道,也应该注册 ChannelUriUpdated 事件,防止 URI 发生更改。

    所有应用都应该注册 ErrorOccurred 事件以处理任何错误。

    使用 Raw 通知的应用必须实现 HttpNotificationReceived 事件以接收通知中的 Raw 数据。

    如果您的应用已在运行,则忽略 Toast 通知,除非您注册 ShellToastNotificationReceived 事件。然后,您的应用可以决定它希望响应 Toast 通知的方式。

  • 每次您的应用启动时,您都应该将 URI 从推送通道传递给发出推送通知的云服务。还建议您将设备 ID 传递到云服务以便云服务可以跟踪哪些设备分配了 URI。如果 URI 发生更改,则云服务可以将旧 URI 替换为该设备 ID。Windows Phone 不提供完成此操作的框架,因为大多数情况下应用和云服务都已经拥有其自己的协议,它们使用这些协议彼此进行通信。

    与云服务进行通信的最佳做法包括:

    • 应用应该对其相应的云服务进行身份验证。

    • 应用应该在向其相应的云服务发送 URI 之前对其通知通道 URI 进行加密。

    • 如果您的云服务将使用 Windows Phone OS 7.0 中不存在的通知属性,那么您应将 OS 版本信息传递至您的云服务,以便云服务可以为 Windows Phone OS 7.0 客户端正确地降级通知。

    • 云服务应该验证从其相应应用接收的通知通道 URI 并采用安全方式进行存储。

    • 当启动应用中的会话时,通知通道 URI 应该始终发送到其相应的云服务。

    • 云服务应该拥有一个可以发送到其相应应用的状态代码,该代码将触发应用创建新的通知通道 URI。

  • 注册 ConnectionStatusChanged 事件。通过监视 Microsoft 推送通知服务连接的状态,通知功能可能会适当降低。

  • 如果用户通过更改应用中的设置关闭了通知,如Windows Phone 的应用策略的第 2.9 节中所述,则您应该确保使用 Close() 方法来关闭推送通道。

  • 处理可能发生的任何异常。有关可能异常的列表,请参阅以下部分。

通过 HttpNotificationChannel 对象的 ErrorOccurred 事件处理程序回调,可以返回以下错误。

错误

描述

PushErrorTypeChannelOpenFailed

该通道不存在,因此无法打开。 重新尝试打开该通道。

PushErrorTypeMessageBadContent

在磁贴通知负载中指定了远程 URL 并且不符合以下条件之一:1) 它不是 http://,2) 主机名超过 256 个字符,3) URL 超过 2055 个字符,4) 在所允许的域集合中未指定域。

Toast 通知负载中 <Param> 标记的值超过 256 个字符的限制。

PushErrorTypeNotificationRateTooHigh

目前传入通知的速率太高。 降低传入通知的速率以避免丢弃消息。

PushErrorTypePayloadFormatInvalid

XML 负载包含无效或格式不正确的 XML,或者标头中指定的通知类型与使用的负载类型不匹配。 该通道已关闭。 检查您的 XML 负载,看是否有错误,重新打开该通道以获得新的 URI。

PushErrorTypePowerLevelChanged

已弃用该项,因为推送客户端不再基于任何电源状态采取任何操作。

PushErrorTypeUnknown

发生内部错误,无法恢复。 可能需要重启设备。

以下错误可能会针对 HttpNotificationChannel 对象 API 调用返回 InvalidOperationException

错误

描述

PushNotificationTileUriBindFailed

在所允许的域集合中指定了远程 URL 并且不符合以下条件之一:1) 它不是 http://,2) 主机名超过 256 个字符,3) URL 超过 2055 个字符。

PushNotificationChannelBindFailed

BindToShellTileBindToShellToast 失败。 重新尝试绑定。

PushNotificationChannelBindingExists

BindToShellTileBindToShellToast 失败,因为它已绑定到该通道。 重新绑定之前,请检查 IsShellToastBoundIsShellTileBound 属性或者 UnbindToShellToastUnbindToShellTile

PushNotificationChannelExists

打开失败,因为该通道已打开。 您可以通过调用 Find 方法找到一个打开的通道。

PushNotificationChannelNotOpened

该通道尚未打开。 尝试该操作之前,必须打开该通道。

PushNotificationChannelOpenFailed

该通道不存在,因此无法打开。 重新尝试打开该通道。

PushNotificationChannelQuotaExceeded

该设备上已打开了最大数量的通道。 必须先删除一个通道,然后才能打开一个新通道。

PushNotificationChannelServerUnavailable

推送客户端服务暂时不可用。 稍后重试该操作。

ShellInvalidInterval

指定的间隔不允许。 有关所允许的间隔,请查看文档。

ShellInvalidRemoteImageUri

指定的远程图像 URI 无效。 只允许 JPG 或 PNG 文件的格式良好的 HTTP URI。 不允许 HTTPS 和其他 URI 类型。

ShellInvalidUri

指定的本地图像 URI 无效。 只允许格式正确的 JPG 或 PNG 文件的本地 URI。

警告说明警告:

用于启用此功能的 API 仅在具有 Windows Phone 8 Update 3(操作系统版本号 8.0.10492)或更高版本的设备上可用。在尝试使用此功能之前,您必须检查设备的操作系统版本。

如果用户已在其手机上启用节电模式功能,且电池低于使节电模式处于活动状态的最小电量阈值,将禁用推送通知的接收以节省电源。如果您的应用很大程度上依赖于推送通知,建议您检测何时启用节电模式,并警告用户当节电模式处于活动状态时将不会收到推送通知。

若要检测何时启用节电模式,您必须检测 PowerManager.PowerSavingModeEnabled 属性。因为此属性仅可用于运行 Windows Phone 8 Update 3 的设备,因此您必须在检查设备操作系统版本后通过反射访问此属性。以下示例向您显示了如何检测节电模式当前是否处于启用状态。


using Windows.Phone.System.Power;

public void CheckBatterySaverState()
{
    // The minimum phone version that supports the PowerSavingModeEnabled property
    Version TargetVersion = new Version(8, 0, 10492);

    if (Environment.OSVersion.Version >= TargetVersion) 
    {
        // Use reflection to get the PowerSavingModeEnabled value
        bool powerSaveOn = (bool)
            typeof(PowerManager).GetProperty("PowerSavingModeEnabled").GetValue(null, null);

        if (powerSaveOn)
        {
            MessageBox.Show("Battery Saver enabled. This app won’t receive notifications when Battery Saver is active.");
        }
    }
}

显示: