Тест UNNotificationSettings
Результат теста всегда равен 0, так как код после getNotificationSettingsWithCompletionHandler: блок выполняется до того, как в блоке будет установлено значение notificationsAlertAuthorization.
Как мне решить эту проблему?
в AppDelegate.h:
- (BOOL)testNotificationsAuthorization;
в AppDelegate.m:
- (BOOL)testNotificationsAuthorization {
__block BOOL notificationsAlertAuthorization = 0;
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
if (settings.alertSetting == UNNotificationSettingEnabled) {
notificationsAlertAuthorization = YES;
NSLog(@"settings.alertSetting: YES");
}
}];
// gets executed before notificationsAlertAuthorization is set,
// result is always NO.
if (notificationsAlertAuthorization == YES) {
NSLog(@"Alert Authorization Granted");
return YES;
} else {
NSLog(@"Alert Authorization NOT Granted");
return NO;
} }
в ViewController:
- (IBAction)testForNotificationSettings:(UIButton *)sender {
BOOL result = [[[UIApplication sharedApplication] delegate] testNotificationsAuthorization];
NSLog(@"testForNotificationSettings result: %d", result);}
журнал:
2016-11-20 17: 18: 51.221 UserNotificationsTest [11873: 536763] Авторизация оповещения НЕ предоставлена 2016-11-20 17:18:51.222 UserNotificationsTest[11873:536763] testForNotificationSettings result: 0 2016-11-20 17:18:51.223 UserNotificationsTest[11873:536812] settings.alert Настройка: ДА
1 ответ
Вам нужно использовать CompletionHandlers
чтобы получить результат, так как вы получаете статус для Уведомления в CompletionHandle и, прежде чем получить результат, вы сравниваете его, поэтому вы получаете неправильный результат.
Измените свой метод, как это
-(void) testNotificationsAuthorization :(void (^)(BOOL isActive))handler {
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
if (settings.alertSetting == UNNotificationSettingEnabled) {
handler(YES);
NSLog(@"settings.alertSetting: YES");
} else {
NSLog(@"settings.alertSetting: NO");
handler(NO);
}
}];
}
и использовать это так
[[[UIApplication sharedApplication] delegate] isNotificationActive:^(BOOL isActive) {
if (isActive) {
NSLog(@"settings.alertSetting: YES");
} else {
NSLog(@"settings.alertSetting: NO");
}
}];