gpt4 book ai didi

ios - 无论启动日期如何,UILocalNotification 总是在我加载我的应用程序时立即显示

转载 作者:搜寻专家 更新时间:2023-10-31 22:23:17 25 4
gpt4 key购买 nike

您好,我是 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 以从 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)
}

关于ios - 无论启动日期如何,UILocalNotification 总是在我加载我的应用程序时立即显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27913723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com