65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

1.00/5 (1投票)

2016 年 3 月 28 日

CPOL

2分钟阅读

viewsIcon

15143

downloadIcon

568

在本文中,我们将学习如何使用 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 设备发送推送通知,我们需要以下三样东西

  1. 包 SID
  2. 客户端密钥
  3. 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 时,您将在您的应用中收到通知。

© . All rights reserved.