如何更新IOS推送通知中的徽章号码?

我最近使用亚马逊SNS推送我的IOS应用程序的通知。

它运作良好,我遇到的唯一问题是当我收到通知,徽章号码将不会更新,这里是我如何实现:

首先我按照这里的例子https://aws.amazon.com/articles/9156883257507082这里是教程中的示例代码。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { application.applicationIconBadgeNumber = 0; NSString *msg = [NSString stringWithFormat:@"%@", userInfo]; NSLog(@"%@",msg); [[Constants universalAlertsWithTitle:@"Push Notification Received" andMessage:msg] show]; } -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //Register for push notification application.applicationIconBadgeNumber = 0; [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; if(launchOptions!=nil){ NSString *msg = [NSString stringWithFormat:@"%@", launchOptions]; NSLog(@"%@",msg); [[Constants universalAlertsWithTitle:@"Push Notification Received" andMessage:msg] show]; } self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. Message_BoardViewController *boardViewController = [Message_BoardViewController new]; UINavigationController *navigationController = [UINavigationController new]; navigationController.navigationBar.translucent = NO; [navigationController pushViewController:boardViewController animated:NO]; [boardViewController release]; self.window.rootViewController = navigationController; [navigationController release]; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque]; [self.window makeKeyAndVisible]; // Logging Control - Do NOT use logging for non-development builds. #ifdef DEBUG [AmazonLogger verboseLogging]; #else [AmazonLogger turnLoggingOff]; #endif [AmazonErrorHandler shouldNotThrowExceptions]; return YES; } 

如您所见,从教程代码中可以看出

 application.applicationIconBadgeNumber = 0; 

所以显然每次都会变成0。

================================================== ====

我想知道更新徽章号码的标准方式是什么

哪个appoarch是正确的?

1)通过编程这样application.applicationIconBadgeNumber = 0;

2)或从这样的服务器负载?

  $body = array( 'alert' => $message, 'sound' => 'sound.caf', 'badge' => $badge_count // Should be int type ); 

================================================== ======

然而,我发现每个应用程序都有障碍 ,对于1),应用程序在后台时, didReceiveNotification不会触发,所以我不能做类似application.applicationIconBadgeNumber++;事情application.applicationIconBadgeNumber++; 更新徽章号码。

对于2),亚马逊的SNS服务只是返回

 $body = array( 'alert' => $message, ); 

以及服务器如何知道徽章号码并将其添加到服务器负载,似乎我仍然需要将更新徽章号码发布到Amazon的didReceiveNotification并将其添加到负载中。 但是,它不会在后台调用。

对不起,新的IOS程序,会有一些经验的程序员亲切地指导我实施徽章号码更新与推送通知? 谢谢。

您应该在推送通知的有效负载中发送徽章号码。 您的服务器应设置徽章数量。 这样,无论应用程序是否正在运行或不运行(无论用户是否点击通知以打开应用程序),徽章计数都将被更新。 您的服务器应该知道要发送的号码。

至于你的服务器应该怎么知道要发送的徽章号码 – 我不知道你的应用程序的逻辑,但让我们以一个电子邮件应用程序为例 – 假设你想要徽章号码显示有多less未读邮件存在。 每当读取消息时,应用程序都应该通知服务器,因此服务器可以为每个用户维护正确的标识号。 这样,即使用户有多种方式访问​​数据(iPhone应用程序,iPad应用程序,桌面浏览器等),服务器也会知道当前的徽章数量,并且每个设备都会显示正确的徽章数量。

application.applicationIconBadgeNumber = 0是为了在应用程序打开后清除徽章。 应该在didReceiveRemoteNotificationdidFinishLaunchingWithOptions ,以便在应用程序启动时或应用程序处理推送通知时始终清除徽章号。

你可以做这样的事情。 这里我使用AWS Lambda和AWS SNS。

 var params = { 'TargetArn' : 'Your Target Device', 'MessageStructure' : 'json', 'Message' : JSON.stringify({ 'default' : 'New Request from User', 'APNS_SANDBOX' : JSON.stringify({ 'aps' : { 'alert' : 'New Request from User', 'badge':1,'category' : 'MESSAGE_CATEGORY' }, 'badge' : '1', 'sound' : 'default', 'attribute1' : "attribute 1 value", 'attribute2' : "attribute 2 value", 'attributeN' : "attribute N value" }) }) }; sns.publish(params, function(err, data) { if (err) { console.log(err.stack); return; } console.log('push sent'); console.log(data); context.done(null, 'Function Finished!'); }); 

好的,我想知道如何使用Amazon SNS的徽章号码,如果你用PHP发布你的通知,那么你可以实现这样的徽章

  $sns->publish(array( 'MessageStructure' => 'json', 'TargetArn' => $endpointArn, 'Message' => json_encode(array( 'APNS_SANDBOX' => json_encode(array( 'aps' => array( 'alert' => $push_message, 'badge' => 1 ) )) )), )); 

只要不要忘记在你的appdelegate.m,在onReceive,onLaunchwithoption和onCompletefromBackground上设置徽章为零(不记得激动人心的拼写)