ReceivedRemoteNotification 和 DidReceiveRemoteNotification 的关系

Relationship between ReceivedRemoteNotification and DidReceiveRemoteNotification

你信吗,我一搜,一个结果也没有。 developer.xamarin 上的 Xamarin API 也没有提及两者之间的任何关系。

让事情变得更复杂的是,developer.apple 说 DidReceiveRemoteNotification 已弃用,但在 developer.xamarin 上没有提及此弃用。此外,https://docs.microsoft.com/en-us/azure/app-service-mobile/app-service-mobile-xamarin-ios-get-started-push 指导您使用它。

所以现在还有 WillPresentNotification 在组合中。

有人可以解释一下这些吗?具体来说,它们是如何相关的,以及何时使用哪一个。

我建议阅读新的设计模式 apple has post iOS 10+ for User Notifications

过去的远程通知总是由 UIApplicationDelegate protocol/interface 处理,并且由于您的 AppDelegate class 默认实现该协议,因此处理传入的消息是常见的做法来自那里的远程通知现在用得不多了

application:didReceiveRemoteNotification:fetchCompletionHandler: .

在 iOS 10+ 中,Apple 将通知抽象到 UNUserNotificationCenter 框架中 为了分配委托,您必须将 UNUserNotificationCenter.Current.Delegate 分配给从 UserNotificationCenterDelegate 子类的自定义 class,或者像我一样,让您的 AppDelegate 实现接口并处理那里的东西。

以下是我在 Xamarin.iOS 中的实现方式:

using Foundation
using UIKit;
using UserNotifications;

    public class AppDelegate : UIApplicationDelegate, IUNUserNotificationCenterDelegate
    {
        public override UIWindow Window { get; set; }

        public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
        {
            UNUserNotificationCenter.Current.Delegate = this;
            return true;
        }

        [Export("userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:")]
        public void DidReceiveNotificationResponse(UNUserNotificationCenter center, UNNotificationResponse response, System.Action completionHandler)
        {
            //Handle Notification if user interacts with notification in Notification Center of iOS.
        }

        [Export("userNotificationCenter:willPresentNotification:withCompletionHandler:")]
        public void WillPresentNotification(UNUserNotificationCenter center, UNNotification notification, System.Action<UNNotificationPresentationOptions> completionHandler)
        {
            //Handle Notification if app is in the foreground when recieved.
        }
    }

当然你会想看看User Notifications框架,看看如何实现classes,比如UNNotificationUNNotification响应,如果你不熟悉的话那些 classes.

application:didReceiveRemoteNotification:fetchCompletionHandler: 未弃用。它仍然需要处理后台通知(唤醒您的应用程序以在后台执行操作的通知)。

UNUserNotificationCenter主要处理UI-related通知或操作,但仍然无法处理后台通知。