我最近使用 Amazon SNS 为我的 IOS 应用推送通知。
它运行良好,我遇到的唯一问题是当我收到通知时,角标(Badge)号码不会更新,这是我的实现方式:
首先我按照这里的例子 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。
============================================= =======
我想知道更新角标(Badge)编号的标准方法是什么?
哪个方法是正确的?
1) 通过这样的编程application.applicationIconBadgeNumber = 0;
2) 或者像这样来自服务器有效负载?
$body = array(
'alert' => $message,
'sound' => 'sound.caf',
'badge' => $badge_count // Should be int type
);
============================================= =========
但是,我发现每个方法都有障碍,对于 1),当应用程序处于后台时 didReceiveNotification
没有触发,所以我不能这样做类似于 application.applicationIconBadgeNumber++;
来更新角标(Badge)编号。
对于2),Amazon SNS服务只是返回
$body = array(
'alert' => $message,
);
服务器如何知道角标(Badge)编号并将其添加到服务器负载中,看来我仍然需要在 didReceiveNotification
中将更新角标(Badge)编号发布到亚马逊并将其添加到负载中。但同样,它不会在后台调用。
抱歉,对于 IOS 编程新手,请有经验的程序员指导我通过推送通知实现角标(Badge)号码更新?谢谢。
最佳答案
您应该在推送通知的负载中发送角标(Badge)编号。您的服务器应设置角标(Badge)计数。这样,无论应用程序是否正在运行(也无论用户是否点击通知打开应用程序),角标(Badge)计数都会更新。 您的服务器应该知道要发送什么号码。
至于您的服务器应该如何知道要发送的角标(Badge)编号——我不知道您的应用程序的逻辑,但让我们以电子邮件应用程序为例——假设您希望角标(Badge)编号显示有多少未读消息存在。应用程序应在读取消息时通知服务器,以便服务器可以为每个用户维护正确的角标(Badge)编号。这样,即使用户有多种方式访问数据(iPhone 应用程序、iPad 应用程序、桌面浏览器等),服务器也会知道当前的角标(Badge)计数,并且每个设备都会显示正确的角标(Badge)计数。
application.applicationIconBadgeNumber = 0
用于在打开应用程序后清除角标(Badge)。它应该在 didReceiveRemoteNotification
和 didFinishLaunchingWithOptions
中完成,以便在启动应用程序时或在应用程序处理推送通知时始终清除角标(Badge)编号。
关于ios - 如何更新 IOS 推送通知中的角标(Badge)编号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23993903/