如何在IOS推送通知中更新徽章编号?

时间:2014-06-02 11:52:45

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

我最近使用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。

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

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

哪个appoarch是正确的?

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

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

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

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

但是,我发现每个apporach都有障碍,对于1),当应用程序处于后台时didReceiveNotification不会触发,所以我不能做{ {1}}更新徽章编号。

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

application.applicationIconBadgeNumber++;

并且服务器如何知道徽章编号并将其添加到服务器有效负载中,似乎我仍然需要在$body = array( 'alert' => $message, ); 中将更新徽章编号发布到Amazon并将其添加到有效负载。但同样,它并没有在后台打电话。

很抱歉IOS编程的新手,有些经验的程序员会引导我通过推送通知实施徽章编号更新吗?感谢。

4 个答案:

答案 0 :(得分:7)

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

至于您的服务器应该如何知道要发送的徽章编号 - 我不知道您的应用程序的逻辑,但我们以电子邮件应用程序为例 - 假设您需要徽章编号显示有多少未读消息存在。应用程序应在读取消息时通知服务器,以便服务器可以为每个用户维护正确的徽章编号。这样,即使用户有多种方式来访问数据(iPhone应用程序,iPad应用程序,桌面浏览器等等),服务器也会知道当前的徽章数量,并且每个设备都会显示正确的徽章数量。

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

答案 1 :(得分:2)

你可以这样做。我在这里使用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!');  
});

答案 2 :(得分:0)

好的我弄清楚如何使用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(无法记住拼写错误)中将徽章设置为零

答案 3 :(得分:0)

请注意,此处要识别的关键是发送到AWS的SNS服务的JSON中的属性名称。在您的开发环境中,您将通过APNS沙箱进行发送,因此JSON类似于:

{
    "default": "Test push-to-token notification.",
    "APNS_SANDBOX":"{\"aps\":{\"alert\":\"Test push-to-token notification.\",\"sound\":\"default\",\"badge\": 1}}",
    "GCM":"{\"data\":{\"body\":\"Test push-to-token notification.\",\"action_button_text\":\"OK\",\"sound\":\"default\"}}"
}

投入生产时,您需要将"APNS_SANDBOX"更改为"APNS"。像这样:

{
    "default": "Test push-to-token notification.",
    "APNS":"{\"aps\":{\"alert\":\"Test push-to-token notification.\",\"sound\":\"default\",\"badge\": 1}}",
    "GCM":"{\"data\":{\"body\":\"Test push-to-token notification.\",\"action_button_text\":\"OK\",\"sound\":\"default\"}}"
}