xamarin формы win phone 8.1 фоновые задачи для push-уведомлений не регистрируются

Я пытаюсь зарегистрировать фоновую задачу для приложения Windows Phone 8.1 Silverlight, но не смог этого добиться. Из примеров, которые я видел в Интернете, я не вижу, что я делаю неправильно. В любом случае ниже приведены некоторые снимки настроек, которые я настроил, и фрагменты кода. Если бы кто-нибудь мог, пожалуйста, просветить меня тем, чего мне не хватает, я был бы очень признателен!

Проект Win Phone (WMAppManifest.xml)

Служба уведомлений

Push-уведомление включено

Проект Win Phone (Package.appxmanifest)

Toastable и Lockscreen включены

Конфигурация фоновой задачи

Тип проекта фоновой задачи

Тип фонового проекта

Диспетчер уведомлений WinPhone

Этот класс наследует интерфейс, который используется для вызова событий регистра для концентратора уведомлений, используя зависимость от PCL

using Microsoft.Phone.Notification;
using Microsoft.WindowsAzure.Messaging;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using MyApp.Common.Models;
using MyApp.Interfaces;
using MyApp.Utilities;
using MyApp.WinPhone;
using Windows.ApplicationModel.Background;
using Windows.Data.Xml.Dom;
using Windows.UI.Notifications;

[assembly: Xamarin.Forms.Dependency(typeof(PushNotificationManager))]
namespace MyApp.WinPhone
{
    public class PushNotificationManager : IPushNotificationManager
    {
        private NotificationHub hub;

        private const string TASK_NAME = "NotificationTask";
        private const string TASK_ENTRY_POINT = "MyApp.Background.NotificationTask";

        public PushNotificationManager() { }

        public async Task RegisterDevice()
        {
            try
            {
                var channel = HttpNotificationChannel.Find("NotificationChannel");
                if (channel == null)
                {
                    channel = new HttpNotificationChannel("NotificationChannel");
                    channel.Open();
                    channel.BindToShellToast();
                }

                // Register device
                channel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(NotificationChannel_ChannelUriUpdated);

                // Register for this notification only if you need to receive the notifications while your application is running.
                channel.ShellToastNotificationReceived += new EventHandler<NotificationEventArgs>(NotificationChannel_ShellToastNotificationReceived);
                channel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(NotificationChannel_HttpNotificationReceived);

                // Clean out the background task
                await UnregisterBackgroundTask();
                await RegisterBackgroundTask();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public async Task UnregisterDevice()
        {
            var channel = HttpNotificationChannel.Find("NotificationChannel");

            if (channel != null)
            {
                var hub = new NotificationHub(Utilities.Constants.ApplicationHubName, Utilities.Constants.ApplicationConnectionString);
                await hub.UnregisterAllAsync(channel.ChannelUri.ToString());
                channel.Close();

                // Clean out the background task
                await UnregisterBackgroundTask();
            }
        }

        protected void NotificationChannel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
        {
            RegisterWinDevice(e.ChannelUri.ToString());
        }

        protected void NotificationChannel_ShellToastNotificationReceived(object sender, NotificationEventArgs e)
        {
            try
            {
                //Get title and message

                CreateNotification(title, message);
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }

        protected void NotificationChannel_HttpNotificationReceived(object sender, HttpNotificationEventArgs e)
        {
            try
            {
                //Get title and message

                CreateNotification(title, message);
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }

        private async Task RegisterWinDevice(string channelUri)
        {
            try
            {
                hub = new NotificationHub(Constants.ApplicationHubName, Constants.ApplicationConnectionString);

                var tags = new List<string>() { };
                User user = LocalStorage.GetUserInfo();
                tags.Add(user.Id.ToString());

                var result = await hub.RegisterNativeAsync(channelUri, tags.ToArray());
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void CreateNotification(string title, string message)
        {
            //Show toast notification
        }

        private async Task RegisterBackgroundTask()
        {
            BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder();
            PushNotificationTrigger trigger = new PushNotificationTrigger();

            await BackgroundExecutionManager.RequestAccessAsync();

            // Background tasks must live in separate DLL, and be included in the package manifest
            // Also, make sure that your main application project includes a reference to this DLL
            taskBuilder.TaskEntryPoint = TASK_ENTRY_POINT;
            taskBuilder.Name = TASK_NAME;
            taskBuilder.SetTrigger(trigger);

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

        private async Task<bool> UnregisterBackgroundTask()
        {
            foreach (var iter in BackgroundTaskRegistration.AllTasks)
            {
                IBackgroundTaskRegistration task = iter.Value;
                if (task.Name == TASK_NAME)
                {
                    task.Unregister(true);
                    return true;
                }
            }
            return false;
        }
    }
}

Проект фоновой задачи (NotificationTask)

using System;
using System.Threading.Tasks;
using Windows.ApplicationModel.Background;
using Windows.Data.Xml.Dom;
using Windows.Networking.PushNotifications;
using Windows.UI.Notifications;

namespace MyApp.Background
{
    public sealed class NotificationTask : IBackgroundTask
    {
        public async void Run(IBackgroundTaskInstance taskInstance)
        {
            //Get Raw Notification and show Toast Notification
        }
    }
}

Еще несколько моментов, на которые следует обратить внимание: телефон правильно регистрируется в центре уведомлений Azures, и при запуске приложения или при отправке push-уведомления не возникает никаких ошибок. На панели инструментов "События жизненного цикла" я не вижу фоновую задачу после ее регистрации. Еще несколько снимков экрана с этими точками...

Зарегистрированный телефон

Зарегистрированный телефон Windows

Панель инструментов События жизненного цикла

Событие жизненного цикла без фоновой задачи

И, наконец, одна вещь, которую я заметил, это то, что триггер, который я установил для фоновой задачи при регистрации, возвращает нуль... (может быть, моя ошибка здесь?) Ниже приведено изображение этого:

Нулевой триггер

ОБНОВИТЬ

Обновлен снимок экрана события жизненного цикла, показывающий, что нет фоновой задачи. Также я заметил, добавляю ли я "Системное событие" в Package.appxmanifest и меняю свой триггер на системное событие, когда регистрация фоновой задачи начинает работать...

1 ответ

У меня была такая же проблема..... Но я обновил с 8.0 до 8.1 Silverlight.... Затем я последовал за этим к T, и это исправило мои проблемы: Обновление с 8 до 8.1 SL

Основной проблемой было то, что WMAppManifest.xml НЕ должен проверять push-уведомления. Но Package.appxmanifest ДОЛЖЕН проверить это...

Другие вопросы по тегам