Я хочу выполнить свою собственную функцию, когда push-уведомление получено даже в том случае, если приложение не запущено. И пользователю не нужно нажимать уведомление в панели действий.Выполните некоторую функцию после получения необработанных push-уведомлений от сервера в Window Phone 8.1
В 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
. Но в моем случае я не нахожу любой 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
, когда сырое уведомление является ПРИЕМ даже когда приложение не запущено. Пожалуйста, помогите мне. Заранее спасибо.
Спасибо за ваш ответ. Нужно ли обрабатывать как channel.PushNotificationReceived + = PushNotificationReceived; ?? –
Вам необходимо создать запечатанную SmplBackgroundTask, реализующую IBackgroundTask. А затем создайте объект BackgroundTaskBuilder и установите значение точки TaskEntry этого BackGroundTaskBuilder, указывающего вашу созданную SmplBackgroundTask. После этого назначьте PushNotificationTrigger тоже. Вот пример кода из https://code.msdn.microsoft.com/windowsapps/Raw-notifications-sample-3bc28c5d#content – ssakash
См. Отредактированную версию. Я редактировал вопрос. Я сделал, как вы сказали, но моя фоновая задача не регистрируется. –