无论启动日期如何,UILocalNotification 总是在我加载我的应用程序时立即显示
UILocalNotification always shows up as soon as I load my app regardless of the fire date
您好,我是 swift 和 IOS 编程的新手。我已经设置了 6 条通知,这些通知应该根据一天中的不同时间每天提醒用户 6 次。警报有效,但由于某种原因,当应用程序首次启动时,所有 6 个警报同时显示在通知中心。任何帮助将不胜感激。
这是 AppDelegate.swift
中的代码
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
let notificationTypes : UIUserNotificationType = UIUserNotificationType.Alert | UIUserNotificationType.Badge
let notificationSetting : UIUserNotificationSettings = UIUserNotificationSettings(forTypes: notificationTypes, categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(notificationSetting)
return true
}
这是我的六个不同通知的函数
func prayerAlert (prayerName : String, prayHour : Int, prayMinute : Int) {
dateComp.year = Int(currentDate.year)
dateComp.month = Int(currentDate.month)
dateComp.day = Int(currentDate.day)
dateComp.hour = prayHour
dateComp.minute = prayMinute
dateComp.timeZone = NSTimeZone.systemTimeZone()
var calender : NSCalendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)!
var date : NSDate = calender.dateFromComponents(dateComp)!
var notification : UILocalNotification = UILocalNotification()
notification.alertBody = prayerName
notification.fireDate = date
UIApplication.sharedApplication().scheduleLocalNotification(notification)
}
这就是我在 ViewDidLoad
中调用函数的地方
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
pray.setTimeFormat(0)
self.locationManager.requestAlwaysAuthorization()
self.locationManager.requestWhenInUseAuthorization()
if CLLocationManager.locationServicesEnabled() {
self.locationManager.delegate = self
self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
self.locationManager.startUpdatingLocation()
}
var timesArray = pray.getDatePrayerTimes(currentDate.year, andMonth: currentDate.month, andDay: currentDate.day, andLatitude: locationManager.location.coordinate.latitude, andLongitude: locationManager.location.coordinate.longitude, andtimeZone: pray.timeZone)
var convertedTime = convertPrayArray(timesArray as NSMutableArray)
prayerAlert("Time for Fajr", prayHour: convertedTime.hourArray[0], prayMinute: convertedTime.minuteArray[0])
prayerAlert("Time for SunRise", prayHour: convertedTime.hourArray[1], prayMinute: convertedTime.minuteArray[1])
prayerAlert("Time for Dhuhr", prayHour: convertedTime.hourArray[2], prayMinute: convertedTime.minuteArray[2])
prayerAlert("Time for Asr", prayHour: convertedTime.hourArray[3], prayMinute: convertedTime.minuteArray[3])
prayerAlert("Time for Maghrib", prayHour: convertedTime.hourArray[5], prayMinute: convertedTime.minuteArray[5])
prayerAlert("Time for Isha", prayHour: convertedTime.hourArray[6], prayMinute: convertedTime.minuteArray[6])
}
更新:Xcode 7.1 • Swift 2.1
问题是您将日期组件设置为本地时区而不是通知。
将此扩展 NSDate 添加到 return 来自 NSDate() 的所需组件
extension NSDate {
var minute: Int { return NSCalendar.currentCalendar().component(.Minute, fromDate: self)}
var hour: Int { return NSCalendar.currentCalendar().component(.Hour, fromDate: self)}
var day: Int { return NSCalendar.currentCalendar().component(.Day, fromDate: self)}
var month: Int { return NSCalendar.currentCalendar().component(.Month, fromDate: self)}
var year: Int { return NSCalendar.currentCalendar().component(.Year, fromDate: self)}
func fireDateAt(hr: Int, min: Int) -> NSDate {
let date = NSDate()
return NSCalendar.currentCalendar().dateWithEra(1,
year: year,
month: month,
day: { hr > date.hour || (hr == date.hour && min > date.minute) ? day : day + 1 }(),
hour: hr,
minute: min,
second: 0,
nanosecond: 0
)!
}
}
timeZone Property
The time zone of the notification’s fire date.
The date specified in fireDate is interpreted according to the value
of this property. If you specify nil (the default), the fire date is
interpreted as an absolute GMT time, which is suitable for cases such
as countdown timers. If you assign a valid NSTimeZone object to this
property, the fire date is interpreted as a wall-clock time that is
automatically adjusted when there are changes in time zones; an
example suitable for this case is an an alarm clock.
func prayerAlert (prayerName : String, prayHour : Int, prayMinute : Int) {
var notification = UILocalNotification()
notification.timeZone = NSTimeZone.localTimeZone()
notification.alertBody = prayerName
notification.fireDate = NSDate().fireDateAt(prayHour, min: prayMinute)
UIApplication.sharedApplication().scheduleLocalNotification(notification)
}
您好,我是 swift 和 IOS 编程的新手。我已经设置了 6 条通知,这些通知应该根据一天中的不同时间每天提醒用户 6 次。警报有效,但由于某种原因,当应用程序首次启动时,所有 6 个警报同时显示在通知中心。任何帮助将不胜感激。
这是 AppDelegate.swift
中的代码func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
let notificationTypes : UIUserNotificationType = UIUserNotificationType.Alert | UIUserNotificationType.Badge
let notificationSetting : UIUserNotificationSettings = UIUserNotificationSettings(forTypes: notificationTypes, categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(notificationSetting)
return true
}
这是我的六个不同通知的函数
func prayerAlert (prayerName : String, prayHour : Int, prayMinute : Int) {
dateComp.year = Int(currentDate.year)
dateComp.month = Int(currentDate.month)
dateComp.day = Int(currentDate.day)
dateComp.hour = prayHour
dateComp.minute = prayMinute
dateComp.timeZone = NSTimeZone.systemTimeZone()
var calender : NSCalendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)!
var date : NSDate = calender.dateFromComponents(dateComp)!
var notification : UILocalNotification = UILocalNotification()
notification.alertBody = prayerName
notification.fireDate = date
UIApplication.sharedApplication().scheduleLocalNotification(notification)
}
这就是我在 ViewDidLoad
中调用函数的地方override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
pray.setTimeFormat(0)
self.locationManager.requestAlwaysAuthorization()
self.locationManager.requestWhenInUseAuthorization()
if CLLocationManager.locationServicesEnabled() {
self.locationManager.delegate = self
self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
self.locationManager.startUpdatingLocation()
}
var timesArray = pray.getDatePrayerTimes(currentDate.year, andMonth: currentDate.month, andDay: currentDate.day, andLatitude: locationManager.location.coordinate.latitude, andLongitude: locationManager.location.coordinate.longitude, andtimeZone: pray.timeZone)
var convertedTime = convertPrayArray(timesArray as NSMutableArray)
prayerAlert("Time for Fajr", prayHour: convertedTime.hourArray[0], prayMinute: convertedTime.minuteArray[0])
prayerAlert("Time for SunRise", prayHour: convertedTime.hourArray[1], prayMinute: convertedTime.minuteArray[1])
prayerAlert("Time for Dhuhr", prayHour: convertedTime.hourArray[2], prayMinute: convertedTime.minuteArray[2])
prayerAlert("Time for Asr", prayHour: convertedTime.hourArray[3], prayMinute: convertedTime.minuteArray[3])
prayerAlert("Time for Maghrib", prayHour: convertedTime.hourArray[5], prayMinute: convertedTime.minuteArray[5])
prayerAlert("Time for Isha", prayHour: convertedTime.hourArray[6], prayMinute: convertedTime.minuteArray[6])
}
更新:Xcode 7.1 • Swift 2.1
问题是您将日期组件设置为本地时区而不是通知。
将此扩展 NSDate 添加到 return 来自 NSDate() 的所需组件
extension NSDate {
var minute: Int { return NSCalendar.currentCalendar().component(.Minute, fromDate: self)}
var hour: Int { return NSCalendar.currentCalendar().component(.Hour, fromDate: self)}
var day: Int { return NSCalendar.currentCalendar().component(.Day, fromDate: self)}
var month: Int { return NSCalendar.currentCalendar().component(.Month, fromDate: self)}
var year: Int { return NSCalendar.currentCalendar().component(.Year, fromDate: self)}
func fireDateAt(hr: Int, min: Int) -> NSDate {
let date = NSDate()
return NSCalendar.currentCalendar().dateWithEra(1,
year: year,
month: month,
day: { hr > date.hour || (hr == date.hour && min > date.minute) ? day : day + 1 }(),
hour: hr,
minute: min,
second: 0,
nanosecond: 0
)!
}
}
timeZone Property
The time zone of the notification’s fire date.
The date specified in fireDate is interpreted according to the value of this property. If you specify nil (the default), the fire date is interpreted as an absolute GMT time, which is suitable for cases such as countdown timers. If you assign a valid NSTimeZone object to this property, the fire date is interpreted as a wall-clock time that is automatically adjusted when there are changes in time zones; an example suitable for this case is an an alarm clock.
func prayerAlert (prayerName : String, prayHour : Int, prayMinute : Int) {
var notification = UILocalNotification()
notification.timeZone = NSTimeZone.localTimeZone()
notification.alertBody = prayerName
notification.fireDate = NSDate().fireDateAt(prayHour, min: prayMinute)
UIApplication.sharedApplication().scheduleLocalNotification(notification)
}