94

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

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

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

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

私のアプリは位置情報を使用しておらずUIRemoteNotificationTypeBadge、通知登録リクエストに含まれていることに注意してください。

4

12 に答える 12

92

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

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

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

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

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

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

于 2013-01-10T11:25:41.020 に答える
19

didReceiveRemoteNotification実際、iOS 10では、リモート通知がAppDelegateの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
}
于 2018-11-05T17:58:43.730 に答える
11

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

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

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

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

于 2013-05-09T07:26:11.713 に答える
7
    **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ペイロードのバッジキーを使用しています。通知の詳細については、ドキュメントを参照してください。

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

于 2017-04-19T14:16:26.153 に答える
6

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

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

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

于 2017-11-08T08:10:28.723 に答える
3

iOS 10以降、アプリの通知サービス拡張機能を開発できます。通知を受信するとシステムによって開始され、バッジの有効な数を計算して設定できます。

ドキュメントを見てください: https ://developer.apple.com/documentation/usernotifications/unnotificationserviceextension

于 2017-11-21T08:30:29.260 に答える
3

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

{
  "to": "some_token",

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

  "priority": "high", 
}
于 2019-10-24T14:05:45.640 に答える
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]);
}
于 2013-01-10T11:31:46.517 に答える
0

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

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

于 2016-02-16T08:46:25.173 に答える
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

}
于 2018-12-01T09:49:39.133 に答える
0

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

{
  "to": "token",
  "notification": {
    "title": "Example",
    "body": "Tiene 22 actualizaciones.",
    "badge":278
  },
  "data": {
    "story_id": "story_12345",
    "count_vaca":22
  }
}
于 2019-11-05T06:19:10.507 に答える
-2

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

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

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

int badgeCount = [UIApplication sharedApplication].applicationIconBadgeNumber;
    badgeCount = badgeCount + 1;
于 2014-11-18T13:32:52.877 に答える