使用本地时区推送通知

Posted

技术标签:

【中文标题】使用本地时区推送通知【英文标题】:Push notifications with local timezone 【发布时间】:2014-10-09 08:08:31 【问题描述】:

我有以下代码

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】:

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

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

如果我是你,我将依赖 localTimeZone 而不是 systemTimeZone,在未设置 defaultTimeZone 时默认使用该 systemTimeZone。看看官方doc 就可以清楚地了解您可以使用的不同时区。

【讨论】:

我该如何解决这个问题? 收到通知后,您需要考虑当地通知的时区。 我不太明白。例如,用户在纽约,想在 15:00 发出本地通知。我只是将 fireDate 设置为 15:00,不是吗? 是的,您将 fireDate 设置为 15:00,但使用了正确的时区。我的意思是,这取决于您是要依赖设备设置的时区(defaultTimeZone)还是设备当前位置的时区(localTimeZone)。 检查文档:[NSTime defaultTimeZone] 依赖于系统时区,如果您从未设置过。

以上是关于使用本地时区推送通知的主要内容,如果未能解决你的问题,请参考以下文章

React Native - 在接收本地推送通知时清除以前的推送通知

iOS开发 - ANPs推送通知 标签: 推送通知ANPs远程推送本地推送

iOS(本地通知与远程通知)

IOS-推送通知

如何在前台接收推送通知时显示颤振本地通知?

测试本地推送通知