UILocalNotification延迟了1小时

时间:2013-10-31 23:13:07

标签: ios objective-c nsdate uilocalnotification nstimezone

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

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

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

1 个答案:

答案 0 :(得分:1)

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

[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];

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