Обработка локальных уведомлений касанием Xamarin Forms iOS - PullRequest
0 голосов
/ 08 сентября 2018

Я создал приложение на формах Xamarin, в котором я планирую локальные уведомления в PCL через плагин с именем Plugin.Notifications. Но я хотел знать, входит ли пользователь в приложение через уведомление или нет.

Я попытался проверить, присутствует ли UIApplication.LaunchOptionsLocalNotificationKey в словаре параметров запуска или нет, но словарь параметров запуска всегда равен нулю.

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

Я не могу найти причину сбоя.

вот что я делаю в методе ReceivedLocalNotification.
Я устанавливаю значение bool через DependencyService.

 public override void ReceivedLocalNotification(UIApplication application, UILocalNotification notification)
    {
        NSUserDefaults.StandardUserDefaults.Init();
        DependencyService.Get<INotificationTap>().SetNoitificationTap(true);
    }

Обработка службы зависимостей

[assembly: Xamarin.Forms.Dependency(typeof(NotificationTapIOS))]
namespace abc.iOS
{
    public class NotificationTapIOS:NSObject,INotificationTap
    {
        public bool GetNotificationTap()
       {
           return NSUserDefaults.StandardUserDefaults.BoolForKey("notificationTapKey");
       }

       public void SetNoitificationTap(bool isNotificationTapped)
       {
     NSUserDefaults.StandardUserDefaults.SetBool(isNotificationTapped,"notificationTapKey");
        NSUserDefaults.StandardUserDefaults.Synchronize();
       }
}

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Я нашел обходной путь для этой проблемы, я не знаю, правильный ли это подход, но он работал для меня.

В Xamarin.iOS, когда приложение запускается, сначала вызываются методы базового класса (т.е. applicationDidFinishLaunching), а затем вызывается часть Xamarin (т.е. FinishedLaunching).

Таким образом, я изменил имена параметров FinishedLaunching, аналогично параметрам базового класса (т. Е. «App» на «uiApplication» и «options» на «launchOptions»), и я получил ключ в словаре launchOptions.

 public override bool FinishedLaunching(UIApplication uiApplication, NSDictionary launchOptions)
    {
        global::Xamarin.Forms.Forms.Init();

        isNotificationTapped = false;

        if (launchOptions != null) {
            if (launchOptions.ContainsKey(UIApplication.LaunchOptionsLocalNotificationKey))
               isNotificationTapped = true;
        }

        LoadApplication(new App());
        return base.FinishedLaunching(uiApplication, launchOptions);
    }

Когда пользователь запускает приложение с помощью уведомления, выполняется метод FinishedLaunching в AppDelegate, и мы можем проверить словарь launchOptions, чтобы найти событие касания, а также, если приложение находится в фоновом режиме или запущено, а пользователь нажимает на уведомление. затем вызывается метод RecieveLocalNotification в AppDelegate.

  public override void ReceivedLocalNotification(UIApplication application, UILocalNotification notification)
    {
        isNotificationTapped = true;
    }

После инициализации значения я сохранил его в UserDefaults с помощью DependencyService

0 голосов
/ 08 сентября 2018
public override bool FinishedLaunching(UIApplication app, NSDictionary options)

{

if (options != null)
        {
            // check for a local notification
            if (options.ContainsKey(UIApplication.LaunchOptionsLocalNotificationKey))
            {
                var localNotification = options[UIApplication.LaunchOptionsLocalNotificationKey] as UILocalNotification;
                if (localNotification != null)
                {
                    LoadApplication(new App());
                    UIApplication.SharedApplication.ApplicationIconBadgeNumber = 0;// reset our badge
                }
            }
        }
else
        {
            LoadApplication(new App());
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...