您好我是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])
}
答案 0 :(得分:4)
更新: Xcode 7.1•Swift 2.1
问题是您将日期组件设置为localTime区域而不是通知。
添加此扩展名NSDate以从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
通知的开火日期的时区。
根据值解释fireDate中指定的日期 这个属性。如果指定nil(默认值),则触发日期为 解释为绝对GMT时间,适用于此类情况 作为倒数计时器。如果为此分配有效的NSTimeZone对象 属性,起火日期被解释为挂钟时间 当时区发生变化时自动调整;一个 适合这种情况的例子是一个闹钟。
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)
}