原文:与众不同 windows phone (10) - Push Notification(推送通知)之推送 Tile 通知, 推送自定义信息

[索引页]
[源码下载]

与众不同 windows phone (10) - Push Notification(推送通知)之推送 Tile 通知, 推送自定义信息

作者:webabcd

介绍
与众不同 windows phone 7.5 (sdk 7.1) 之推送通知

  • 推送 Tile 通知
  • 推送自定义信息

示例
1、推送 Tile 通知
客户端
PushTile.xaml

<phone:PhoneApplicationPage
x:Class="Demo.PushNotification.PushTile"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
shell:SystemTray.IsVisible="True"> <StackPanel Orientation="Vertical">
<Button Name="btnRegister" Content="Get Channel Uri" Click="btnRegister_Click" />
<TextBox Name="txtUrl" />
<TextBlock Name="lblMsg" TextWrapping="Wrap" />
</StackPanel> </phone:PhoneApplicationPage>

PushTile.xaml.cs

/*
* 演示推送 Tile 通知
*
* HttpNotificationChannel - 推送通知 channel
* HttpNotificationChannel.Find(string channelName) - 查找并返回 channel,一个 app 只能有一个 channel
*
* ChannelUri - 推送通知的 channel URI
* ChannelName - channel 的名称
* ConnectionStatus - channel 的连接状态,ChannelConnectionStatus.Connected 或 ChannelConnectionStatus.Disconnected
*
* ChannelUriUpdated - 获取到了 channel URI 后所触发的事件
* ErrorOccurred - 发生异常时所触发的事件
* ConnectionStatusChanged - 连接状态发生改变时所触发的事件
* ShellToastNotificationReceived - 程序运行中如果收到 Toast 是不会显示的,但是会触发此事件。
* 什么叫运行中:程序在前台显示,且调用了 HttpNotificationChannel.Find(channelName)(没有则创建一个),同时 channel 是在连接的状态
* HttpNotificationReceived - 接收到自定义信息通知后所触发的事件(仅在程序运行中才能接收到此信息)
*
* Open() - 打开 channel
* Close() - 关闭 channel
*
* BindToShellToast() - 将此 channel 绑定到 Toast 通知
* BindToShellTile() - 将此 channel 绑定到 Tile 通知,只能引用本地资源
* BindToShellTile(Collection<Uri> baseUri) - 将此 channel 绑定到 Tile 通知,允许引用远程资源(当使用远程图像时,不能是https,要小于80KB,必须30秒内下载完)
* baseUri - 允许引用的远程资源的域名集合(最大 256 个字符)
* IsShellToastBound - 此 channel 是否绑定到了 Toast 通知
* IsShellTileBound - 此 channel 是否绑定到了 Tile 通知
*/ using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls; using Microsoft.Phone.Notification;
using System.Text;
using System.Diagnostics;
using System.Collections.ObjectModel; namespace Demo.PushNotification
{
public partial class PushTile : PhoneApplicationPage
{
public PushTile()
{
InitializeComponent();
} private void btnRegister_Click(object sender, RoutedEventArgs e)
{
// 在当前应用程序中查找指定的 channel
string channelName = "myChannel";
HttpNotificationChannel channel = HttpNotificationChannel.Find(channelName); // 允许引用的远程资源的域名集合
Collection<Uri> allowDomains = new Collection<Uri>();
allowDomains.Add(new Uri("http://www.cnblogs.com/"));
allowDomains.Add(new Uri("http://images.cnblogs.com/")); if (channel == null) // 未发现则创建一个 channel
{
channel = new HttpNotificationChannel(channelName); channel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(channel_ChannelUriUpdated);
channel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(channel_ErrorOccurred); channel.Open(); channel.BindToShellTile(allowDomains);
}
else // 已存在则使用这个已存在的 channel
{
channel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(channel_ChannelUriUpdated);
channel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(channel_ErrorOccurred); if (channel.ConnectionStatus == ChannelConnectionStatus.Disconnected)
channel.Open();
if (!channel.IsShellTileBound)
channel.BindToShellTile(allowDomains); // 获取通知 uri
txtUrl.Text = channel.ChannelUri.ToString();
Debug.WriteLine(channel.ChannelUri.ToString());
}
} void channel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
{
Dispatcher.BeginInvoke(() =>
{
// 获取通知 uri
txtUrl.Text = e.ChannelUri.ToString();
Debug.WriteLine(e.ChannelUri.ToString());
});
} void channel_ErrorOccurred(object sender, NotificationChannelErrorEventArgs e)
{
Dispatcher.BeginInvoke(() => MessageBox.Show(e.Message));
}
}
}

