web-dev-qa-db-ja.com

fcmプッシュ通知を受信したときのアプリバッジの設定

クラウドメッセージングにFCMを使用しています。バックグラウンドおよびフォアグラウンドのアプリの状態でサーバーからプッシュ通知を受信したときにアプリのバッジを追加したい。私は何が欠けていますか?主な問題は、プッシュ通知に従ってアプリバッジを追加/更新/削除することです。プッシュメッセージを受信して​​処理できます。この問題は3日間です。お願い助けて !? *バッジ番号は、Gmailアプリに受信した新しいメールメッセージの場合、バックグラウンドアプリとフォアグラウンドアプリの両方の状態で未読メッセージ数に変更されるなど、内部のコンテンツに応じて変更されます。

xCode 9.2を使用、Swift 3.2、iOS 11.6

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    FirebaseApp.configure()
    var fcmtoken: String = ""

    if #available(iOS 10.0, *) {
        // For iOS 10 display notification (sent via APNS)
        UNUserNotificationCenter.current().delegate = self

        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(
            options: authOptions,
            completionHandler: {_, _ in })
    } else {
        let settings: UIUserNotificationSettings =
            UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        application.registerUserNotificationSettings(settings)
    }

    application.registerForRemoteNotifications()

    if let token = Messaging.messaging().fcmToken {
        fcmtoken = token
        print("FCM token: \(fcmtoken)")
    } else {
        print("FCM token: \(fcmtoken) == no FCM token")
    }

    return true
}

func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
    print("Firebase registration token: \(fcmToken)")

    Messaging.messaging().subscribe(toTopic: "all")
    print("subscribed to all topic in didReceiveRegistrationToken")

    // TODO: If necessary send token to application server.
    // Note: This callback is fired at each app startup and whenever a new token is generated.
}


func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) {
    Messaging.messaging().subscribe(toTopic: "all")
    print("subscribed to all topic in notificationSettings")
}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {

    print("userInfo -- \(userInfo)")

}

@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

    let userInfo = response.notification.request.content.userInfo
    print("user info in didReceive response -- \(userInfo)")

}


@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

    print("called to foreground app")
}

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

    Messaging.messaging().subscribe(toTopic: "all")
    print("subscribed to all topic in didRegisterForRemoteNotificationsWithDeviceToken")
}
7
BatyrCan

ペイロードはあなたのコンテンツです:

私たちがやったことの多くは、ローカル通知のトリガーを置き換えます。通知のコンテンツはペイロードにあります。テストプラットフォームに戻ると、次のことがわかります。

{"aps":{"alert":"Enter your message","badge":1,"sound":"default"}}

理想的には、JSONファイルは次のようになります。ペイロードには4Kしかないため、スペースを無駄に使用するのは面倒です。ペイロードを送信するときは、空白を避けてください。しかし、彼らはこのように読むのが難しいです。次のようになります。

{
 "aps":{
        "alert":"Enter your message",
        "badge":1,
        "sound":"default"
 }
}

Apsは、コンテンツを説明するエントリを持つJSON辞書です。アラートエントリは、ここにあるような文字列でも、デバイスに表示されるアラートの内容を説明する辞書でもかまいません。バッジは、バッジアイコンに表示する番号を示します。サウンドはデフォルトのサウンドを再生します。このペイロードを変更して、アラートに表示されるコンテンツを変更できます。アラートは辞書または文字列の両方である可能性があるため、アラートをさらに追加できます。ペイロードをこれに変更します:

{
 "aps":{
        "alert":{
                "title":"Push Pizza Co.",
                "body":"Your pizza is ready!"
         },
            "badge":42,
            "sound":"default"
 }
}

これにより、タイトルとピザの準備に関するメッセージが追加されます。また、バッジを42に変更します

{"aps":{"alert":{"title":"Push Pizza Co.","body":"Your pizza is ready!"},"badge":42,"sound":"default"}}

enter image description here

通知がタイトルと本文とともに表示されます。バッジは番号42で表示されます。

ただし、アプリがアクティブなときに変更することもできます。 UserNotificationTypeを登録することにより、ユーザーの許可が必要になります。許可を得たら、希望する番号に変更できます。

  application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: UIUserNotificationType.Sound | UIUserNotificationType.Alert |
    UIUserNotificationType.Badge, categories: nil
    ))

application.applicationIconBadgeNumber = 5

次のようにすることもできます:

  let badgeCount: Int = 10
    let application = UIApplication.shared
    let center = UNUserNotificationCenter.current()
    center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in
        // Enable or disable features based on authorization.
    }
    application.registerForRemoteNotifications()
    application.applicationIconBadgeNumber = badgeCount

結果:

enter image description here

注:バッジのアプリ許可を確認してください: enter image description here

リファレンス: https://makeapppie.com/2017/01/03/basic-Push-notifications-in-ios-10-and-Swift/

8