web-dev-qa-db-fra.com

Comment définir correctement la valeur du badge d'application dans iOS 8?

Ancienne méthode

[[UIApplication sharedApplication] setApplicationIconBadgeNumber:count];

est maintenant donne l'erreur Attempting to badge the application icon but haven't received permission from the user to badge the application.

Ensuite, j'ai essayé d'utiliser une nouvelle API (qui, je pense, est liée à la valeur du badge)

CKModifyBadgeOperation * operation = [[CKModifyBadgeOperation alloc] initWithBadgeValue:50];
[operation setModifyBadgeCompletionBlock:^(NSError *error) {
      NSLog(@"%@", error);
}];
[operation start];

Mais je reçois une erreur <CKError 0x165048a0: "Not Authenticated" (9/1002); "This request requires an authenticated account">

Comment définir un badge ou recevoir de nouvelles autorisations?

36
Roman Truba

En plus de la réponse de Daij-Djan: il est possible d'empiler les énumérations pour pouvoir les demander toutes en même temps. Comme suit:

UIUserNotificationSettings* notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];

La sortie de débogage mentionne que je devrais demander la permission du badge d'application

39
Departamento B

pour modifier le badge sous ios8, vous devez demander des autorisations

    let settings = UIUserNotificationSettings(forTypes: UIUserNotificationType.Badge, categories: nil)
    UIApplication.sharedApplication().registerUserNotificationSettings(settings)

ou en objC

UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
36
Daij-Djan

Informations supplémentaires pour les articles précédents (au complet à registerUserNotificationSettings):

Apple crée une nouvelle API pour l'enregistrement des notifications et l'utilisation des badges.

Voir la session WWDC 2014 vidéo , version texte et documentation .

L'utilisateur peut modifier les autorisations pour chaque UIUserNotificationType (UIUserNotificationTypeBadge, UIUserNotificationTypeSound, UIUserNotificationTypeAlert) dans les paramètres.

Avant de changer de badge, vous devez vérifier les autorisations.

Échantillon de code de mon AppDelegate:

#ifdef __IPHONE_8_0

- (BOOL)checkNotificationType:(UIUserNotificationType)type
{
    UIUserNotificationSettings *currentSettings = [[UIApplication sharedApplication] currentUserNotificationSettings];

    return (currentSettings.types & type);
}

#endif

- (void)setApplicationBadgeNumber:(NSInteger)badgeNumber
{
    UIApplication *application = [UIApplication sharedApplication];

    #ifdef __IPHONE_8_0
    // compile with Xcode 6 or higher (iOS SDK >= 8.0)

    if(SYSTEM_VERSION_LESS_THAN(@"8.0"))
    {
        application.applicationIconBadgeNumber = badgeNumber;
    }
    else
    {
        if ([self checkNotificationType:UIUserNotificationTypeBadge])
        {
            NSLog(@"badge number changed to %d", badgeNumber);
            application.applicationIconBadgeNumber = badgeNumber;
        }
    else
        NSLog(@"access denied for UIUserNotificationTypeBadge");
    }

    #else
    // compile with Xcode 5 (iOS SDK < 8.0)
    application.applicationIconBadgeNumber = badgeNumber;

    #endif
}

#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

La méthode CurrentUserNotificationSettings est disponible dans l'instance d'application UI et vous donnera les préférences de notification utilisateur les plus à jour.

Travailler avec le numéro de badge:

[self setApplicationBadgeNumber:0];

au lieu de

application.applicationIconBadgeNumber = 0;

PS: Vérification à la compilation (#ifdef __IPHONE_8_0) en raison de la nécessité de construire dans Xcode5 et Xcode6. Si vous n'avez pas ce besoin, le code peut être simplifié.

22
KepPM

J'écris une classe pour le gérer lorsque j'utilise Swift:

class ZYUtility
{
    /// Set badge
    class func setApplicationBadgeNumber(badge: Int) {
        if ZYUtility.SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO("8.0") {
            if UIApplication.sharedApplication().currentUserNotificationSettings().types & UIUserNotificationType.Badge != nil {
                UIApplication.sharedApplication().applicationIconBadgeNumber = badge
            } else {
                println("No permission to set badge number")
            }
        } else {
            UIApplication.sharedApplication().applicationIconBadgeNumber = badge
        }
    }

    /// System check
    class func SYSTEM_VERSION_EQUAL_TO(version: String) -> Bool {
        return UIDevice.currentDevice().systemVersion.compare(version,
            options: NSStringCompareOptions.NumericSearch) == NSComparisonResult.OrderedSame
    }

    class func SYSTEM_VERSION_GREATER_THAN(version: String) -> Bool {
        return UIDevice.currentDevice().systemVersion.compare(version,
            options: NSStringCompareOptions.NumericSearch) == NSComparisonResult.OrderedDescending
    }

    class func SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(version: String) -> Bool {
        return UIDevice.currentDevice().systemVersion.compare(version,
            options: NSStringCompareOptions.NumericSearch) != NSComparisonResult.OrderedAscending
    }

    class func SYSTEM_VERSION_LESS_THAN(version: String) -> Bool {
        return UIDevice.currentDevice().systemVersion.compare(version,
            options: NSStringCompareOptions.NumericSearch) == NSComparisonResult.OrderedAscending
    }

    class func SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(version: String) -> Bool {
        return UIDevice.currentDevice().systemVersion.compare(version,
            options: NSStringCompareOptions.NumericSearch) != NSComparisonResult.OrderedDescending
    }
}
1
ZYiOS

mise à jour vers 8.3, ObjC: nous devons ajouter le script Daij-Djan pour remplacer NSLog (@ "accès refusé pour UIUserNotificationTypeBadge"); dans la solution Spidy & KepPM ci-dessus. J'espère que cette aide s.o.

0
Nik