在一天中的特定时间安排本地通知
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 中确认 UNUserNotificationCenterDelegate
和 didFinishLaunchingWithOptions
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 以使通知每天重复一次,是吗? 应该是。您可以设置一个触发时间,看看它是否会第二次显示通知。以上是关于在一天中的特定时间安排本地通知的主要内容,如果未能解决你的问题,请参考以下文章