使用 WNS 发送 Windows 通用应用中的推送通知





1.00/5 (1投票)
在本文中,我们将学习如何使用 WNS 在 Windows 通用应用中发送推送通知。
引言
Windows Phone 8.1 中推送通知的实现方式与 Windows Phone 8 完全不同。因此,我们将在下面了解如何在 Windows 8.1 设备上接收通知。要接收推送通知,我们需要一个客户端和一个服务器。客户端是接收通知的设备,服务器是向客户端发送通知的设备。我们将使用 Windows 通用应用创建客户端,并使用控制台应用程序创建服务器。
客户端(Windows 通用应用)
创建一个新项目,例如“空白应用(通用应用)”,并为其指定任何名称。
首先需要将您的应用与 Windows 应用商店关联。因此,请在您的开发者帐户中注册您的应用 此处。在应用商店注册应用后,在解决方案资源管理器中右键单击您的项目,然后单击“商店”->“将应用与商店关联...”。
您将看到以下屏幕
登录后,您将看到手机号码验证屏幕。手机号码验证通过后,您将获得已在您的开发者帐户中注册的所有应用的列表。选择应用名称,然后单击“下一步”按钮。
创建通道并生成 URI。此 URI 对于任何设备都是唯一的。WNS 将向此 URI 发送通知。我们可以将其称为设备令牌或设备 ID。
string notificationUrl;
var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
notificationUrl= channel.Uri.ToString();
它将由客户端应用本身生成,我们需要将此 URI 提供给服务器,因为服务器将使用此 URI 发送通知。
服务器(控制台应用程序)
要向 Windows 8.1 设备发送推送通知,我们需要以下三样东西
- 包 SID
- 客户端密钥
- URI
您将从您的 Windows 开发者帐户中获取包 SID 和客户端密钥。在您的开发者帐户中,转到左侧导航栏中的“服务”->“推送通知”。然后,单击“实时服务站点”。
您将在此处获得包 SID 和客户端密钥。
URI 将由客户端应用生成,我们已经了解了这一点。
创建一个控制台项目,并在其中编写以下代码。
class Program
{
private static string secret = "Client secret";
private static string SID = "Package SID";
private static OAuthToken _token;
private static string XmlToastTemplate = @"<toast launch="""">
<visual lang=""en-US"">
<binding template=""ToastText01"">
<text id=""1"">Test message</text>
</binding>
</visual>
</toast>";
private static Uri accesTokenuri = new Uri("https://login.live.com/accesstoken.srf");
static void Main(string[] args)
{
if (_token == null)
{
CreateToken();
}
var message = String.Empty;
Console.WriteLine("Enter toast message");
message = Console.ReadLine();
Console.WriteLine("Enter device uri");
string uriWithToken = Console.ReadLine();
var wc = HttpWebRequest.Create(uriWithToken) as HttpWebRequest;
wc.Method = "POST";
wc.Headers.Add("X-WNS-Type", "wns/toast");
wc.Headers.Add("X-WNS-RequestForStatus", "true");
wc.Headers.Add("Authorization", String.Format("Bearer {0}", _token.AccessToken));
wc.ContentType = "text/xml";
var byteContent = Encoding.UTF8.GetBytes(XmlToastTemplate);
using (var requestStream = wc.GetRequestStream())
{
requestStream.Write(byteContent, 0, byteContent.Length);
}
using (var response = wc.GetResponse() as HttpWebResponse)
{
if (response != null)
{
var statusCode = response.StatusCode;
Console.WriteLine(statusCode);
}
}
}
/// <summary>
///
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
private static OAuthToken GetOAuthJSON(string json)
{
using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
{
var ser = new DataContractJsonSerializer(typeof(OAuthToken));
var oAuthToken = (OAuthToken)ser.ReadObject(ms);
return oAuthToken;
}
}//GetOAuthJSON
private static void CreateToken()
{
var encSid = WebUtility.UrlEncode(SID);
var encSecret = WebUtility.UrlEncode(secret);
var body =
String.Format("grant_type=client_credentials&client_id={0}&
client_secret={1}&scope=notify.windows.com",
encSid, encSecret);
var wb = new WebClient();
wb.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
var response = wb.UploadString(accesTokenuri, body);
_token = GetOAuthJSON(response);
}//CreateToken
[DataContract]
class OAuthToken
{
[DataMember(Name = "access_token")]
public string AccessToken { get; set; }
[DataMember(Name = "token_type")]
public string TokenType { get; set; }
}
}
当您运行控制台应用并传递正确的 URI 时,您将在您的应用中收到通知。