使用本地时区推送通知

时间:2014-10-09 08:08:32

标签: ios objective-c notifications push-notification uilocalnotification

我有以下代码

NSDictionary *dictionary = [[NSDictionary alloc]initWithObjectsAndKeys:notId,@"id", nil];
UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.timeZone = [NSTimeZone defaultTimeZone];
// localNotification.timeZone = [NSTimeZone timeZoneWithName:@"GMT"];

localNotification.fireDate = reisPush.rei_datetime;
localNotification.alertBody = reisPush.rei_message;
localNotification.userInfo = dictionary;
NSLog(@"FIRE DATE %@",localNotification.fireDate);
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
NSLog(@"ADDED NOTIFICATION");

我想用这个数据添加本地推送通知

title: "Test push bericht",
message: "Dit is een test bericht",
datetime: "2014-10-09 09:49:00",
journeytype_id: 13,
language: "nl"

你可以看到我的代码中有2个时区。当我使用[NSTimeZone defaultTimeZone]运行它时,我得到了这个日志

FIRE DATE 2014-10-09 09:49:00 +0000

看起来很好但是当我打印本地通知时,我得到了这个

"<UIConcreteLocalNotification: 0x16d854a0>{fire date = donderdag 9 oktober 2014 11:49:00 Midden-Europese zomertijd, time zone = Europe/Brussels (CEST) offset 7200 (Daylight), repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = donderdag 9 oktober 2014 11:49:00 Midden-Europese zomertijd, user info = {\n    id = 13;\n}}"
)

您可以看到时间比原始开火日期晚2小时。但是,当我使用其他时区[NSTimeZone timeZoneWithName:@"GMT"]执行此操作时,我会将此日志记录为开火日期。

FIRE DATE 2014-10-09 09:49:00 +0000

当您查看通知本身时,这也没关系:

"<UIConcreteLocalNotification: 0x16e66e50>{fire date = donderdag 9 oktober 2014 09:49:00 GMT, time zone = GMT (GMT) offset 0, repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = (null), user info = {\n    id = 13;\n}}"

您可以看到通知本身也正常,我会在我想要的时间收到通知。

问题

这是一款旅行应用。因此,有时用户在纽约,但也可能在欧洲。所以我知道我应该使用[NSTimeZone defaultTimeZone],但是这给了我错误的日期/小时。

有人可以帮我解决这个问题吗? 我总是很难理解NSDatesNStimezonesObjective-c中的运作方式......

1 个答案:

答案 0 :(得分:1)

localNotification.fireDate上使用调试器会产生误导,因为它是在特定时区表示的。因此,它将为您提供相同的FIRE DATE日志,但是针对不同的时区。

现在,当您依赖UILocalNotification对象的日志时,您将看到一些更相关的信息。在您的方案中,默认时区依赖于CEST时间,即GMT + 2h,这就是您在此日志中看到两个小时差异的原因。

如果我是你,我将依赖于localTimeZone而不是默认情况下使用的systemTimeZone,而未设置defaultTimeZone。请关注该问题的官方doc,以便清楚了解您可以使用的不同时区。