服务端
SendTileNotification.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SendTileNotification.aspx.cs"
Inherits="Web.PushNotification.SendTileNotification" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
通知 url:
<asp:TextBox ID="txtUrl" runat="server"></asp:TextBox>
</div>
<div>
正面 Tile 的标题:
<asp:TextBox ID="txtTitle" runat="server" Text="正面 Tile 的标题"></asp:TextBox>
</div>
<div>
正面 Tile 的背景图地址:
<asp:TextBox ID="txtBackgroundImage" runat="server" Text="http://images.cnblogs.com/xml.gif"></asp:TextBox>
</div>
<div>
正面 Tile 的 Badge:
<asp:TextBox ID="txtCount" runat="server" Text="10"></asp:TextBox>
</div>
<div>
反面 Tile 的标题:
<asp:TextBox ID="txtBackTitle" runat="server" Text="反面 Tile 的标题"></asp:TextBox>
</div>
<div>
反面 Tile 的背景图地址:
<asp:TextBox ID="txtBackBackgroundImage" runat="server" Text="http://images.cnblogs.com/mvpteam.gif"></asp:TextBox>
</div>
<div>
反面 Tile 的内容:
<asp:TextBox ID="txtBackContent" runat="server" Text="反面 Tile 的内容"></asp:TextBox>
</div>
<div>
回应信息:
<asp:TextBox ID="txtMsg" runat="server" TextMode="MultiLine" Rows="20" Columns="100"></asp:TextBox>
</div>
<div>
<asp:Button ID="btnSend" runat="server" Text="发送 Tile 通知" OnClick="btnSend_Click" />
</div>
</form>
</body>
</html>

SendTileNotification.aspx.cs

