更新徽章与推送通知,而在后台的应用程序

我有推送通知工作,并设法更新图标徽章计数,当应用程序被带到前台。

我有点困惑,虽然… iPhone收到通知,popup信息似乎激活我的应用程序,徽章只会在我启动应用程序后更新。

这在用户体验方面听起来不太合适。 我的理解是,徽章计数应该通过递增计数来通知用户需要采取的行动,但是直到稍后的应用程序生效阶段才会发生。

那么有没有办法告诉应用程序更新其徽章计数,当它收到推送通知,并在后台?

请注意,我的应用程序不使用位置,并且在通知注册请求中有UIRemoteNotificationTypeBadge

干杯AF

由于推送通知是由iOS处理的,而不是由您的应用程序处理的,您不能在收到推送通知时更改应用程序标识。

但是您可以在推送通知的有效负载中发送徽章号码,但是您必须执行计算服务器端。

你应该阅读本地和推送通知编程指南 ,特别是通知有效载荷 。

有效载荷可能如下所示:

 { "aps" : { "alert" : "You got your emails.", "badge" : 9 } } 

现在应用程序应用程序徽章图标将显示9。

通过在推送通知包中发送“badge”参数,我们可以在处于后台状态时更改徽章号码。 正如@rckoenes所指出的,徽章的JSON参数必须是INTEGER

示例PHP代码做相同的

 // Create the payload body $body['aps'] = array( 'alert' => $message, 'badge' => 1, 'sound' => 'default' ); 

badge => 1其中1是一个整数不是一个string(也就是说,不带外部的)

  **This is the APNS payload get back from server.** { "aps" : { "alert" : "You got your emails.", "badge" : 9, "sound" : "bingbong.aiff" }, "acme1" : "bar", "acme2" : 42 } 

钥匙徽章的价值被自动视为徽章计数。在iOS应用程序方面不需要计算或处理计数。 在上面的例子中,9是徽章数。所以你的应用程序图标将显示9。

注意当您的应用程序closures时,您无法自行处理徽章。这就是为什么我们使用来自APNS Payload的徽章密钥为了更好地了解通知,请参阅文档

如果你想减less自己的徽章数。减less计数,并自行更新。如下

 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { application.applicationIconBadgeNumber = 0; NSLog(@"userInfo %@",userInfo); for (id key in userInfo) { NSLog(@"key: %@, value: %@", key, [userInfo objectForKey:key]); } [application setApplicationIconBadgeNumber:[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue]]; NSLog(@"Badge %d",[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue]); } 

正如@ rckoenes所说,你将不得不做计算服务器端,但你怎么知道何时增加你应该发送的有效载荷的徽章号码值。

当你启动应用程序的时候会向你的服务器发送一条消息,表明这个应用程序已经启动了。 因此,在服务器端,您再次从badge = 0开始,并且服务器没有收到消息,并且每次推送通知有效负载都会增加徽章号。

当你打开App时收到远程通知后,

在您的AppDelegatedidBecomeActive ”方法中获取当前的徽章号码。

使用下面的代码文件:

 int badgeCount = [UIApplication sharedApplication].applicationIconBadgeNumber; badgeCount = badgeCount + 1; 

如果您正在使用NotificationServiceExtension,则可以在其中更新徽章。

 var bestAttemptContent : UNMutableNotificationContent? // bestAttemptContent.badge = 0//any no you wanna display 

每当您的应用程序收到通知您的服务扩展将被称为.Save这个价值的用户默认,并显示它。 要在应用程序和扩展之间共享用户默认值,您需要在应用程序中启用应用程序组。 在这里阅读更多