在一天中的特定时间安排本地通知

Posted

技术标签:

【中文标题】在一天中的特定时间安排本地通知【英文标题】:Schedule Local Notifications at Specific times in the day 【发布时间】:2016-07-01 01:19:31 【问题描述】:

我想为我的应用设置每日通知系统。它应该每天通知用户两次,一次在上午 8:00(嘿,你的早晨剂量已经准备好。想看看吗?)和晚上 7:00 一次(Ssup!你的晚上剂量正在里面等待) .我知道这样做我会在一个月内用完通知,因为有 64 个通知上限(用于本地通知),但到那时,该应用程序将上线,我将完成设置远程通知更新。

我看过这个问题:How to schedule a same local notification in swift 和 .Day 都很好。我只需要知道如何在指定的时间每天做两次;。提前致谢!

编辑:如何在通知上设置具体时间是问题的一部分。 NSDate API 给了我有趣的时间间隔(sinceNow/Since1973)。我只想让它在晚上 7 点开火。 :-/ 除非我遗漏了一些东西,否则这些 NSDate api 似乎无法做到这一点。

【问题讨论】:

【参考方案1】:

Swift 4.2 更新

import UserNotifications

在 AppDelegate 中确认 UNUserNotificationCenterDelegatedidFinishLaunchingWithOptions

let center = UNUserNotificationCenter.current()
            center.delegate = self;
            center.requestAuthorization(options: [UNAuthorizationOptions.alert, .badge, .sound])  (granted, error) in
                if !granted 
                    print("Permission Declined");
                
            

let content = UNMutableNotificationContent();
            content.title = "HI";
            content.body = "Your notification is here";
            content.sound = UNNotificationSound.default;

            let gregorian = Calendar(identifier: Calendar.Identifier.gregorian);
            let now = Date();
            var components = gregorian.dateComponents(in: .autoupdatingCurrent, from: now)

            let hours = [8,19];

            for hour in hours 
                components.timeZone = TimeZone.current
                components.hour = hour;
                components.minute = 00;
                components.second = 00;

                let date = gregorian.date(from: components);
                let formatter = DateFormatter();
                formatter.dateFormat = "MM-dd-yyyy HH:mm";

                guard let dates = date else 
                    return;
                
                var fireDate: String? 
                fireDate = formatter.string(from: dates);
                print("\(fireDate ?? "")"); // Just to Check

                let dailyTrigger = Calendar.current.dateComponents([.hour, .minute, .second], from: dates);
                let trigger = UNCalendarNotificationTrigger.init(dateMatching: dailyTrigger, repeats: true);

                let identifier = "Local Notification"
                let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)

                center.add(request)  (error) in
                    if let error = error 
                        print("Error \(error.localizedDescription)")
                    
                
            

【讨论】:

【参考方案2】:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
    // Override point for customization after application launch.
    let settings = UIUserNotificationSettings(forTypes: .Badge, categories: nil)
    UIApplication.sharedApplication().registerUserNotificationSettings(settings)

    let localNotification1 = UILocalNotification()
    localNotification1.alertBody = "Your alert message 111"
    localNotification1.timeZone = NSTimeZone.defaultTimeZone()
    localNotification1.fireDate = self.getEightAMDate()
    UIApplication.sharedApplication().scheduleLocalNotification(localNotification1)

    let localNotification2 = UILocalNotification()
    localNotification2.alertBody = "Your alert message22"
    localNotification2.timeZone = NSTimeZone.defaultTimeZone()
    localNotification2.fireDate = self.getSevenPMDate()
    UIApplication.sharedApplication().scheduleLocalNotification(localNotification2)
    return true


func getEightAMDate() -> NSDate? 
    let calendar: NSCalendar! = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
    let now: NSDate! = NSDate()

    let date10h = calendar.dateBySettingHour(8, minute: 0, second: 0, ofDate: now, options: NSCalendarOptions.MatchFirst)!
    return date10h


func getSevenPMDate() -> NSDate? 
    let calendar: NSCalendar! = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
    let now: NSDate! = NSDate()

    let date19h = calendar.dateBySettingHour(19, minute: 0, second: 0, ofDate: now, options: NSCalendarOptions.MatchFirst)!
    return date19h

【讨论】:

嘿!感谢您的回复....快速一个...希望您能告诉我如何将时间设置为 8:00 AM / 7 PM,因为 NSDate API 没有给我直接设置时间的选项.只有'timeIntevalSinceNow/1970/reference'等。还是我应该使用其中之一?如果是这样,我会怎么做?谢谢 谢谢伙计。我猜日历是我不知道的。环顾四周,有几个人遇到了同样的问题。显然,日历 API 没有在文档中更新。但我必须确认这一点。不管怎样,你是英雄伴侣! 在我们完成之前,我需要将重复间隔设置为 .Day 以使通知每天重复一次,是吗? 应该是。您可以设置一个触发时间,看看它是否会第二次显示通知。

以上是关于在一天中的特定时间安排本地通知的主要内容,如果未能解决你的问题,请参考以下文章

每 n 天安排一次本地通知(时区安全)

Swift:多个本地通知,但只显示最新的

SNS 通知调度

如何在一段时间后取消安排以前安排的本地通知?

ios重复本地通知

如何安排本地通知