windows-phone-8windows-phone-8.1urbanairship.comwnswindows-dev-center

Setting up WNS service for windows phone 8 get error after add <Identity> tag


I am setting up windows phone 8.1 push notification with urbanairship. I have SID and Secret key for my app. But when i do following step mentioned in dev.windows WNS-->Live Service site:

To set your application's identity values manually, open the AppManifest.xml file in a text editor and set these attributes of the element using the values shown here.

my application is stop working. is any one provide me steps for set up WNS in windows phone 8.1 then it helps me a lot, I spend over the week on this and now really frustrating.


Solution

  • I got success with Push Notification in Windows Phone 8.1/ Windows Apps (Universal Apps). I have implemented sending Push Notification to devices from our own Web Service.

    Step 1: Get the Client Secret and Package SID from the dev.windows.com >> Services >> Live Services. You'll need these later in Web Service.

    Step 2: In your Windows App, you have to associate your app with the Store. For that, Right click on project >> Store >> Associate App with the Store. Log in with your Dev account and associate your app. Associating your app with the Store

    Step 3 You'll need a Channel Uri. In the MainPage.xaml, add a Button and a Textblock to get your Channel Uri. XAML Code looks like this:

    <Page
    x:Class="FinalPushNotificationTest.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:FinalPushNotificationTest"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <TextBlock Text="Push Notification" Margin="20,48,10,0" Style="{StaticResource HeaderTextBlockStyle}" TextWrapping="Wrap" />
        <ScrollViewer Grid.Row="1" Margin="20,10,10,0">
            <StackPanel x:Name="resultsPanel">
                <Button x:Name="PushChannelBtn" Content="Get Channel Uri" Click="PushChannelBtn_Click" />
                <ProgressBar x:Name="ChannelProgress" IsIndeterminate="False" Visibility="Collapsed" />
                <TextBlock x:Name="ChannelText" FontSize="22" />
    
            </StackPanel>
        </ScrollViewer>
    </Grid>
    

    Step 4: In the MainPage.xaml.cs page, Add the following code snippet i.e. for the Button Click Event. When you run your app, you'll get the Channel Uri in the Console Window. Note down this Channel Uri, you'll need that in Web Service.

    private async void PushChannelBtn_Click(object sender, RoutedEventArgs e)
        {
            var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
            ChannelText.Text = channel.Uri.ToString();
            Debug.WriteLine(channel.Uri);
        }
    

    Channel Uri

    Step 5: Now You need a Web Service to send push notification to your device. For that Right Click on your project in Solution Explorer. Add >> New Project >> Visual C# >> Web >> ASP.NET Web Application. Click OK, On Template select Empty. After that Add a new Web Form in your Web Application. Name it SendToast. Adding a new Web project to your project Selecting Empty Template for your Web Project Adding Web Form in your Web Application

    Step 6: Now In the SendToast.aspx.cs, you need to implement methods and functions to get the Access Token using Package SID, Client Secret and Channel Uri. Add your Package SID, Cleint Secret, and Channel Uriin respective places. The complete code looks like the following code snippet:

    using Microsoft.ServiceBus.Notifications;
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Json;
    using System.Text;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace SendToast
    {
        public partial class SendToast : System.Web.UI.Page
        {
            private string sid = "Your Package SID";
            private string secret = "Your Client Secret";
            private string accessToken = "";
        [DataContract]
        public class OAuthToken
        {
            [DataMember(Name = "access_token")]
            public string AccessToken { get; set; }
            [DataMember(Name = "token_type")]
            public string TokenType { get; set; }
        }
    
        OAuthToken GetOAuthTokenFromJson(string jsonString)
        {
            using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString)))
            {
                var ser = new DataContractJsonSerializer(typeof(OAuthToken));
                var oAuthToken = (OAuthToken)ser.ReadObject(ms);
                return oAuthToken;
            }
        }
    
        public void getAccessToken()
        {
            var urlEncodedSid = HttpUtility.UrlEncode(String.Format("{0}", this.sid));
            var urlEncodedSecret = HttpUtility.UrlEncode(this.secret);
    
            var body =
              String.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=notify.windows.com", urlEncodedSid, urlEncodedSecret);
    
            var client = new WebClient();
            client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
    
            string response = client.UploadString("https://login.live.com/accesstoken.srf", body);
            var oAuthToken = GetOAuthTokenFromJson(response);
            this.accessToken = oAuthToken.AccessToken;
        }
    
        protected string PostToCloud(string uri, string xml, string type = "wns/toast")
        {
            try
            {
                if (accessToken == "")
                {
                    getAccessToken();
                }
                byte[] contentInBytes = Encoding.UTF8.GetBytes(xml);
    
                WebRequest webRequest = HttpWebRequest.Create(uri);
                HttpWebRequest request = webRequest as HttpWebRequest;
                webRequest.Method = "POST";
    
                webRequest.Headers.Add("X-WNS-Type", type);
                webRequest.Headers.Add("Authorization", String.Format("Bearer {0}", accessToken));
    
                Stream requestStream = webRequest.GetRequestStream();
                requestStream.Write(contentInBytes, 0, contentInBytes.Length);
                requestStream.Close();
    
                HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
    
                return webResponse.StatusCode.ToString();
            }
            catch (WebException webException)
            {
                string exceptionDetails = webException.Response.Headers["WWW-Authenticate"];
                if ((exceptionDetails != null) && exceptionDetails.Contains("Token expired"))
                {
                    getAccessToken();
                    return PostToCloud(uri, xml, type);
                }
                else
                {
                    return "EXCEPTION: " + webException.Message;
                }
            }
            catch (Exception ex)
            {
                return "EXCEPTION: " + ex.Message;
            }
        }
    
        protected void Page_Load(object sender, EventArgs e)
        {
            string channelUri = "Your Channel Uri";
    
            if (Application["channelUri"] != null)
            {
                Application["channelUri"] = channelUri;
            }
            else
            {
                Application.Add("channelUri", channelUri);
            }
    
            if (Application["channelUri"] != null)
            {
                string aStrReq = Application["channelUri"] as string;
                string toast1 = "<?xml version=\"1.0\" encoding=\"utf-8\"?> ";
                string toast2 = @"<toast>
                            <visual>
                                <binding template=""ToastText01"">
                                    <text id=""1"">Hello Push Notification!!</text>
                                </binding>
                            </visual>
                        </toast>";
                string xml = toast1 + toast2;
    
                Response.Write("Result: " + PostToCloud(aStrReq, xml));
            }
            else
            {
                Response.Write("Application 'channelUri=' has not been set yet");
            }
            Response.End();
        }
      }
    }
    

    Run your web application, you'll get the Result OK response if it successfully sends push notification.

    Let me know if you need working sample project. Hope this helps. Thanks!