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

Abo*_*oud 66 apple-push-notifications ios

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

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

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

那么是否有一种方法可以告诉应用程序在收到推送通知时以及在后台时更新其徽章计数?

请注意,我的应用程序不使用位置和我UIRemoteNotificationTypeBadge在通知注册请求中.

干杯AF

rck*_*nes 66

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

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

您应该阅读本地和推送通知编程指南,尤其是通知有效负载.

有效负载可能如下所示:

{
    "aps" : {
        "alert" : "You got your emails.",
        "badge" : 9
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我再次看看我的有效负载结构,似乎我将badge参数的值作为字符串'4'而不是int 4传递!现在我让它工作了......谢谢你的帮助 (9认同)
  • 您无需在推送通知有效负载中设置徽章编号. (6认同)
  • 我已经这样做了...但只有当我的应用程序被带到前台时才会检索此值,我稍后会使用[UIApplication sharedApplication]更新徽章值.applicationIconBadgeNumber = count; (4认同)
  • 实际上在 iOS 10 中,应用程序端完全支持这一点。请参阅下面我的回答。/sf/answers/3721182391/ (2认同)

pra*_*jul 10

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

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

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

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


Gki*_*kan 7

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

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

第一种方式

将带有有效载荷的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
    }
}
Run Code Online (Sandbox Code Playgroud)

第二路

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

// Payload to APN as silent push notification
{
    "aps": {
        "content-available": 1
    }
}
Run Code Online (Sandbox Code Playgroud)

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

这是我的工作代码,用于在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")

    }
}
Run Code Online (Sandbox Code Playgroud)

重置徽章计数

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

func applicationDidBecomeActive(_ application: UIApplication) {
    // reset badge count
    application.applicationIconBadgeNumber = 0
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您发送带有内容可用密钥的 APS,无论应用程序的状态如何,它都将运行 didReceiveRemoteNotification 方法。只需使用本机设备尝试一下即可。如果您使用的是 iOS,则可以使用此工具将 JSON 对象发送到 APN:https://github.com/noodlewerk/NWPusher (3认同)

Pra*_*dey 6

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

    {
        "aps" : {
            "alert" : "You got your emails.",
            "badge" : 9,
            "sound" : "bingbong.aiff"
        },
        "acme1" : "bar",
        "acme2" : 42
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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


Sur*_*put 6

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

var bestAttemptContent : UNMutableNotificationContent? // 
bestAttemptContent.badge = 0//any no you wanna display
Run Code Online (Sandbox Code Playgroud)

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


Але*_*бич 5

对于 Firebase 云消息传递 (FCM),它应该是这样的:

{
  "to": "some_token",

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

  "priority": "high", 
}
Run Code Online (Sandbox Code Playgroud)