/*
* 演示服务端如何推送 Tile 通知
*/ using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; using System.Text;
using System.Net;
using System.IO; namespace Web.PushNotification
{
public partial class SendTileNotification : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ } protected void btnSend_Click(object sender, EventArgs e)
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(txtUrl.Text);
request.Method = "POST"; // 构造用于推送 Tile 信息的 xml
string tileMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<wp:Notification xmlns:wp=\"WPNotification\">" +
"<wp:Tile>" +
// "<wp:Tile ID=\"/SecondaryTile.xaml?param=abc\">" + 如果需要更新次要磁贴,则需要配置此 ID 为次要磁贴的导航 URI(不配置,则默认更新应用程序磁贴)
"<wp:BackgroundImage>" + txtBackgroundImage.Text + "</wp:BackgroundImage>" + // 正面 Tile 的背景图地址
"<wp:Count>" + txtCount.Text + "</wp:Count>" + // 正面 Tile 的 Badge
"<wp:Title>" + txtTitle.Text + "</wp:Title>" + // 正面 Tile 的标题
"<wp:BackBackgroundImage>" + txtBackBackgroundImage.Text + "</wp:BackBackgroundImage>" + // 反面 Tile 的背景图地址
"<wp:BackTitle>" + txtBackTitle.Text + "</wp:BackTitle>" + // 反面 Tile 的标题
"<wp:BackContent>" + txtBackContent.Text + "</wp:BackContent>" + // 反面 Tile 的内容
"</wp:Tile> " +
"</wp:Notification>"; /*
// 可以使用如下方式清除磁贴的相关信息,正面 Tile 的背景图不能清除
tileMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<wp:Notification xmlns:wp=\"WPNotification\">" +
"<wp:Tile>" +
"<wp:BackgroundImage></wp:BackgroundImage>" +
"<wp:Count Action=\"Clear\">" + txtCount.Text + "</wp:Count>" +
"<wp:Title Action=\"Clear\">" + txtTitle.Text + "</wp:Title>" +
"<wp:BackBackgroundImage Action=\"Clear\">" + txtBackBackgroundImage.Text + "</wp:BackBackgroundImage>" +
"<wp:BackTitle Action=\"Clear\">" + txtBackTitle.Text + "</wp:BackTitle>" +
"<wp:BackContent Action=\"Clear\">" + txtBackContent.Text + "</wp:BackContent>" +
"</wp:Tile> " +
"</wp:Notification>";
*/ byte[] requestMessage = Encoding.UTF8.GetBytes(tileMessage); // 推送 Tile 信息时的 Http Header 信息
request.ContentLength = requestMessage.Length;
request.ContentType = "text/xml";
request.Headers.Add("X-WindowsPhone-Target", "token");
request.Headers.Add("X-NotificationClass", ""); // 1 - 立即发送;11 - 450秒内发送;21 - 900秒内发送 using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(requestMessage, , requestMessage.Length);
} // 处理 MPNS 的回应信息
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string notificationStatus = response.Headers["X-NotificationStatus"];
string notificationChannelStatus = response.Headers["X-SubscriptionStatus"];
string deviceConnectionStatus = response.Headers["X-DeviceConnectionStatus"]; txtMsg.Text = "Http Status Code: " + response.StatusCode + Environment.NewLine
+ "X-NotificationStatus: " + notificationStatus + Environment.NewLine
+ "X-SubscriptionStatus: " + deviceConnectionStatus + Environment.NewLine
+ "X-DeviceConnectionStatus: " + notificationChannelStatus; // 各个状态的具体描述信息,详见如下地址
// http://msdn.microsoft.com/en-us/library/ff941100(v=vs.92)
}
catch (Exception ex)
{
txtMsg.Text = ex.ToString();
}
}
}
}

2、推送自定义信息
服务端
PushRaw.xaml

<phone:PhoneApplicationPage
x:Class="Demo.PushNotification.PushRaw"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
shell:SystemTray.IsVisible="True"> <StackPanel Orientation="Vertical">
<Button Name="btnRegister" Content="Get Channel Uri" Click="btnRegister_Click" />
<TextBox Name="txtUrl" />
<TextBlock Name="lblMsg" TextWrapping="Wrap" />
</StackPanel> </phone:PhoneApplicationPage>

PushRaw.xaml.cs

/*
* 演示推送自定义信息通知(程序运行中,才能接收到此通知)
*
* HttpNotificationChannel 的具体信息参见 /PushNotification/PushToast.xaml 或 /PushNotification/PushTile.xaml
*/ using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls; using Microsoft.Phone.Notification;
using System.Text;
using System.Diagnostics; namespace Demo.PushNotification
{
public partial class PushRaw : PhoneApplicationPage
{
public PushRaw()
{
InitializeComponent();
} private void btnRegister_Click(object sender, RoutedEventArgs e)
{
// 在当前应用程序中查找指定的 channel
string channelName = "myChannel";
HttpNotificationChannel channel = HttpNotificationChannel.Find(channelName); if (channel == null) // 在当前应用程序中查找指定的 channel
{
channel = new HttpNotificationChannel(channelName); channel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(channel_ChannelUriUpdated);
channel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(channel_ErrorOccurred);
channel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(channel_HttpNotificationReceived); channel.Open();
}
else // 已存在则使用这个已存在的 channel
{
channel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(channel_ChannelUriUpdated);
channel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(channel_ErrorOccurred);
channel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(channel_HttpNotificationReceived); // 获取通知 uri
txtUrl.Text = channel.ChannelUri.ToString();
Debug.WriteLine(channel.ChannelUri.ToString());
}
} void channel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
{
Dispatcher.BeginInvoke(() =>
{
// 获取通知 uri
txtUrl.Text = e.ChannelUri.ToString();
Debug.WriteLine(e.ChannelUri.ToString());
});
} void channel_ErrorOccurred(object sender, NotificationChannelErrorEventArgs e)
{
Dispatcher.BeginInvoke(() => MessageBox.Show(e.Message));
} // 接收到自定义信息通知后所触发的事件(仅在程序运行中才能接收到此信息)
// 什么叫运行中:程序在前台显示,且调用了 HttpNotificationChannel.Find(channelName)(没有则创建一个),同时 channel 是在连接的状态
void channel_HttpNotificationReceived(object sender, HttpNotificationEventArgs e)
{
string msg; using (System.IO.StreamReader reader = new System.IO.StreamReader(e.Notification.Body))
{
msg = reader.ReadToEnd();
} // 显示接收到的自定义信息
Dispatcher.BeginInvoke(() => lblMsg.Text = msg.ToString());
}
}
}

