在Window Phone 8.1中从服务器接收到原始推送通知后,执行一些function

即使应用程序未运行,我也希望在收到推送通知时执行自己的function。 而且用户不需要点击操作栏中的通知。

BackgroundTask.cs我有下面的代码片段:

 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注册后台任务的代码:

 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必须被注册。 但在我的情况下,我没有find任何注册的BackgroundTask

在这里输入图像说明

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

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

从webserivce我发送像这样的原始通知:

 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 ,即使应用程序没有运行。 请帮帮我。 提前致谢。

Solutions Collecting From Web of "在Window Phone 8.1中从服务器接收到原始推送通知后,执行一些function"