1

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

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

Notification Service

Push Notification enabled

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

Toastable and Lockscreen enabled

Background task configuration

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

Background project type

менеджер 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 уведомления ступицей и нет никаких ошибок, брошенные при запуске приложения или когда я посылаю толчок уведомление. На панели инструментов Lifecycle Events Я не вижу фоновой задачи после ее регистрации. Некоторые более снимки экрана с этими точками ...

зарегистрированного телефона

Registered windows phone

Lifecycle События Панель

Lifecycle event no background task

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

Null Trigger

UPDATE

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

ответ

0

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

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

Смежные вопросы