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

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

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错误?

最佳答案

我相信问题与iOS存储timeZone的缓存有关。此功能有点令人困惑,因为您可以使用3种不同的timeZone(并且不要担心其中一半会混淆您):

[NSTimeZone defaultTimeZone];


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


[NSTimeZone localTimeZone];


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


[NSTimeZone systemTimeZone];


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


这整个事情使我感到困惑。但是那个resetSystemTimeZone方法似乎很有趣:


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


由于用户可能会在时区之间移动,并且当某些时区支持夏时制而有些时区不支持夏时制时,并且考虑到Apple本身在所有这些方面都存在持续的问题,因此似乎合理的解决方案是使它尽可能不易碎。

不可中断意味着我在整个应用程序中都使用了systemTimeZone,并在每次提及它之前都使用resetSystemTimeZone

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


到目前为止,我还没有遇到任何问题。希望这会帮助某人。

关于ios - UILocalNotification延迟1小时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19718216/

10-08 20:40