ios - 如何更新 IOS 推送通知中的角标(Badge)编号?

标签 ios amazon-web-services notifications push-notification apple-push-notifications

我最近使用 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)。它应该在 didReceiveRemoteNotificationdidFinishLaunchingWithOptions 中完成,以便在启动应用程序时或在应用程序处理推送通知时始终清除角标(Badge)编号。

关于ios - 如何更新 IOS 推送通知中的角标(Badge)编号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23993903/

相关文章:

ios - 点击单元格时更改表格单元格内 UILabel 的颜色

amazon-web-services - 使用来自 docker 镜像的 lambda 的 aws localstack,调用时出错错误 : No such container:

android - Android 应用程序监听传入 TCP/IP 消息的最佳方式是什么?

ios - API 请求队列的最佳实践

iphone - iOS从NSString中删除前N个单词

amazon-web-services - Amazon Web Services(EC2、S3、RDS、EBS 等)初学者指南

Android Status Bar Notifications - 选择通知时打开正确的 Activity

安卓锁设备通知不响

ios - 使用 xcode11 在 ios 13 上运行项目时,基于 View Controller 的旋转停止工作

node.js - AWS S3上传0B文件-node.js