【问题标题】:UILocalNotification delayed by 1 hourUILocalNotification 延迟了 1 小时
【发布时间】:2013-10-31 23:13:06
【问题描述】:

我个人没有遇到过这个问题,但是对于我的一些用户来说,设置一次的通知实际上是在一个小时后触发的。

这是我用来生成通知的代码:

UILocalNotification *notif = [[UILocalNotification alloc] init];
notif.fireDate = date;
notif.timeZone = [NSTimeZone defaultTimeZone];
notif.alertBody = @"Alert time!";
notif.alertAction = @"Wake me";

[[UIApplication sharedApplication] scheduleLocalNotification:notif];

相当标准。遇到问题的用户是英国时间,该时间有夏令时。我想知道这是否是某种 iOS 错误?

【问题讨论】:

  • 当您从另一个变量分配fireDate 时,您可能无法存储时间...也许您将其保存在CoreData 中?
  • date 等于什么?

标签: ios objective-c nsdate uilocalnotification nstimezone


【解决方案1】:

我认为问题与 iOS 存储时区缓存有关。这个功能有点令人困惑,因为您可以拥有 3 个不同的时区(如果其中一半让您感到困惑,请不要担心):

[NSTimeZone defaultTimeZone];

返回当前应用程序的默认时区。如果未设置默认时区,则该方法调用 systemTimeZone 并返回系统时区。默认时区是应用程序运行时使用的时区,您可以更改该时区(这样您就可以让应用程序像在不同时区一样运行)。

[NSTimeZone localTimeZone];

返回一个将所有消息转发到当前应用程序的默认时区的对象。本地时区始终代表默认时区的当前状态。本地时区增加了一层间接性,每当您在其上调用方法时,它就像当前默认时区一样。

[NSTimeZone systemTimeZone];

返回系统当前使用的时区。如果您获得系统时区,它会被应用程序缓存,并且如果用户随后更改系统时区,它也不会更改。下次调用 systemTimeZone 时,您将返回最初获得的时区。您必须调用 resetSystemTimeZone 来清除缓存的对象。

就个人而言,这整件事让我感到困惑。但是resetSystemTimeZone 方法似乎很有趣:

如果应用程序缓存了系统时区,此方法会清除该缓存对象。如果您随后调用 systemTimeZone,NSTimeZone 将尝试重新确定系统时区,并创建并缓存一个新对象。

由于用户可能在时区之间移动,并且当某些时区支持夏令时而有些不支持时,并且考虑到 Apple 自己在所有这些方面都存在持续的问题,这似乎是合乎逻辑的解决方案是使其尽可能不易损坏

Non-breakable 意味着我在整个应用程序中都使用了 systemTimeZone,并且在每次提到它之前都使用了resetSystemTimeZone

UILocalNotification *notif = [[UILocalNotification alloc] init];
notif.fireDate = date;
[NSTimeZone resetSystemTimeZone];
notif.timeZone = [NSTimeZone systemTimeZone];

到目前为止,我还没有遇到过这个问题。希望这会对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多