模板

模板可让客户端应用程序指定它想要接收的确切通知格式。 使用模板,应用可以实现几个不同的优点,其中包括:

  • 与平台无关的后端。

  • 个性化通知。

  • 客户端版本独立性。

  • 轻松本地化。

本部分提供两个深入的示例,介绍如何使用模板跨平台向所有设备发送与平台无关的通知,以及介绍如何针对每台设备对广播通知进行个性化设置。

使用模板跨平台

发送推送通知的标准方法是向平台通知服务(WNS、APNS)发送要传出的每个通知的特定负载。 例如,要向 APNS 发送警报,负载将是以下格式的 Json 对象:

{“aps”: {“alert” : “Hello!” }}

若要在Windows Microsoft Store应用程序上发送类似的 Toast 消息,有效负载如下所示:

<toast>
  <visual>
    <binding template=\"ToastText01\">
      <text id=\"1\">Hello!</text>
    </binding>
  </visual>
</toast>

可以为 MPNS (Windows Phone) 和 GCM (Android) 平台创建类似的负载。

此要求将强制应用后端针对每个平台生成不同的负载,并有效地使后端负责应用的表示层部分。 某些考虑因素包括本地化和图形布局(尤其针对 Windows 应用商店应用,其中包含不同磁贴类型的通知)。

使用通知中心模板功能,客户端应用可以创建称为模板注册的特殊注册,其中除了包含标记集外,还包含一个模板。 在前面的有效负载示例中,唯一与平台无关的信息就是实际警报消息 (Hello!)。 模板是一组指令,指示通知中心如何针对该特定客户端应用的注册来设置与平台无关的消息的格式。 在前面的示例中,与平台无关的消息是单个属性:message = Hello!

下图演示了上述过程:

Templates

iOS客户端应用注册的模板如下所示:

{“aps”:{“alert”:”$(message)”}}

Windows Microsoft Store客户端应用的类似模板为:

<toast>
  <visual>
    <binding template=\"ToastText01\">
      <text id=\"1\">$(message)</text>
    </binding>
  </visual>
</toast>

请注意,实际消息将替换为表达式 $(message)。 每当通知中心向此特定注册发送消息时,此表达式就会指示通知中心生成此模板后面的消息。

客户端应用程序可以创建多个注册,以便使用多个模板;例如,警报消息的模板和磁贴更新的模板。 客户端应用程序还可以混合使用本机注册(不带模板的注册)和模板注册。

注意

通知中心为每个注册发送一个通知,而不考虑它们是否属于同一客户端应用。 可以使用此行为将与平台无关的通知转换成其他通知。 例如,可以将发送到通知中心的同一条与平台无关的消息无缝地转换成 toast 警报和磁贴更新,而无需让后端知道这一情况。 请注意,如果在短时间内发送多个通知,某些平台(例如 iOS)可能会将这些通知合并发送到同一台设备。

使用模板进行个性化设置

使用模板的另一个优点就是能够使用通知中心对通知执行基于注册的个性化设置。 例如,假设某个天气应用需要显示一个磁贴,其中提供特定地点的天气情况。 用户可以选择摄氏度或华氏度,以及一天或五天的天气预报。 使用模板,每个客户端应用安装可以注册所需的格式(1 天摄氏度、1 天华氏度、5 天摄氏度、5 天华氏度),并让后端发送一条消息,其中包含填充这些模板所需的全部信息(例如,使用摄氏度和华氏度的五天天气预报)。

使用摄氏温度的一天天气预报模板如下所示:

<tile>
  <visual>
    <binding template="TileWideSmallImageAndText04">
      <image id="1" src="$(day1_image)" alt="alt text"/>
      <text id="1">Seattle, WA</text>
      <text id="2">$(day1_tempC)</text>
    </binding>  
  </visual>
</tile>

发送到通知中心的消息包含以下属性:

  • Day1_image

  • Day1_tempC

  • Day1_tempF

  • Day2_image

  • Day2_tempC

通过使用此模式,后端只需发送一条消息,而不必为应用用户存储特定的个性化选项。 下图演示了此方案:

Templates

如何注册模板

有关如何注册模板的详细信息,请参阅 注册管理

模板表达式语言

模板不能包含字符串。 它们仅限于 XML 或 JSON 文档。 此外,只能在特定位置放置表达式;例如,对于 XML 放置节点属性或值,对于 JSON 放置字符串属性值。

例如,下面所示不是有效的 XML 模板:

<tile>
  <visual>
    <binding $(property)>
      <text id="1">Seattle, WA</text>
    </binding>  
  </visual>
</tile>

如以下部分所述,在使用串联时,表达式必须用大括号包装。 例如:

<tile>
  <visual>
    <binding template="ToastText01">
      <text id="1">{'Hi, ' + $(name)}</text>
    </binding>  
  </visual>
</tile>

JSON 中的类似代码如下所示:

{"aps":{"alert":"{'Hi, ' + $(name)}"}}

下表显示了模板中允许使用的语言:

表达式 说明

$(prop)

对具有给定名称的事件属性的引用。 属性名称不区分大小写。 此表达式将解析为属性的文本值,如果该属性不存在,则解析为空字符串。

$(prop, n)

如上所述,但文本在 n 个字符处显式剪裁,例如 $(title, 20) 将标题属性的内容剪辑为 20 个字符。

.(prop, n)

同上,但会在剪切后的文本后面添加三个点作为后缀。 剪切后的字符串以及后缀的总大小不超过 n 个字符。 .(title, 20) 具有“这是标题行”的输入属性,结果是 标题。...

%(prop)

$(name)类似于输出是 URI 编码的。

#(prop)

在 JSON 模板中使用(例如,用于 iOS 和 Android 模板)。

此函数的工作方式与 $(prop) 之前指定的完全相同,除非在 JSON 模板中使用时 (例如 Apple 模板) 。 在本例中,如果此函数未被“{','}” (括起来, ‘myJsonProperty’ : ‘#(name)’)则计算结果为 Javascript 格式的数字,例如, regexp: (0|([1-9][0-9]*))(\.[0-9]+)?((e|E)(+|-)?[0-9]+)?输出 JSON 为数字。

例如, ‘badge : ‘#(name)’ 变为 ‘badge’ : 40 (而不是 ‘40‘) 。

‘text’ or “text”

一个文本。 文本包含以单引号或双引号括住的任意文本。

expr1 + expr2

用于将两个表达式联接成单个字符串的串联运算符。

表达式可以采用上述任一格式。

使用连接时,必须使用 {} 括住整个表达式。 例如,{$(prop) + ‘ - ’ + $(prop2)}