Подтвердить что ты не робот

Как правильно установить значение значка приложения в 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">

Как установить значок или получить новые разрешения?

4b9b3361

Ответ 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.