Подтвердить что ты не робот

OneSignal: как обрабатывать уведомление, открытое в AppDelegate приложения Xamarin.Forms?

Я работаю над внедрением push-уведомления OneSignal в Xamarin.Forms.

Мне нужно передать строку, возвращаемую OneSignal AdditionalData в конструктор App().

Итак, я использовал HandleNotificationOpened(OSNotificationOpenedResult result) для обработки уведомления и получения строки, а затем передал ее LoadApplication(new App(myData)).

Итак, для этого я написал код в MainActivity для Android и AppDelegate для iOS.

Все отлично работает для Android; т.е. HandleNotificationOpened() извлекает AdditionalData и передает его на LoadApplication(new App(myData)).

Но в iOS, когда я открыл уведомление, код HandleNotificationOpened() не вызывается.

AppDelegate.cs

static string s = null;

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    OneSignal.Current.StartInit("MyKey").HandleNotificationOpened(HandleNotificationOpened).EndInit();

    if(s!=null)
    {
        LoadApplication(new App(s));
    }
    else
    {
        LoadApplication(new App("myUrl.lasso")); 
    }

    return base.FinishedLaunching(app, options);
}

private static void HandleNotificationOpened(OSNotificationOpenedResult result)
{
    OSNotificationPayload payload = result.notification.payload;
    Dictionary<string, object> additionalData = payload.additionalData;

    if (additionalData != null)
    {
        if (additionalData.ContainsKey("url_direct"))
        {
            s = additionalData["url_direct"].ToString();
            System.Diagnostics.Debug.WriteLine("We need to redirect it to: " + s);
        }
    }
}
4b9b3361

Ответ 1

Я нашел работу. На самом деле мы не можем улавливать уведомление на AppDelegate finishedLaunching(), поэтому HandleNotificationOpened (HandleNotificationOpened) не работает должным образом в iOS. Поэтому я реализовал его на классе приложений PCL общей папки.

Ответ 2

Ответ

Отмените DidReceivedRemoteNotification event в AppDelegate.

Код

public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, System.Action<UIBackgroundFetchResult> completionHandler)
{
    base.DidReceiveRemoteNotification(application, userInfo, completionHandler);

    NSDictionary aps = userInfo.ObjectForKey(new NSString("aps")) as NSDictionary;

    string alert = string.Empty;
    if (aps.ContainsKey(new NSString("alert")))
        alert = (aps [new NSString("alert")] as NSString).ToString();

    if (application.ApplicationState == UIApplicationState.Active)
    {
        //app is currently active, you can get your payload (userInfo) data here
    }
    else if (application.ApplicationState == UIApplicationState.Background)
    {
        //app is in background, you can get your payload (userInfo)
    }
    else if (application.ApplicationState == UIApplicationState.Inactive)
    {
        //app is transitioning from background to foreground (user taps notification), do what you need when user taps here, you can get your payload (userInfo)
    }
}