当前位置: 首页 > 面试题库 >

无论启动日期如何,只要加载应用,UILocalNotification就会始终显示

颛孙智勇
2023-03-14
问题内容

您好,我是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

问题是您将日期组件设置为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属性

通知生效日期的时区。

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)
}


 类似资料:
  • 我有一个Spring Boot应用程序,它有一些外部依赖(例如,项目之外的文件,需要存在,以便应用程序正确启动)。 和一系列其他例外。有没有一种方法可以恰当地做到这一点?

  • 如何在IntelliJ IDEA中启用"从源代码滚动",使其始终处于开启状态,这意味着如果您打开任何文件,它将自动显示在项目视图中,同样,它也是在Eclipse中制作的? 可以单击Project中的按钮来查找所选文件,但每次打开另一个文件时都单击它会让人恼火。

  • 我希望容器在计算机重新启动后自动启动,所以我使用'--restart=always'标志,但它并没有像我预期的那样运行。当我重新启动系统时,容器没有启动。 docker日志信息 添加docker ps-a message,$docker ps-a CONTAINER ID IMAGE命令CREATED STATUS PORTS NAMES a1f4d5471b0a mysql:8.0“docker

  • 问题内容: 这对我完全没有意义。 这是我的代码: 即使我的输出是 我正在用Java执行此操作,并且正在使用Eclipse galileo,因此,每次我编译/运行程序时,它都会将其保存,因此编译器应获取程序的更新版本。这是怎么回事? 问题答案: 一个常见的错误。删除语句末尾的。 顺便说一句,如果我使用方括号,并且使用IDE的代码格式化程序,那么我总是写以下内容。 这意味着如果您放错了位置,或者可能更

  • 我想在我的iOS应用程序中显示指定时间间隔的插屏广告。此外,我不想打扰用户交互。当用户尝试从屏幕/其他操作导航时,我想显示此插屏广告。 但是,我在iOS中没有看到任何方法/调用会在需要时加载InterstitalAD。此外,iOS 7中也不推荐使用InterstitalAdobj presentFromViewController。 我的问题是,只有在需要时才能显示/呈现插屏广告的另一种方式是什么

  • 问题内容: 我有一个Android应用程序,其中显示了3秒钟的“启动画面”。之后,MainActivity被加载。 不幸的是,MainActivity需要额外的〜4秒来加载。首次启动时间更长。但是,在加载该应用程序后,一切都会顺利进行。 现在如何在启动屏幕显示期间实现MainActivity的加载?它只应显示一个图像,直到整个东西完全加载为止。我已经阅读了有关Async- Task的信息,但不确定