服务端
SendRawNotification.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SendRawNotification.aspx.cs"
Inherits="Web.PushNotification.SendRawNotification" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
通知 url:
<asp:TextBox ID="txtUrl" runat="server"></asp:TextBox>
</div>
<div>
回应信息:
<asp:TextBox ID="txtMsg" runat="server" TextMode="MultiLine" Rows="20" Columns="100"></asp:TextBox>
</div>
<div>
<asp:Button ID="btnSend" runat="server" Text="发送自定义信息通知(Raw Message)" OnClick="btnSend_Click" />
</div>
</form>
</body>
</html>

SendRawNotification.aspx.cs

/*
* 演示服务端如何推送自定义信息通知
*/ using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; using System.Text;
using System.Net;
using System.IO; namespace Web.PushNotification
{
public partial class SendRawNotification : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ } protected void btnSend_Click(object sender, EventArgs e)
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(txtUrl.Text);
request.Method = "POST"; // 构造需要推送的自定义信息
string tileMessage = "i am webabcd"; byte[] requestMessage = Encoding.Default.GetBytes(tileMessage);
// 也可以直接推送字节流
// byte[] requestMessage = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }; // 推送自定义信息时的 Http Header 信息
request.ContentLength = requestMessage.Length;
request.ContentType = "text/xml";
request.Headers.Add("X-NotificationClass", ""); // 3 - 立即发送;13 - 450秒内发送;23 - 900秒内发送 using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(requestMessage, , requestMessage.Length);
} // 处理 MPNS 的回应信息
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string notificationStatus = response.Headers["X-NotificationStatus"];
string notificationChannelStatus = response.Headers["X-SubscriptionStatus"];
string deviceConnectionStatus = response.Headers["X-DeviceConnectionStatus"]; txtMsg.Text = "Http Status Code: " + response.StatusCode + Environment.NewLine
+ "X-NotificationStatus: " + notificationStatus + Environment.NewLine
+ "X-SubscriptionStatus: " + deviceConnectionStatus + Environment.NewLine
+ "X-DeviceConnectionStatus: " + notificationChannelStatus; // 各个状态的具体描述信息,详见如下地址
// http://msdn.microsoft.com/en-us/library/ff941100(v=vs.92)
}
catch (Exception ex)
{
txtMsg.Text = ex.ToString();
}
}
}
}

OK
[源码下载]

