プッシュ通知が機能し、アプリがフォアグラウンドになったときにアイコンバッジカウントを更新することができました。
しかし、これについて少し混乱しています。iPhoneが通知を受信し、ポップアップメッセージが表示されてアプリがアクティブになり、バッジはアプリの起動後にのみ更新されます。
これは、ユーザーエクスペリエンスの観点からは適切ではありません。私の理解では、バッジカウントは、カウントを増やすことでアクションを必要とするものをユーザーに通知する必要がありますが、これはアプリが公開される後の段階まで発生しません。
プッシュ通知を受信し、バックグラウンドにいるときにバッジカウントを更新するようにアプリに指示する方法はありますか?
私のアプリは位置情報を使用せず、通知登録リクエストにUIRemoteNotificationTypeBadge
があることに注意してください。
乾杯
プッシュ通知はアプリではなくiOSによって処理されるため、プッシュ通知の受信時にアプリケーションバッジを変更することはできません。
ただし、プッシュ通知のペイロードでバッジ番号を送信できますが、サーバー側で計算する必要があります。
ローカルおよびプッシュ通知プログラミングガイド 、特に 通知ペイロード をお読みください。
ペイロードは次のようになります。
{
"aps" : {
"alert" : "You got your emails.",
"badge" : 9
}
}
これで、アプリアプリケーションのバッジアイコンに9が表示されます。
プッシュ通知パッケージで"badge"パラメータを送信することにより、バックグラウンド状態にあるときにバッジ番号を変更できます。 @rckoenesが指摘したように、バッジのJSON
パラメーターは[〜#〜] integer [〜#〜]でなければなりません。
サンプルPHP同じことをするためのコード
// Create the payload body
$body['aps'] = array(
'alert' => $message,
'badge' => 1,
'sound' => 'default'
);
badge => 1
ここで、1は文字列ではなく整数です(つまり、アポストロフィなし)
実際、iOS 10では、リモート通知はAppDelegateのdidReceiveRemoteNotification
メソッドを自動的に呼び出します。
バックグラウンドでバッジカウントを更新するには2つの方法があります。
これは現在のアプリでも行っています。 Notification Service Exetension eithierは必要ありません。
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
}
}
ApplicationStateが.background
にある場合、application.applicationStateを切り替えてバッジカウントを更新できます。ただし、APN e.xに送信するときは、通知ペイロードにバッジキーパラメーターを設定しないように注意する必要があります。
// 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
}
**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のバッジキーを使用しているのは、通知に関するより明確な説明については、ドキュメントを参照してください。
自分でバッジの数を減らしたい場合は、数を減らして自分で更新します。
NotificationServiceExtensionを使用している場合、そのバッジを更新できます。
var bestAttemptContent : UNMutableNotificationContent? //
bestAttemptContent.badge = 0//any no you wanna display
アプリケーションが通知を受け取るたびに、サービス拡張が呼び出されます。その値をユーザーのデフォルトに保存して表示します。アプリケーションと拡張機能の間でユーザーのデフォルトを共有するには、アプリケーションでアプリグループを有効にする必要があります。 詳細はこちら
IOS 10以降、アプリ用の通知サービス拡張機能を開発できます。通知を受信するとシステムによって開始され、バッジの有効な数を計算して設定できます。
ドキュメントをご覧ください: https://developer.Apple.com/documentation/usernotifications/unnotificationserviceextension
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
}
-(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]);
}
@rckoenesが言ったように、計算サーバー側を行う必要がありますが、ペイロードで送信する必要があるバッジ番号の値をいつ増やすかをどのように知ることができますか?.
アプリケーションを起動すると、アプリケーションが起動されたことを示すメッセージをサーバーに送信します。そのため、サーバー側では、再びbadge = 0から開始し、サーバーが受信するメッセージがない間は、プッシュ通知ペイロードごとにバッジ番号を増やします。