web-dev-qa-db-ja.com

アプリケーションアイコンのバッジ数が増加しない:Xcode

プッシュ通知アプリケーションのバッジ番号の値の更新で問題が発生しています。

私は次のようにしています:

-(void)application:(UIApplication *)application 
       didReceiveRemoteNotification:(NSDictionary *)userInfo {

       UIApplicationState state = [application applicationState];
       if (state == UIApplicationStateActive) {
          // do stuff when app is active

       }else{
          // do stuff when app is in background
          [UIApplication sharedApplication].applicationIconBadgeNumber = 
          [UIApplication sharedApplication].applicationIconBadgeNumber+1;  
               /* to increment icon badge number */
       }
 }

ただし、アイコンにはバッジ番号が常に「1」と表示されており、通知がさらにある場合、または通知が次々に送信される場合は、アイコンは増加しません。

アドバイスはかなりあります...

18

バッジ番号は、次のようなJSON通知ペイロードを受信したときに、オペレーティングシステムによって設定されます。

{
    "aps" : {
        "alert" : "New notification!",
        "badge" : 2
    }
}

ご覧のとおり、badgeキーに正しい数値を設定するのはサーバーです。サーバーは、各ユーザーの保留中の通知の数を追跡または計算し、通知をAppleに送信する前にbadge数を生成する必要があります。

クライアントの責任は、ユーザーが通知を表示したときに通知バッジをクリアするか、それを減らすことです。そうするためのコードは

application.applicationIconBadgeNumber = application.applicationIconBadgeNumber - 1; // Decrement counter

または

application.applicationIconBadgeNumber = 0; // Reset counter assuming the user is able to see all notifications at once.
32
Daniel Martín

代わりに静的変数を作成して、applicationIconBadgeNumberに割り当てることができます。

static int i=1;
[UIApplication sharedApplication].applicationIconBadgeNumber = i++;
6
coppertop

同じ問題があり、intを作成することで解決しました。 class.hの変数

このような :

カスタムクラス。H

@property int badge;

カスタムクラス。M

-(id)init{

_badge=0;

self = [super init];
if (self) {

}
return self;}

-(void)reminderCreator:(NSDate*)onTime withText:(NSString*)text{

_badge += 1;

UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = onTime;
localNotification.alertBody = text;
localNotification.soundName=UILocalNotificationDefaultSoundName;

localNotification.applicationIconBadgeNumber=_badge;

[[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; }

したがって、このカスタムクラスをどこかで(おそらくviewControllerで)初期化し、reminderCreatorメソッドを数回呼び出して少数のlocalNotificationsを設定すると、各通知に増分した番号が割り当てられます。

これが役に立った場合は+1 :)

4
Archil Vardidze

-(void)application:didReceiveRemoteNotification:は、アプリがフォアグラウンドで実行されている場合にのみ呼び出されます。

アプリが実行されていないときにバッジを増やしたい場合は、バッジ番号を プッシュ通知ペイロード に設定する必要があります。プッシュ通知ペイロードのbadgeプロパティはバッジ番号として使用されるため、サーバー側でバッジ番号を追跡する必要があります。バッジ番号はません

システムは受信したプッシュ通知を処理するので、受信したプッシュ通知はアプリに通知されません。アプリがフォアグラウンドで実行されている場合にのみ、-(void)application:didReceiveRemoteNotification:が呼び出されます。アプリがフォアグラウンドにないときにプッシュ通知に応答する方法はありません。

3
rckoenes

はい、値が2に増えているにもかかわらず、常にbadgeNumber 1が返されるようです。

そのようなコードを使用する場合:

// update badge count
        let currentBadgeCount = UIApplication.shared.applicationIconBadgeNumber
        let badge = (aps["badge"] as? Int) ?? 1
        UIApplication.shared.applicationIconBadgeNumber = currentBadgeCount + badge

だから私は唯一の解決策はそれをUserDefaultsに保存してからUserDafaultsの値を更新し、次に設定してバッジ数を更新することだと思いますか?

これはうまくいくはずです:

static var notificationsCount: Int {
        set {
            let userDefaults = UserDefaults(suiteName: SharedAppData.appGroup)
            userDefaults?.set(newValue, forKey: "notificationsCount")

            UIApplication.shared.applicationIconBadgeNumber = newValue
        }
        get {
            let userDefaults = UserDefaults(suiteName: SharedAppData.appGroup)
            return userDefaults?.integer(forKey: "notificationsCount") ?? 0
        }
    }

その後

SharedAppData.notificationsCount = 0 //バッジ数をリセットする

そしてこれは増加する

 // update badge count
        SharedAppData.notificationsCount += 1
0
Michał Ziobro