当应用程序在后台推送通知时,我的应用程序徽章计数不会增加。仅对于第一个推送通知,计数增加 1,并且徽章计数始终保持为 1,如果我收到超过 1 个通知,徽章计数也仅保持 1。 下面是我的代码
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo {
NSString *message = nil;
id alert = [userInfo objectForKey:@"aps"];
if ([alert isKindOfClass:[NSString class]]) {
message = alert;
}
else if ([alert isKindOfClass:[NSDictionary class]]) {
message = [alert objectForKey:@"alert"];
}
if (alert) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"xyz"
message:message
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:@"Cancel", nil];
alertView.tag=2525;
[alertView show];
}
}
-(void)alertView:(UIAlertView *)alertView
clickedButtonAtIndex:(NSInteger)buttonIndex {
if(alertView.tag==2525) {
[UIApplication sharedApplication].applicationIconBadgeNumber =
[UIApplication sharedApplication].applicationIconBadgeNumber-1;
}
}
您必须从服务器端执行此操作。就我而言,我是通过 php 和 mysql 完成的。这是我的数据库
我添加了一个字段徽章计数,并且每次使用此代码将推送发送到设备时都会增加徽章计数
$query = "SELECT badgecount FROM pushnotifications WHERE device_token = '{$device_token}'";
$query = $this->db->query($query);
$row = $query->row_array();
$updatequery = "update pushnotifications set badgecount=badgecount+1 WHERE device_token ='{$device_token}'";
$updatequery = $this->db->query($updatequery);
$device = $device_token;
$payload['aps'] = array('alert' => $pushmessage, 'badge' =>$row["badgecount"]+1, 'sound' => 'default');
$payload = json_encode($payload);
...
我还制作了另一个 api 来使 badgcount 为 0,这在
中调用- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
因此,当看到通知时,服务器中的通知又为零。
你说你的有效负载是:
aps = { alert = "third testing"; badge = 1; sound = "sound.caf"; };
由于您始终发送
1
来获取徽章计数,因此这就是为您的应用程序显示的徽章计数。徽章计数不是递增的。如果您希望看到徽章计数大于 1,您的服务器应在负载中放入大于 1 的值。
您的服务器应跟踪每个设备应接收的徽章计数。应用程序本身不能保证收到所有推送通知,因此您不能依赖其逻辑来更新徽章计数。
对于我们来说,解决方案是在消息中设置
mutableContent as true
Message.builder().setApnsConfig(
ApnsConfig.builder()
.setAps(Aps.builder().setMutableContent(true).build())
.build())
basgeCount 的增量作为扩展的一部分在应用程序端处理。下面是片段
// Increment badge count
let badgeCountKey = "NotificationBadgeCount"
let userDefaults = UserDefaults(suiteName: "group.com.app.iphone.demo")
let badgeCount = userDefaults?.value(forKey: badgeCountKey) as? Int
if (badgeCount != nil && badgeCount! > 0) {
bestAttemptContent?.badge = NSNumber(value: Int32(badgeCount! + 1))
userDefaults?.set(badgeCount! + 1, forKey: badgeCountKey)
} else {
bestAttemptContent?.badge = 1
userDefaults?.set(1, forKey: badgeCountKey)
}