在Window Phone 8.1中从服务器收到原始推送通知后,执行一些功能 [英] Execute some function after raw push notifications is received from server in Window Phone 8.1

查看:52
本文介绍了在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.

BackgroundTask.cs中,我有以下代码片段:

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!");
    }
}
}

这是我向PushNotificationTrigger注册后台任务的代码:

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)
        {
        }
    }

我已经在Package.appmanifest中设置了所有必要的内容.RegisterBackgroundTask执行后,假定必须注册BackgroundTask.但就我而言,我找不到任何已注册的BackgroundTask:

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:

以下是获取Channel Uri的代码段:

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

并且从网络服务中,我正在发送Raw通知,如下所示:

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();
    }
}
}

我只想在收到原始通知时触发我的BackgroundTask,即使该应用程序未运行也是如此.请帮我.预先感谢.

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.

推荐答案

尝试通过使用原始通知来触发后台任务.您必须使用 PushNotificationTrigger 注册后台任务.这是文档链接.

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

这篇关于在Window Phone 8.1中从服务器收到原始推送通知后,执行一些功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