Уведомления Windows Phone 8 и фоновые задачи

Я искал официальные форумы, документацию и все другие места, но не смог найти конкретного ответа.

В. Может ли приложение в Windows Phone 8 отвечать на push-уведомление и выполнять задачу, находясь в фоновом режиме?

Насколько я понимаю, для уведомлений всплывающих окон и плиток, когда приложение не находится на переднем плане, нет никаких хуков, чтобы оно могло отвечать на входящее сообщение.

Я думаю, что «необработанные уведомления» - правильный выбор для этого, поскольку мне не нужно обновлять плитку приложения или даже показывать всплывающее уведомление. Но мне не удалось найти пример или в документации, могу ли я это сделать.

Я нашел несколько ссылок, в которых говорится об этом для приложений магазина Windows, но я хочу узнать, можно ли это сделать для Windows Phone 8.

Я проверил эту другую ветку,

Фоновая задача Windows Phone 8 с уведомлениями

Где один из ответов предполагает, что Whatsapp действительно имеет для этого взлом, чтобы загружать сообщения после получения push-уведомления. Итак, ответ на мой вопрос - НЕТ?


person Kumar Bibek    schedule 13.01.2014    source источник
comment
У меня такая же проблема. Но как я получаю всплывающие уведомления от Bing News и даже не использую их приложение? Если я могу получать уведомления из фоновой задачи приложения Bing News, то теоретически оно должно работать и с моим кодом.   -  person Scott Nimrod    schedule 03.06.2014


Ответы (3)


Это изменилось в Windows Phone 8.1. Из Обзор необработанных уведомлений (приложения среды выполнения Windows)

Получение необработанного уведомления

Есть два пути, с помощью которых ваше приложение может получать необработанные уведомления:

  • Через события доставки уведомлений во время работы вашего приложения.
  • Через фоновые задачи, запускаемые необработанным уведомлением, если вашему приложению разрешено запускать фоновые задачи.

Приложение может использовать оба механизма для получения необработанных уведомлений. Если приложение реализует как обработчик событий доставки уведомлений, так и фоновые задачи, которые запускаются необработанными уведомлениями, событие доставки уведомлений будет иметь приоритет при запуске приложения.

  • Если приложение запущено, событие доставки уведомления будет иметь приоритет над фоновой задачей, и приложение получит первую возможность обработать уведомление.
  • Обработчик события доставки уведомления может указать, установив для свойства PushNotificationReceivedEventArgs.Cancel значение true, что необработанное уведомление не должно передаваться в его фоновую задачу после выхода из обработчика. Если для свойства Cancel установлено значение false или не задано (значение по умолчанию false), необработанное уведомление запустит фоновую задачу после того, как обработчик событий доставки уведомления выполнит свою работу.
person David Hayes    schedule 12.09.2014
comment
Хотя я этого не пробовал, в документации ясно сказано, что теперь это возможно. Итак, я меняю принятый ответ, полагаясь исключительно на то, что вы объяснили, а также после ссылки на ссылку, которую вы разместили. Спасибо. :) - person Kumar Bibek; 16.09.2014

Ответ на ваш вопрос не совсем «НЕТ», и вы правы, WhatsApp использует для этого взлом, WhatsApp иногда использует AudioAgent, так как им разрешено работать в фоновом режиме,

Я не знаю, как именно они это делают, я тоже ищу тот же ответ, давайте посмотрим, найду ли я что-нибудь, опубликую здесь

person maxchirag    schedule 17.02.2014
comment
Спасибо за Ваш ответ. Я подожду еще некоторое время, чтобы увидеть, сможем ли мы получить более конкретный ответ, иначе пока приму ваш. - person Kumar Bibek; 26.02.2014

Вот полное руководство по получению push-уведомлений в фоновом режиме для Windows Phone 8.1:

  1. Получите URI канала push-уведомлений:

    PushNotificationChannel _channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
    
    string ChannelUri = _channel.Uri;
    

Убедитесь, что вы действительно получили URI, зарегистрировав его. Сохраните URI и запускайте его при каждом запуске приложения, поскольку URI обновляется довольно часто.

  1. Создайте проект компонента среды выполнения Windows в своем решении: щелкните правой кнопкой мыши решение -> Добавить -> Новый проект -> выберите «Компонент среды выполнения Windows (Windows Phone)». Назовите этот проект «Задачи» или как хотите.

  2. Создайте новый класс, расширяющий IBackgroundTask внутри вашего вновь созданного проекта. Я назвал свой "NotificationReceiver":

    using Windows.ApplicationModel.Background;
    
    namespace Tasks {
        public sealed class NotificationReceiver : IBackgroundTask {
            public void Run(IBackgroundTaskInstance taskInstance) {
                // TODO: implement your task here
            }
        }
    }
    

Ваша задача будет реализована здесь внутри функции «Выполнить».

  1. Укажите ссылку на компонент среды выполнения в основном проекте: щелкните свой проект Windows Phone -> щелкните правой кнопкой мыши «Ссылки» -> Добавить ссылку -> Отметьте компонент среды выполнения и нажмите ОК.

  2. Отредактируйте манифест приложения: дважды щелкните манифест пакета -> Объявления -> добавьте «Местоположение» и «Push-уведомление» к поддерживаемым типам задач, добавьте имя класса фоновой задачи в точку входа: мой называется «Tasks.NotificationReceiver». Сохраните изменения.

  3. Отменяйте регистрацию и регистрируйте фоновую задачу каждый раз при запуске приложения. Я даю полное решение, просто вызовите setupBackgroundTask ():

    private void setupBackgroundTask() {
        requestAccess();
        UnregisterBackgroundTask();
        RegisterBackgroundTask();
    }
    
    private void RegisterBackgroundTask() {
        BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder();
        PushNotificationTrigger trigger = new PushNotificationTrigger();
        taskBuilder.SetTrigger(trigger);
    
        taskBuilder.TaskEntryPoint = "Tasks.NotificationReceiver";
        taskBuilder.Name = "pushTask";
    
        try {
            BackgroundTaskRegistration task = taskBuilder.Register();
            Logger.log("TASK REGISTERED");
        } catch (Exception ex) {
            Logger.log("FAILED TO REGISTER TASK");
            UnregisterBackgroundTask();
        }
    }
    
    private bool UnregisterBackgroundTask() {
        foreach (var iter in BackgroundTaskRegistration.AllTasks) {
            IBackgroundTaskRegistration task = iter.Value;
            if (task.Name == "pushTask") {
                task.Unregister(true);
                Logger.log("TASK UNREGISTERED");
                return true;
            }
        }
        return false;
    }
    
    private async void requestAccess() {
        BackgroundAccessStatus backgroundStatus = await BackgroundExecutionManager.RequestAccessAsync();
    }
    
  4. Получите объект RawNotification внутри своей задачи:

    RawNotification notification = (RawNotification) taskInstance.TriggerDetails;
    
person Robert K.    schedule 09.03.2017