当本地通知到达或超过可以使用的通知总数时做一些事情

Posted

技术标签:

【中文标题】当本地通知到达或超过可以使用的通知总数时做一些事情【英文标题】:Do something when local notification arrives or exceed the number of total notifications that can be used 【发布时间】:2013-05-24 11:50:10 【问题描述】:

所以,我有一个锻炼应用程序,其中我们有 10/15 秒的重复计时器,通过它我们可以显示用户完成的进度。为了让它也能在后台运行,我使用了本地通知。但是,正如 Apple 所说,我们只能在我们应用的任何给定实例中使用 ONLY 64 local notifications

所以,现在发生的情况是当应用程序处于后台并且这 64 条通知已完成时,我无法控制该应用程序。如果用户打开应用程序,我可以重新添加 64 条通知。但是如果用户根本没有打开应用程序并且这64个通知都完成了,我该怎么办?

当任何本地通知到达时,应用程序内部是否发生了任何事件?有没有办法超过通知的数量?

我认为应该有一个解决方案,因为有许多警报应用程序都使用相同的方法。

请帮忙!

【问题讨论】:

【参考方案1】:

您可以使用repeatInterval property of UILocalNotification 让您的通知每隔一秒、一分钟、一小时、一天或其他单位自动重复(请参阅NSCalendarUnit documentation):

notification.repeatInterval = NSMinuteCalendarUnit;

对于您的情况,这意味着您可以创建 5 个通知,fireDates 间隔 10 秒,每个通知都有一个 repeatIntervalNSMinuteCalendarUnit。这将导致用户无限期地每 10 秒接收一次通知,而您只会安排 5 次通知,这远低于 64 次的限制。

这种技术的唯一缺点是在用户打开应用程序之前无法停止通知,因为您需要取消所有通知才能停止它们,并且您只能在应用程序运行时执行此操作正在运行。

【讨论】:

完美!但是,只是一个疑问,您不能只分配 repeatInterval = 10 还是应该只是一个 calendarUnit ?? 只能是NSCalendarUnitrepeatInterval 使用 enum 的值 NSCalendarUnit,所以你不能只分配一个任意值并期望它理解它。 有很多人抱怨这个(尤其是here),但是苹果没有做任何事情来增加自定义重复间隔,所以我想你应该通过归档来加入抱怨bug report. 我们可以在一天中的 5 个不同时间添加从开始日期到结束日期的通知吗???? @iphonemaclover 没有。您必须安排多个通知。【参考方案2】:

没有办法做到这一点。

如果您的应用处于终止状态或后台时收到通知,则不会调用任何委托。

注意:

一次只能安排 64 个本地通知。可能警报应用正在使用UILocalNotification 的repeatInterval 属性

例如:

notification.repeatInterval = NSDayCalendarUnit;

每天都会重复。

【讨论】:

@mayuur:你知道有这样功能的闹钟应用吗?如果是,请分享它的链接。【参考方案3】:

我有一个做同样事情的锻炼应用程序,但我遇到了同样的问题。 我的解决方案是将所有计时器放入“待处理”队列,然后从该队列安排本地通知。

在第一次运行时 - 当用户按下 Go 时 - 当(通知数量 0)时,从待处理队列中删除每个计时器并将其添加到通知队列。

每次应用启动时,在 appDelegate 的 applicationDidFinishLaunchingWithOptions 中检查是否 ([notificationsQueue count] 0]) 并填充通知队列。如果待处理队列中超过 64 个,它们会一直保留在那里,直到应用启动并且通知队列中有空间。

队列系统运行良好。

它无法解决用户在 64 个通知内未打开应用程序的问题,但是,在我的测试中,用户从未接近创建 64 个锻炼计时器,并且很少超过 30 个。而且,它相当用户打开应用程序以暂停计时器很常见,此时队列逻辑处理充值通知。

我从来没有遇到过这种方法的问题。再说一次,如果您的计时器相同(10/15 秒),则 repeatInterval 将完成 PartiallyFinite 所写的工作......而我正在写这个:)

结束。

史蒂夫

【讨论】:

是的,我之前也实现过。但正如您已经知道的,这对于 10/15 秒的计时器是不可能的!【参考方案4】:

当收到本地通知时,在 AppDelegate 中调用此方法。您可以在这里为所欲为。

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
    NSLog(@"recieved notification %@", notification);

【讨论】:

只有当用户打开不是我想要的应用程序时才会调用此方法 如果不打开应用程序,您将无法对应用程序执行任何操作 据我所知,他们只使用本地通知。他们最多可以设置 64 个通知。我认为这已经足够了,因为当您打开应用程序时旧的通知会被取消。

以上是关于当本地通知到达或超过可以使用的通知总数时做一些事情的主要内容,如果未能解决你的问题,请参考以下文章

当用户到达特定位置时向用户发送推送通知 [IOS]

推送到达时显示警报

如何在通知标题上有上标

如果当前日期时间超过预定日期时间,如何删除本地通知?

当我的应用程序处于后台或关闭时,当远程推送通知到达时从有效负载中获取数据

PHP Javascript?当用户关闭页面或浏览器时做一些事情[重复]