在后台应用时,使用推送通知更新徽章

时间:2013-01-10 11:15:29

标签: ios apple-push-notifications

我有推送通知正常工作,并设法在应用程序被带到前台时更新图标徽章计数。

我对此感到有些困惑...虽然iPhone收到通知,但弹出消息似乎会激活我的应用程序,并且徽章仅在我启动应用程序后更新。

这在用户体验方面听起来不对。我的理解是,徽章计数应该通过增加的计数通知用户需要采取什么行动,但这种情况不会发生在应用程序生效的后期阶段。

有没有办法告诉应用程序在收到推送通知时以及在后台时更新其徽章计数?

请注意,我的应用不使用位置,并且我在通知注册请求中有UIRemoteNotificationTypeBadge

干杯 AF

12 个答案:

答案 0 :(得分:62)

由于推送通知由iOS而非您的应用处理,因此您无法在收到推送通知时更改应用徽章。

但您可以在推送通知的有效负载中发送徽章编号,但您必须执行计算服务器端。

您应该阅读Local and Push Notification Programming Guide,尤其是The Notification Payload

有效载荷可能如下所示:

{
    "aps" : {
        "alert" : "You got your emails.",
        "badge" : 9
    }
}

现在,应用程序应用程序徽章图标将显示9。

答案 1 :(得分:10)

我们可以通过在推送通知包中发送“徽章”参数来更改我们处于后台状态时的徽章编号。正如@rckoenes所指出,徽章的JSON参数必须是 INTEGER

用于执行相同操作的示例PHP代码

// Create the payload body
$body['aps'] = array(
        'alert' => $message,
        'badge' => 1,
        'sound' => 'default'
        );

badge => 1其中1是整数而不是字符串(即没有叛逆)

答案 2 :(得分:8)

    **This is the APNS payload get back from server.**

    {
        "aps" : {
            "alert" : "You got your emails.",
            "badge" : 9,
            "sound" : "bingbong.aiff"
        },
        "acme1" : "bar",
        "acme2" : 42
    }

钥匙徽章的值自动被视为徽章计数。在ios应用程序端无需计算或处理计数。 在上面的示例中,9是徽章计数。因此,您的应用图标将显示为9。

注意当您的应用程序关闭时,您无法自行处理徽章。这就是为什么我们使用APNS Payload的徽章密钥 有关通知的更好说明,请参阅文档

如果你想减少自己的徽章数量。减少计数并自己更新。如下所示

答案 3 :(得分:4)

实际上,在iOS 10中,远程通知将自动在您的AppDelegate中调用didReceiveRemoteNotification方法。

您有2种在后台更新徽章计数的方法。
我也为我当前的应用程序完成了此操作。您也不需要Notification Services扩展。

第一种方式

将带有有效载荷的APS徽章密钥发送到APN。
这将根据徽章有效载荷中的Integer值更新徽章计数。例如:

// Payload for remote Notification to APN
{
    "aps": {
        "content-available": 1,
        "alert": "Hallo, this is a Test.",
        "badge": 2, // This is your Int which will appear as badge number,
        "sound": default
    }
}

第二路

当applicationState位于.background中时,您可以切换application.applicationState并更新徽章计数。但是,发送到APN e.x时,请务必不要在Notification负载中设置徽章密钥参数。

// Payload to APN as silent push notification
{
    "aps": {
        "content-available": 1
    }
}

处理徽章更新到应用程序状态

这是我的工作代码,用于更新APN的有效负载中没有徽章密钥的徽章计数。

func application(_ application: UIApplication, didReceiveRemoteNotification 
   userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    print("APN recieved")
    // print(userInfo)

    let state = application.applicationState
    switch state {

    case .inactive:
        print("Inactive")

    case .background:
        print("Background")
        // update badge count here
        application.applicationIconBadgeNumber = application.applicationIconBadgeNumber + 1

    case .active:
        print("Active")

    }
}

重置徽章计数

当您的应用恢复为活动状态时,请不要忘记重置您的徽章计数。

func applicationDidBecomeActive(_ application: UIApplication) {
    // reset badge count
    application.applicationIconBadgeNumber = 0
}

答案 4 :(得分:3)

如果您使用的是NotificationServiceExtension,则可以更新徽章。

var bestAttemptContent : UNMutableNotificationContent? // 
bestAttemptContent.badge = 0//any no you wanna display

每次您的应用程序收到通知时,都会调用您的服务扩展名。将该值保存在用户默认值中并显示它。 要在应用程序和扩展之间共享用户默认值,您需要在应用程序中启用应用程序组。 Read more here

答案 5 :(得分:2)

从iOS 10开始,您可以为您的应用开发Notification Service扩展。它会在您收到通知时由系统启动,您可以计算徽章的有效编号并进行设置。

看看文档: https://developer.apple.com/documentation/usernotifications/unnotificationserviceextension

答案 6 :(得分:1)

对于Firebase Cloud Messaging(FCM),它应该像这样:

{
  "to": "some_token",

  "notification": {
    "body": "this is a body",
    "title": "this is a title",
    "badge" : 1
  }, 

  "priority": "high", 
}

答案 7 :(得分:0)

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {

    application.applicationIconBadgeNumber = 0;
    NSLog(@"userInfo %@",userInfo);

    for (id key in userInfo) {
        NSLog(@"key: %@, value: %@", key, [userInfo objectForKey:key]);
    }

    [application setApplicationIconBadgeNumber:[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue]];
    NSLog(@"Badge %d",[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue]);
}

答案 8 :(得分:0)

正如@rckoenes所说,您将不得不进行计算服务器端,但是您怎么知道何时增加应该在有效载荷中发送的徽章编号值?。

当您启动应用程序时,会向您的服务器发送一条消息,指示该应用程序已启动。因此,在服务器端,您将从badge = 0重新开始,并且虽然服务器没有收到任何消息,但每次推送通知负载都会增加徽章编号。

答案 9 :(得分:0)

在APN有效负载中,必须定义“内容可用”:1,以便在后台模式下更新徽章计数

func application(_ application: UIApplication, didReceiveRemoteNotification 
   userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {


// increase badge count, but no need if you include content-available

application.applicationIconBadgeNumber = application.applicationIconBadgeNumber + 1

}

func applicationDidBecomeActive(_ application: UIApplication) {

// reset badge count

application.applicationIconBadgeNumber = 0

}

例如

"aps":{
    "alert":"Test",
    "sound":"default",
    "content-available":1

}

答案 10 :(得分:0)

传统上,其“徽章”设置计数

{
  "to": "token",
  "notification": {
    "title": "Example",
    "body": "Tiene 22 actualizaciones.",
    "badge":278
  },
  "data": {
    "story_id": "story_12345",
    "count_vaca":22
  }
}

答案 11 :(得分:-1)

打开App时收到远程通知

获取" didBecomeActive"中的当前徽章编号AppDelegate

的方法

使用以下代码的文件:

int badgeCount = [UIApplication sharedApplication].applicationIconBadgeNumber;
    badgeCount = badgeCount + 1;