如何在Xamarin中使用代理(特别是UNUserNotificationCenterDelegate)

时间:2016-12-03 00:37:23

标签: xamarin xamarin.ios

我需要使用UNUserNotificationCenterDelegate中的iOS 10功能。如何在c#/ Xamarin中实现此委托?

1 个答案:

答案 0 :(得分:5)

使用UNUserNotificationCenterDelegate时,请确保使用应用程序WillFinishLaunching中的FinishedLaunchingUIApplicationDelegate方法进行分配。

  

您必须在应用完成启动之前将您的委托对象分配给UNUserNotificationCenter对象。

参考:UNUserNotificationCenterDelegate

AppDelegate.cs示例

public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
    UNUserNotificationCenter.Current.RequestAuthorization(UNAuthorizationOptions.Alert, (approved, err) =>
    {
        // Handle the user approval or refusal of your notifications...
    });
    UNUserNotificationCenter.Current.Delegate = new MyUNUserNotificationCenterDelegate();
    return true;
}

在该示例中,我正在创建/分配名为MyUNUserNotificationCenterDelegate的委托类,因此您需要实现该类。

MyUNUserNotificationCenterDelegate类示例:

UNUserNotificationCenterDelegate示例将捕获发送的每个本地通知,并在锁定屏幕上显示或将详细信息输出到系统日志之间切换。

public class MyUNUserNotificationCenterDelegate : UNUserNotificationCenterDelegate
{
    bool toggle;
    public override void WillPresentNotification(UNUserNotificationCenter center, UNNotification notification, Action<UNNotificationPresentationOptions> completionHandler)
    {
        if (toggle)
            completionHandler(UNNotificationPresentationOptions.Alert);
        else
        {
            Console.WriteLine(notification);
            completionHandler(UNNotificationPresentationOptions.None);
        }
        toggle = !toggle;
    }
}

现在您实际上需要发送一些通知,这会设置一个简单的重复通知:

创建/安排本地通知:

// Schedule a repeating Notification...
var content = new UNMutableNotificationContent();
content.Title = new NSString("From SushiHangover");
content.Body = new NSString("StackOverflow rocks");
content.Sound = UNNotificationSound.Default;
var trigger = UNTimeIntervalNotificationTrigger.CreateTrigger(timeInterval: 60, repeats: true);
var request = UNNotificationRequest.FromIdentifier(identifier: "FiveSecond", content: content, trigger: trigger);
UNUserNotificationCenter.Current.AddNotificationRequest(request, (NSError error) =>
{
    if (error != null) Console.WriteLine(error);
});

每60秒发送一次通知,如果您在锁定屏幕上,您将每隔120秒收到一次警报......

enter image description here

建议阅读以了解您如何使用Xamarin.iOS / C#与代理,协议和事件进行交互:

  

iOS使用Objective-C委托来实现委托模式,其中一个对象将工作传递给另一个对象。完成工作的对象是第一个对象的委托。一个对象通过在某些事情发生后发送消息来告诉其委托来完成工作。在Objective-C中发送这样的消息在功能上等同于在C#中调用方法。委托实现方法以响应这些调用,从而为应用程序提供功能。

参考:Xamarin.iOS and Delegates