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?
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
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];
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é.
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
}
}
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.