1

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

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

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

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

请帮忙!

4

4 回答 4

1

没有办法做到这一点。

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

笔记:

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

例如:

notification.repeatInterval = NSDayCalendarUnit;

它会每天重复。

于 2013-05-24T12:00:25.540 回答
1

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

notification.repeatInterval = NSMinuteCalendarUnit;

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

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

于 2013-05-24T14:02:31.613 回答
1

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

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

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

队列系统工作得非常完美。

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

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

结束。

史蒂夫

于 2013-05-24T15:35:55.340 回答
-1

当收到本地通知时,在 AppDelegate 中调用此方法。你可以在这里做任何你想做的事。

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
    NSLog(@"recieved notification %@", notification);
}
于 2013-05-24T11:56:43.080 回答