在特定时区安排 UILocalNotification

Posted

技术标签:

【中文标题】在特定时区安排 UILocalNotification【英文标题】:Scheduling a UILocalNotification at a specific timezone 【发布时间】:2020-02-04 09:04:50 【问题描述】:

我一直在尝试在特定时区的 ios 上安排UILocalNotification,而不管用户当前所在的位置。我需要介绍的三个场景是

    能够在指定的时间和时区显示一次性通知 在指定时间和时区显示每日通知 在一周中的指定日期显示每周通知(即 星期日、星期一等)在指定的时间和时区

我尝试处理第一种情况,但安排在两分钟后出现通知,时区设置为太平洋/奥克兰。作为背景,我在悉尼,奥克兰提前两个小时。因此,假设悉尼的当前日期和时间是 2020 年 2 月 4 日晚上 8 点,我将使用 NSDateFormatter 解析一个字符串,即“2020-04-02T22:02”,并将格式化程序的时区也指定为 Pacific/Auckland。然后将该日期传递给UILocalNotificationfireDate 属性,并且还指定了timeZone 属性。我可以看到这是 UTC 的正确时间。但是,我发现通知不会在两分钟后触发。我是否遗漏了某些东西,或者对于使用旧的 UILocalNotification API 可以完成的操作是否存在错误/限制?我发现,如果我在通行证后一分钟安排通知,但在奥克兰时间,它会立即触发。

【问题讨论】:

你做对了,可能还有其他问题 谢谢,但我意识到我忘了提到我已经设置了通知的timeZone。据说这会根据文档 (developer.apple.com/documentation/uikit/uilocalnotification/…) 改变行为。如果我将timeZone 保留为 nil,那么它的行为与预期一样,但我怀疑我需要指定时区,因为我需要能够处理定期通知。我一直无法找到有关将其设置为非本地时区或默认时区满足我需要的示例 【参考方案1】:

尝试在一天中的特定时间安排本地通知 Schedule Local Notifications at Specific times in the day

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 message"
        localNotification1.timeZone = NSTimeZone.defaultTimeZone()
        localNotification1.fireDate = self.getEightAMDate()
        UIApplication.sharedApplication().scheduleLocalNotification(localNotification1)

        let localNotification2 = UILocalNotification()
        localNotification2.alertBody = "Your message"
        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
    

【讨论】:

我希望为它安排一个特定的时区,这可能与您代码中的默认时区不同

以上是关于在特定时区安排 UILocalNotification的主要内容,如果未能解决你的问题,请参考以下文章

通知中心和更改时区

当时区有 dst 更新时,我如何安排活动

安排在不同的时区

UTC 时间、时区、夏令时和夏令时切换日期

Android AlarmManager 通过时区或夏时制调度

在特定时区生成日期[重复]