Kishor Bikram Oli
Kishor Bikram Oli

Reputation: 1828

Execute some function after raw push notifications is received from server in Window Phone 8.1

I want to execute my own function when a push notification is received even when the app is not running. And the user doesn't need to click the notification in action bar.

In the BackgroundTask.cs I have the following code snippet:

namespace BackgroundTasks
{
public sealed class SampleBackgroundTask : IBackgroundTask
{
    public void Run(IBackgroundTaskInstance taskInstance)
    {
        ApplicationDataContainer settings = ApplicationData.Current.LocalSettings;
        string taskName = taskInstance.Task.Name;
        Debug.WriteLine("Background " + taskName + " starting...");

        RawNotification notification = (RawNotification)taskInstance.TriggerDetails;
        settings.Values[taskName] = notification.Content;

        Debug.WriteLine("Background " + taskName + " completed!");
    }
}
}

This is my code to register background task with PushNotificationTrigger:

private async void RegisterBackgroundTask()
    {

        BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder();
        PushNotificationTrigger trigger = new PushNotificationTrigger();


        taskBuilder.SetTrigger(trigger);

        taskBuilder.TaskEntryPoint = "BackgroundTasks.SampleBackgroundTask";
        taskBuilder.Name = "SampleBackgroundTask";

        try
        {
            BackgroundTaskRegistration task = taskBuilder.Register();
        }
        catch (Exception ex)
        {
        }
    }

enter image description here

I have set all the necessary things in Package.appmanifestAfter the RegisterBackgroundTask is executed it is supposed that the BackgroundTask must be registered. But in my case I don't find any BackgroundTask registered:

enter image description here

Following is the code snippet to get the Channel Uri:

 private async void OpenChannelAndRegisterTask()
    {
        try
        {
          PushNotificationChannel channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
          string uri = channel.Uri;
          RegisterBackgroundTask();
        }
        catch (Exception ex)
        {
        }
    }

And from the webserivce I'm sending Raw notifications like this:

namespace SendToast
{

public partial class SendToast : System.Web.UI.Page
{
    private string sid = "PACKAGE SID";
    private string secret = "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/raw")
    {
        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 = "https://hk2.notify.windows.com/?token=AwYAAAAL4AOsTjp3WNFjxNFsXmFPtT5eCknoCeZmZjE9ft90H2o7xCOYVYZo7o10IAl6BpK9wTxpgIKIeF0TGF2GJZhWAExYd7qEAIlJQNvApQ3V7SA36%2brEow%2bN3NwVDGz4UI%3d";

        if (Application["channelUri"] != null)
        {
            Application["channelUri"] = channelUri;
        }
        else
        {
            Application.Add("channelUri", channelUri);
        }

        if (Application["channelUri"] != null)
        {
            string aStrReq = Application["channelUri"] as string;
            string rawMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
            "<root>" +
                "<Value1>" + "Hello" + "<Value1>" +
                "<Value2>" + "Raw" + "<Value2>" +
            "</root>";
            Response.Write("Result: " + PostToCloud(aStrReq, rawMessage));
        }
        else
        {
            Response.Write("Application 'channelUri=' has not been set yet");
        }
        Response.End();
    }
}
}

I just want to trigger my BackgroundTask when raw notification is received even when the app is not running. Please help me. Thanks in advance.

Upvotes: 2

Views: 1084

Answers (1)

ssakash
ssakash

Reputation: 630

Try triggering background task by using raw notification. You have to register your background task with a PushNotificationTrigger. Here is the Documentation link.

Upvotes: 2

Related Questions