Как правильно установить значение значка приложения в iOS 8?
Старый метод
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:count];
теперь дает ошибку Attempting to badge the application icon but haven't received permission from the user to badge the application
.
Затем я попытался использовать новый API (который, я думаю, связан с значением значка)
CKModifyBadgeOperation * operation = [[CKModifyBadgeOperation alloc] initWithBadgeValue:50];
[operation setModifyBadgeCompletionBlock:^(NSError *error) {
NSLog(@"%@", error);
}];
[operation start];
Но я получаю сообщение об ошибке <CKError 0x165048a0: "Not Authenticated" (9/1002); "This request requires an authenticated account">
Как установить значок или получить новые разрешения?
Ответы
Ответ 1
В дополнение к Daij-Djan ответ: возможно уложить перечисления, чтобы вы могли запросить их все сразу. Например:
UIUserNotificationSettings* notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];
В отчетах об отладке я должен попросить разрешение на использование приложения
Ответ 2
чтобы изменить значок в разделе ios8, вы должны запросить разрешения
let settings = UIUserNotificationSettings(forTypes: UIUserNotificationType.Badge, categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
или в objC
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
Ответ 3
Дополнительная информация для предыдущих сообщений (в комплекте registerUserNotificationSettings
):
Apple создает новый API для регистрации уведомлений и работы с значками.
См. сессию WWDC 2014 video, текстовая версия
и documentation.
Пользователь может изменять разрешения для всех UIUserNotificationType
(UIUserNotificationTypeBadge
, UIUserNotificationTypeSound
, UIUserNotificationTypeAlert
) в настройках.
Перед изменением значка необходимо проверить разрешения.
Пример кода из моего 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)
Метод CurrentUserNotificationSettings
доступен в экземпляре приложения UI и предоставит вам самые последние настройки уведомлений пользователя.
Работа с номером значка:
[self setApplicationBadgeNumber:0];
вместо
application.applicationIconBadgeNumber = 0;
PS: Проверка при компиляции (#ifdef __IPHONE_8_0
) из-за необходимости создавать Xcode5 и Xcode6.
Если у вас нет этой необходимости, код можно упростить.
Ответ 4
Я пишу класс для его обработки, когда я использую 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
}
}
Ответ 5
обновить до 8.3, ObjC: мы должны добавить Daij-Djan script для замены NSLog (@ "доступ запрещен для UIUserNotificationTypeBadge" ); в решении Spidy и KepPM выше. Надеюсь, что это поможет s.o.