gpt4 book ai didi

iPhone:通过本地通知增加应用程序徽章

转载 作者:行者123 更新时间:2023-12-03 18:16:12 24 4
gpt4 key购买 nike

当应用程序未运行时,是否可以通过本地通知增加应用程序徽章?

我知道如何设置徽章,但还没有找到任何方法来增加该值。

localNotification.applicationIconBadgeNumber = 23;

更新:我找到了一个(远非完美的)解决方案。您可以预测如果用户不打开应用并为每个 +1 事件添加通知会发生什么。

一个例子:

  • 第 1 天:计数 = 0
  • 第 2 天:localNotification.applicationIconBadgeNumber = 1;
  • 第 3 天:localNotification.applicationIconBadgeNumber = 2;
  • 第 4 天:localNotification.applicationIconBadgeNumber = 3;

==> 将这些通知放入数组中,并在应用程序退出之前设置它们。

但是,我正在寻找比此解决方法更好的解决方案。

最佳答案

我发现、实现并测试了一种(显然)自动递增应用程序图标徽章编号的“解决方法”,该方法可以很好地处理非重复本地通知

当多个本地通知被触发时,UILocalNotifications 确实不可能让 iOS“自动”更新/增加徽章编号,并且用户“忽略”它们或不立即处理它们,因此它们“堆积”在通知中心。

此外,向您的应用程序“添加一些回调方法”无法处理“自动增量”,因为整个通知事务是由 iOS 在您的应用程序“外部”处理的,您的应用程序甚至不需要运行。

但是有一些解决方法,这是基于我通过实验发现的知识,因为 XCode 文档对徽章属性太模糊了。

  • 徽章只是一个“整数”,实际上更像是您在注册通知之前分配给 applicationIconBadgeNumber 属性的“虚拟标签”。您可以为其指定任何值 - 当通知触发时,iOS 会将值添加到徽章中,无论您在注册通知时将其设置为什么。 iOS 没有神奇的“自动增量”或其他操作(也许这与推送通知不同,但这不是这里的主题)。 iOS 只是从注册的通知中获取数字(整数),并将其放入徽章中。

因此,对于“解决方法”,您的应用必须已经为其新创建的每个通知提供正确的、递增的徽章编号,并“在待处理的通知之上”注册。

由于您的应用无法展望 future ,也无法知道哪些事件将立即处理,哪些事件将“待处理”一段时间,因此需要采取一些技巧:

当您的应用处理通知时(通过点击通知、图标等),您必须:

  1. 获取所有待处理通知的副本
  2. “重新编号”这些待处理通知的徽章编号
  3. 删除所有待处理的通知
  4. 使用更正后的徽章重新注册通知副本再次数字

此外,当您的应用注册新通知时,它必须首先检查有多少通知待处理,然后使用以下命令注册新通知:

badgeNbr = nbrOfPendingNotifications + 1;

看看我的代码,它会变得更清晰。我对此进行了测试,它确实有效:

在“registerLocalNotification”方法中,您应该执行以下操作:

NSUInteger nextBadgeNumber = [[[UIApplication sharedApplication] scheduledLocalNotifications] count] + 1;
localNotification.applicationIconBadgeNumber = nextBadgeNumber;

当你处理通知(appDelegate)时,你应该调用下面的方法,该方法会清除图标上的徽章,并对待处理通知的徽章重新编号(如果有的话)

请注意,下一个代码适用于“顺序”注册事件。如果您要在待处理事件之间“添加”事件,则必须首先对这些事件进行“重新排序”。我没有走那么远,但我认为这是可能的。

- (void)renumberBadgesOfPendingNotifications
{
// clear the badge on the icon
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];

// first get a copy of all pending notifications (unfortunately you cannot 'modify' a pending notification)
NSArray *pendingNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications];

// if there are any pending notifications -> adjust their badge number
if (pendingNotifications.count != 0)
{
// clear all pending notifications
[[UIApplication sharedApplication] cancelAllLocalNotifications];

// the for loop will 'restore' the pending notifications, but with corrected badge numbers
// note : a more advanced method could 'sort' the notifications first !!!
NSUInteger badgeNbr = 1;

for (UILocalNotification *notification in pendingNotifications)
{
// modify the badgeNumber
notification.applicationIconBadgeNumber = badgeNbr++;

// schedule 'again'
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
}
}

要真正做到“防弹”,此方法应该是“原子”(内核)代码,以防止 iOS 在执行此方法期间触发通知。我们必须在这里冒这个风险,这种情况发生的可能性很小。

这是我对 Stackoverflow 的第一个贡献,因此如果我不遵守此处的“规则”,您也可以发表评论

关于iPhone:通过本地通知增加应用程序徽章,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5962054/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com