我最近使用Amazon 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。
================================================== ====
我想知道更新徽章编号的标准方法是什么?
哪个方案是正确的?
1)通过这样的编程 application.applicationIconBadgeNumber = 0;
2)还是从服务器的有效载荷这样?
$body = array(
'alert' => $message,
'sound' => 'sound.caf',
'badge' => $badge_count // Should be int type
);
================================================== ======
但是,我发现每个方法都有一个障碍,对于1),didReceiveNotification
当应用程序在后台运行时,它不会触发,因此我无法做一些application.applicationIconBadgeNumber++;
更新徽章编号的操作。
对于2),仅返回Amazon SNS服务
$body = array(
'alert' => $message,
);
以及服务器如何才能知道徽章编号并将其添加到服务器有效负载中,看来我仍然需要将更新徽章编号发布到Amazon中didReceiveNotification
并将其添加到有效负载中。但同样,它并不要求背景。
对IOS编程的新手感到抱歉,有经验的程序员会不会乐意指导我实施带有推送通知的徽章编号更新?谢谢。
你应该在推送通知的有效负载中发送徽章编号。你的服务器应设置徽章计数。这样,无论应用程序是否正在运行(无论用户是否点击通知以打开应用程序),徽章计数都将被更新。你的服务器应该知道要发送什么号码。
至于服务器应该如何知道要发送的徽章编号-我不知道你的应用程序的逻辑,但是以电子邮件应用程序为例-假设你希望徽章编号显示存在多少未读邮件。每当读取消息时,应用程序都应通知服务器,以便服务器可以为每个用户维护正确的徽章编号。这样,即使用户有多种访问数据的方式(iPhone应用程序,iPad应用程序,桌面浏览器等),服务器也会知道当前的徽章计数,并且每个设备都将显示正确的徽章计数。
的application.applicationIconBadgeNumber = 0
目的是在打开应用程序后清除徽章。应该在didReceiveRemoteNotification
和中都进行此操作didFinishLaunchingWithOptions
,以便在启动应用程序或由应用程序处理推送通知时,将始终清除徽章编号。
感谢您的答复,这意味着我应该使用在问题中提到的方法2)。但是,如何将徽章编号发布到服务器上?由于didReceiveRemoteNotification不在后台运行。确切地说,我应该在哪里放置徽章编号功能?谢谢
@ user782104当用户点击通知或点击应用程序图标以启动应用程序时,应该将徽章编号更新发布到服务器上,因为无论哪种情况,您都希望通知服务器用户已查看了所有消息。因此,您应同时在
didReceiveRemoteNotification
和中执行此操作didFinishLaunchingWithOptions
。抱歉,我很困惑。如果仅在用户单击通知/应用程序图标中的任何一个时更新,那么当应用程序处于后台时,如果有两个或多个通知,该怎么办?那么它将不会被更新?谢谢
@ user782104如果用户未与您的应用进行交互,则该数字仅应在服务器发送带有增加的徽章编号的通知(由于服务器上可用的新数据)时增加,或者在服务器发送带有减少的徽章编号的通知时减小(如果用户通过其他设备查看数据)。仅当用户通过您的应用查看通知时(为此用户必须点击通知/应用图标),您才应清除徽章并通知服务器为该用户重置徽章编号。
查看推送通知后,如何通知服务器,发送带有新徽章计数的POST请求?