【问题标题】:Find out when a repeating UILocalNotification was fired找出重复的 UILocalNotification 何时触发
【发布时间】:2012-06-18 08:20:40
【问题描述】:

我有一个 UILocalNotification,它设置为从 2012-06-18 10:00 开始,重复间隔为 1 分钟。

2012-06-18 10:05 将触发 5 个通知。然后,用户将选择通知编号 3。通知应在 2012-06-18 10:02 触发。

在我的- application:didReceiveLocalNotification: 方法中。如何以编程方式从通知编号 3 中获取此触发日期,该通知编号应为 2012-06-18 10:02。我知道我可以从UILocalNotification 获得初始/启动 fireDate 属性,但我对此不感兴趣。我很想知道重复通知的触发日期(不是初始/开始触发日期)。

如果有人可以向我解释如何在不解析通知的- description 的情况下找出哪个重复的UILocalNotification 被解雇了,我会给你一些我来之不易的赏金。

【问题讨论】:

  • 我认为这是不可能的,因为所有传递的信息(甚至在 userInfo 字典上)都是在计划之前配置的。所以我不认为它是为了这个目的。但我可能是错的,只是谈谈我的经历。
  • 我认为这也不可能。从文档中需要注意的是,每个重复通知不是不同的通知,而是再次重新安排了相同的通知。

标签: ios uilocalnotification


【解决方案1】:

所以我对此进行了更多考虑,正如我在评论中所说,由于通知的处理方式,这似乎是不可能的。

您创建一个并立即触发或安排它。

通知只是一些信息的存储,这意味着它仅用于读取其属性。

应用通过

接收通知
application:didReceiveLocalNotification:

在其中仅传递 UILocalNotification 本身。这个通知只有一堆在开始时设置的属性。

重复间隔仅用于重新通知用户,不会改变通知内容。

由此得出的结论是,对于您希望实现的行为,如果您希望传递不同的信息或执行不同的操作,则必须触发不同的通知。

(子分类也没有用,正如这里所解释的https://stackoverflow.com/a/8583329/1068522

【讨论】:

  • 所以看来我唯一的选择就是解析UILocalNotification-description?如果 Apple 决定更改 UILocalNotification-description 方法,我该如何以最佳方式确保我的应用程序仍然有效?
  • 那将是您解析描述的方式,理想情况下,您想要寻找“看起来像”被触发的关键字的东西,并采用前面的任何值。所有这些都是通过 NSString 便捷方法和可能的 NSScaner 完成的,实际上有几种方法。您介意发布 2 或 3 条 NSlogged 描述这些预定通知吗?
  • 这是他们的样子:<UIConcreteLocalNotification: 0x613e060>{fire date = 2010-11-29 03:53:52 GMT, time zone = America/Denver (MST) offset -25200, repeat interval = 16, next fire date = 2010-11-30 03:53:52 GMT}
  • 但是您是否检查过触发相同原始触发的另一个通知的差异?正确指定触发器之间的差异,例如您的情况。
  • 您寻求的是能够区分 5 个通知中的哪一个被激活,对吗?我不太记得了,但我不确定描述是否真的在您激活的 5 个之间发生了变化。我只是想确认一下。如果它确实发生了变化,那么它只是在第一次遇到火灾日期和重复间隔之间创建一个子字符串。真的有太多的方法,正如你所说的苹果可能会改变它。您需要在这里进行实验,developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
【解决方案2】:

获取 UILocalNotification 的 fireDate 的最佳替代解决方案是计算日期。
鉴于您有一个初始触发日期,您可以使用重复间隔来计算给定通知的触发日期。

1.从最初的开火日期开始
2.获取您拥有的通知的通知编号/索引
3.将重复的间隔乘以索引并将其添加到您的初始触发日期

但是,由于时区和“其他令人讨厌的事情”,如下链接中提到的日期计算很棘手。
这是一个有用的链接:
How to grab the NEXT fire date from a UILocalNotification object

当然,还有解析description 方法的最终后备解决方案。使用[notification.fireDate description] 但是,您可能知道,这样做绝不是一个好主意,因为将来格式可能会发生变化,从而破坏您的代码。

希望这有帮助!

编辑: 示例:好的,假设我的第一个初始 fireDate 是 2012-06-18 10:00
我知道我的重复间隔是每 ONE 分钟,对吧?
比如说,用户点击了 uilocalnotification number 3,那么这意味着应该已经过了两分钟!
因此,该特定通知的时间是:2012-06-18 10:02
这有意义吗?

【讨论】:

  • 很抱歉,但我认为您没有理解我的问题。我知道如何使用repeatInterval 计算未来日期,但这不是我的问题。我的问题是如何唯一地识别用户选择查看/打开的重复UILocalNotification。但是感谢您尝试给我答案:)
  • 能否获取特定通知的通知号?请看我的编辑!谢谢!
  • 是的,这是有道理的,这就是我在我的问题中所写的。但你仍然没有回答我的问题;)
【解决方案3】:

问:

如果有人可以向我解释如何找出哪个重复 UILocalNotification 在没有解析 - 描述的情况下被触发 通知我会给你一些我辛苦赚来的赏金。

答:最简单的方法:

- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    NSDateComponents *comps = [[NSCalendar currentCalendar] components:notification.repeatInterval fromDate:notification.fireDate toDate:[NSDate date] options:0];
    NSLog(@"Notification #%d", [comps minute] + 1);
}

问:如何在不解析的情况下从description 获取“下一个触发日期”?

答:对此有私有/未记录的功能:nextFireDateForLastFireDate

- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    NSLog(@"next: %@", [notification nextFireDateForLastFireDate:[NSDate date]]);
}

问:也许通知中有某种计数?属性还是方法?

答:有无证属性:

@property (assign, nonatomic) int totalRepeatCount;
@property (assign, nonatomic) int remainingRepeatCount;

但它们似乎总是具有相同的值:UILocalNotificationInfiniteRepeatCount。它们都由操作系统管理,因此覆盖此属性或底层实例变量没有任何作用。此外,UILocalNotifications 内部没有任何变化 从触发到触发,没有办法区分一个 UILocalNotification 和另一个(内存中的地址除外)。 Next fireDate是根据当前时间计算的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    相关资源
    最近更新 更多