与众不同 windows phone (10) - Push Notification(推送通知)之推送 Tile 通知, 推送自定义信息的更多相关文章

  1. 与众不同 windows phone (9) - Push Notification(推送通知)之概述, 推送 Toast 通知

    原文:与众不同 windows phone (9) - Push Notification(推送通知)之概述, 推送 Toast 通知 [索引页][源码下载] 与众不同 windows phone ( ...

  2. 背水一战 Windows 10 (113) - 锁屏: 将 Application 的 Badge 通知和 Tile 通知发送到锁屏, 将 secondary tile 的 Badge 通知和 Tile 通知发送到锁屏

    [源码下载] 背水一战 Windows 10 (113) - 锁屏: 将 Application 的 Badge 通知和 Tile 通知发送到锁屏, 将 secondary tile 的 Badge ...

  3. 背水一战 Windows 10 (109) - 通知(Tile): 按计划显示 tile 通知, 轮询服务端以更新 tile 通知

    [源码下载] 背水一战 Windows 10 (109) - 通知(Tile): 按计划显示 tile 通知, 轮询服务端以更新 tile 通知 作者:webabcd 介绍背水一战 Windows 1 ...

  4. Android Push Notification实现信息推送使用

    本贴在http://www.cnblogs.com/hanyonglu/archive/2012/03/16/2399655.html下略为改动. Apndroid Push Notification ...

  5. (转)在SAE使用Apple Push Notification Service服务开发iOS应用, 实现消息推送

    在SAE使用Apple Push Notification Service服务开发iOS应用, 实现消息推送 From: http://saeapns.sinaapp.com/doc.html 1,在 ...

  6. 推送消息 web push notification

    参考 : https://developers.google.com/web/fundamentals/engage-and-retain/push-notifications/   ( step b ...

  7. iOS上简单推送通知(Push Notification)的实现

    iOS上简单推送通知(Push Notification)的实现 根据这篇很好的教程(http://www.raywenderlich.com/3443/apple-push-notification ...

  8. (转)苹果推送通知服务教程 Apple Push Notification Services Tutorial

    本文译自http://www.raywenderlich.com/.原文由iOS教程团队 Matthijs Hollemans 撰写,经原网站管理员授权本博翻译. 在iOS系统,考虑到手机电池电量,应 ...

  9. 苹果推送通知服务Push Notification探究总结(序)

    刚才发了两篇几个月前写的文档,觉得太敷衍了,想了想,还是来一发实在的. 再者,刚好上周研究了苹果的推送通知服务Push Notification,还是很有心得的,赶紧趁热打铁,记录一下,望与大家谈论下 ...

随机推荐

  1. HDU 1150:Machine Schedule(二分匹配,匈牙利算法)

    Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  2. Shell中的if else语句小演示

    安安静静学习小shell,今天看到if else 喽~ 下面这个脚本是判断用户执行脚本的参数,如果是hello的话,就显示how are you 如果什么都没有,就提示输入 如果参数不是hello,就 ...

  3. ant-学习记录二

    <?xml version="1.0"?> <project name="targetStudy" default="mkdir&q ...

  4. 实战 iTextSharp

    原文 实战 iTextSharp iTextSharp 是用来生成  PDF 的一个组件,在 1998 年夏天的时候,Bruno Lowagie ,iText 的创作者,参与了学校的一个项目,当时使用 ...

  5. WPF Multi-Touch 开发:高级触屏操作(Manipulation)

    原文 WPF Multi-Touch 开发:高级触屏操作(Manipulation) 在上一篇中我们对基础触控操作有了初步了解,本篇将继续介绍触碰控制的高级操作(Manipulation),在高级操作 ...

  6. qrcode 4.0.4 : Python Package Index

    qrcode 4.0.4 : Python Package Index qrcode 4.0.4 Download qrcode-4.0.4.tar.gz QR Code image generato ...

  7. Android开发10.1:UI组件适配器AdapterView(创建ListView,Adapter接口)

    @version:Android4.3 API18 @author:liuxinming 概述               AdapterView继承了ViewGroup,它的本质是容器       ...

  8. PHP - 操作MySQL数据库

    第16章 PHP操作MySQL 学习要点: 1.PHP连接到MySQL 2.增删改查 3.其他常用函数 如果你已经具有了使用PHP.SQL和MySQL的丰富经验,现在就可以把所有这些技术组合在一起.P ...

  9. C#中的正则 Regex类

    转义符的总结: 开始数 …………………………………………………………. 3 )Regex.matches() 提取所有符合要求的字符串 string str=@"绩大于80,则奖励50元.语 ...

  10. BBED的安装及简单的使用方法

    记录下BBED的安装--ORACLE 11.2.0.4下 1.在ORACLE 11G下安装BBED,需要从ORACLE 10G中复制三个包 bbedus.msb               sbbdp ...