アプリがバックグラウンドにあるときにプッシュ通知でバッジを更新する


82

プッシュ通知が機能し、アプリがフォアグラウンドになったときにアイコンバッジの数を更新することができました。

私はこれについて少し混乱しています... iPhoneが通知を受け取り、ポップアップメッセージが表示されてアプリがアクティブになり、バッジはアプリを起動した後にのみ更新されます。

これは、ユーザーエクスペリエンスの観点からは正しく聞こえません。私の理解では、バッジカウントは、カウントの増分を通じて、アクションが必要なものをユーザーに通知する必要がありますが、これは、アプリが稼働する後の段階まで発生しません。

それで、プッシュ通知を受信したとき、およびバックグラウンドにいる間に、バッジ数を更新するようにアプリに指示する方法はありますか?

私のアプリは場所を使用しておらずUIRemoteNotificationTypeBadge、通知登録リクエストにあることに注意してください。

乾杯AF


アプリアイコンにバッジを表示しますか?
Aman Aggarwal 2013年

タブにカウントを表示しています。そして同じ問題に直面しています。アプリがバックグラウンドにある場合、カウントは増加しません。どうすれば設定できますか?
Srusti Thakkar 2018

回答:


79

プッシュ通知はアプリではなくiOSによって処理されるため、プッシュ通知の受信時にアプリケーションバッジを変更することはできません。

ただし、プッシュ通知のペイロードでバッジ番号を送信することはできますが、計算サーバー側で行う必要があります。

ローカルおよびプッシュ通知プログラミングガイド、特に通知ペイロードを読む必要があります。

ペイロードは次のようになります。

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

これで、アプリアプリケーションのバッジアイコンに9が表示されます。


4
私はすでにそれを行っています...しかし、この値は、アプリがフォアグラウンドに移動したときにのみ取得されます。これは、後で[UIApplication sharedApplication] .applicationIconBadgeNumber = count;を使用してバッジ値を更新するために使用します。
abolfoooud 2013年

7
プッシュ通知ペイロードにバッジ番号を設定する必要はありません。
rckoenes 2013年

11
ペイロード構造をもう一度調べたところ、バッジパラメータの値をint4ではなく文字列「4」として渡していたようです!!! 今、私はそれを機能させました...助けてくれてありがとう
Abolfoooud 2013年

ペイロード構造バッジを変更すると機能しないことをテストしました
2013

1
@wodどういう意味ですか:ペイロード構造バッジの変更。
rckoenes 2013年

11

プッシュ通知パッケージで「バッジ」パラメータを送信することにより、バックグラウンド状態のときにバッジ番号を変更できます。@rckoenesが指摘したようJSONに、バッジのパラメーターはINTEGERでなければなりません。

同じことを行うためのサンプルPHPコード

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

badge => 1 ここで、1は文字列ではなく整数です(つまり、アポストロフィなし)


11

実際、iOS 10では、リモート通知がdidReceiveRemoteNotificationAppDelegateのMethodを自動的に呼び出します。

バックグラウンドでバッジ数を更新する方法は2つあります。
現在のアプリでもこれを実行しました。通知サービス拡張機能も必要ありません。

1番目の方法:

ペイロードとともにAPSバッジキーをAPNに送信します。
これにより、バッジのペイロードの整数値に従ってバッジ数が更新されます。例:

// 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
    }
}

2番目の方法:

application.applicationStateを切り替えて、applicationStateがにあるときにバッジカウントを更新できます.background。ただし、APN exに送信するときは、通知ペイロードにバッジキーパラメータを設定しないように注意する必要があります。

// 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
}

アプリがバックグラウンドで実行されていない場合、バッジをどのように更新しますか?
ナゲンドララオ

1
コンテンツ利用可能なキーを使用してAPSを送信すると、アプリの状態に関係なく、didReceiveRemoteNotificationメソッドが実行されます。ネイティブデバイスで試してみてください。:あなたはiOSの上にある場合は、APNにあなたのJSONオブジェクトを送信するには、このツールを使用することができgithub.com/noodlewerk/NWPusher
Gkiokan

うわー、素晴らしい、そしてコンテンツなしで通知を送信している場合はどうなりますか?(これは、バックグラウンド以外の通知に関するものです)。didReceiveRemoteNotification呼ばれていません
StackExploded

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
    }

キーバッジの値は自動的にバッジ数と見なされます。iOSアプリ側では、数を計算または処理する必要はありません。上記の例では、9がバッジ数です。したがって、アプリアイコンには9が表示されます。

注アプリが閉じている間は、バッジを自分で処理することはできません。そのため、APNSペイロードのバッジキーを使用しています。通知の詳細については、ドキュメントを参照してください。

バッジの数を自分で減らしたい場合は、数を減らして自分で更新してください。次のように


4

NotificationServiceExtensionを使用している場合は、その中でバッジを更新できます。

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

アプリケーションが通知を受信するたびに、サービス拡張機能が呼び出されます。その値をユーザーデフォルトで保存し、表示します。アプリケーションと拡張機能の間でユーザーのデフォルトを共有するには、アプリケーションでアプリグループを有効にする必要があります。 詳細はこちら


その通知数をサーバーに保存し、通知とともに送信できます。
Surjeet Rajput 2018

Firebase Cloud Messagingを使用していますが、その方法を知っていますか?
Ghiggz Pikkoro 2018


1

Firebase Cloud Messaging(FCM)の場合、次のようになります。

{
  "to": "some_token",

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

  "priority": "high", 
}

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]);
}

NSIntegerであるintegerValueの代わりにintValueを使用しているのはなぜですか?@property (readonly) NSInteger integerValue NS_AVAILABLE(10_5, 2_0);
Alex Zavatone 2015

0

@rckoenesが言ったように、計算サーバー側を実行する必要がありますが、ペイロードで送信する必要があるバッジ番号の値をいつインクリメントするかをどのように知ることができますか?

アプリケーションを起動すると、アプリケーションが起動されたことを示すメッセージがサーバーに送信されます。したがって、サーバー側では、badge = 0から再開し、サーバーがメッセージを受信して​​いない間は、プッシュ通知のペイロードごとにバッジ番号を増やします。


0

apnsペイロードでは、バックグラウンドモードでバッジカウントを更新するために「content-available」: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

}

content-available = 1の目的は、バッジではなくサイレント通知です。
マニッシュ

0

レガシーでは、その作業、「バッジ」セット数

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

-1

アプリを開いたときにリモート通知を受信した後、

" didBecomeActive"メソッドの現在のバッジ番号を取得しますAppDelegate

以下のコードを使用してファイルします。

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

3
これは、ユーザーがアプリまたは通知をタップしてアプリを起動するまで機能しません。アプリがバックグラウンドにあるとき、ユーザーがアプリまたは通知を操作する前にバッジを更新することは、OPが望んでいることを行いません。
Alex Zavatone 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.