OneSignal:如何处理在 Xamarin.Forms 应用程序的 AppDelegate 中打开的通知?

OneSignal: How to Handle notificationOpened in AppDelegate of a Xamarin.Forms app?

我正致力于在 Xamarin.Forms 中实现 OneSignal 推送通知。

我需要将 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);
        }
    }
}

回答

覆盖 AppDelegate 中的 DidReceivedRemoteNotification event

代码

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)
    }
}

我找到了解决方法。 实际上,我们无法在 AppDelegate 的 finishedLaunching() 上捕获通知点击,这就是为什么 HandleNotificationOpened(HandleNotificationOpened) 在 iOS 中无法正常工作的原因。所以我在 PCL common folder App class.

上实现了它