【问题标题】:Xamarin iOS Local Push NotificationsXamarin iOS 本地推送通知
【发布时间】:2018-09-06 13:58:11
【问题描述】:

如何安排本地(无服务器)推送通知(不是警报)从我的应用程序触发?我只是想从我的应用程序中安排一个通知,并让它在通知中心的给定时间触发。我曾尝试使用 LocalNotifications,但它们似乎仅在应用程序打开时才有效,并且仅在关闭时更新徽章。除非您使用服务器,否则我也看不到发送推送通知的方法。

目前我可以安排 LocalNotification 并弹出警报,但我希望在应用程序关闭时它可以工作,而不是警报,我希望在顶部弹出一个推送通知。

【问题讨论】:

    标签: ios xamarin notifications xamarin.ios


    【解决方案1】:

    应在应用启动后立即通过将以下代码添加到AppDelegateFinishedLaunching 方法并设置所需的通知类型(UNAuthorizationOptions)来请求通知权限:

    ...
    using UserNotifications;
    ...
    
    
    
     public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
       {
           ....
    
            //after iOS 10
            if(UIDevice.CurrentDevice.CheckSystemVersion(10,0))
            {
                UNUserNotificationCenter center = UNUserNotificationCenter.Current;
    
                center.RequestAuthorization(UNAuthorizationOptions.Alert | UNAuthorizationOptions.Sound | UNAuthorizationOptions.UNAuthorizationOptions.Badge, (bool arg1, NSError arg2) =>
                     {
    
                     });
    
                center.Delegate = new NotificationDelegate();
            }
    
            else if(UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
            {
    
                var settings = UIUserNotificationSettings.GetSettingsForTypes(UIUserNotificationType.Alert| UIUserNotificationType.Badge| UIUserNotificationType.Sound,new NSSet());
    
                UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);
    
            }
    
            return true;
        }
    

    iOS 10 的新功能,当应用程序在前台并触发通知时,它可以以不同的方式处理通知。通过提供UNUserNotificationCenterDelegate 并实现UserNotificationCentermethod,应用程序可以接管显示通知的责任。例如:

    using System;
    using ObjCRuntime;
    using UserNotifications;
    
    
    namespace workplat
    {
     public class NotificationDelegate:UNUserNotificationCenterDelegate
       {
        public NotificationDelegate()
        {
        }
    
        public override void WillPresentNotification(UNUserNotificationCenter center, UNNotification notification, Action<UNNotificationPresentationOptions> completionHandler)
        {
            // Do something with the notification
            Console.WriteLine("Active Notification: {0}", notification);
    
            // Tell system to display the notification anyway or use
            // `None` to say we have handled the display locally.
            completionHandler(UNNotificationPresentationOptions.Alert|UNNotificationPresentationOptions.Sound);
        }
    
    
        public override void DidReceiveNotificationResponse(UNUserNotificationCenter center, UNNotificationResponse response, Action completionHandler)
        {
            // Take action based on Action ID
            switch (response.ActionIdentifier)
            {
                case "reply":
                    // Do something
                    break;
                default:
                    // Take action based on identifier
                    if (response.IsDefaultAction)
                    {
                        // Handle default action...
                    }
                    else if (response.IsDismissAction)
                    {
                        // Handle dismiss action
                    }
                    break;
            }
    
            // Inform caller it has been handled
            completionHandler();
        }
    
      }
    }
    

    要在系统中创建和注册自定义操作,请使用以下代码:

     public void RegisterNotification(long time)
        {
            UNUserNotificationCenter center = UNUserNotificationCenter.Current;
    
            //creat a UNMutableNotificationContent which contains your notification content
            UNMutableNotificationContent notificationContent = new UNMutableNotificationContent();
    
            notificationContent.Title = "xxx";
            notificationContent.Body= "xxxx";
    
            notificationContent.Sound = UNNotificationSound.Default;
    
            UNTimeIntervalNotificationTrigger trigger = UNTimeIntervalNotificationTrigger.CreateTrigger(time, false);
    
            UNNotificationRequest request = UNNotificationRequest.FromIdentifier("FiveSecond", notificationContent, trigger);
    
    
            center.AddNotificationRequest(request,(NSError obj) => 
            {
    
    
    
            });
    
        }
    

    当你调用这个方法时,例如:

    RegisterNotification(20);//set the time you want to push notification
    

    通知将在 20 秒后推送,如果您关闭应用。

    我已经把我的demo上传到我的github了,大家可以下载参考:Demo Link

    您可以访问链接以获取更多信息和详细信息:MicroSoft Document

    【讨论】:

    • 我遇到了 center.Delegate = new NotificationDelegate(); 的问题我看到它是一个接口,我应该如何实现呢?
    【解决方案2】:

    试试这个,它会在 5 秒后创建一个本地通知,但如果你想重复,那么将时间增加到 60 以上

    在你的应用委托中写下这个

    import UIKit
    import UserNotifications
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate,UNUserNotificationCenterDelegate {
    
        var window: UIWindow?
    //user notification method
    
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.alert,.sound])
    }
    //response to user notification
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        if response.notification.request.identifier == "testidentifire"
        {
            print("test")
        }
        completionHandler()
    }
    
    
    
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
        UNUserNotificationCenter.current().delegate = self
    
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound,.badge]) { (granted, error) in
            print("granted\(granted)")
        }
        return true
    }
    

    在你的视图控制器中

    import UIKit
    import UserNotifications
    
    class ViewController: UIViewController,UNUserNotificationCenterDelegate {
    override func viewDidLoad() {
    
        super.viewDidLoad()
    //sendign local notification you need three object a contant,trigger,represh
    let content = UNMutableNotificationContent()
    content.title = "test notifaction"
    content.body = "test notification after 5 second"
    content.sound = UNNotificationSound.default()
    
    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: true)
    let request  = UNNotificationRequest(identifier: "testidentifire", content: content, trigger: trigger)
    UNUserNotificationCenter.current().add(request) { (error) in
        print("error\(error )")
        //this will show notification when app is in background but if you need to show notification on foreground then u need to implement the delegate method of UNuserNotificationcenter.curent in app delegate 
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多