测试 UNNotificationSettings
Test 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 结果:0
2016-11-20 17:18:51.223 UserNotificationsTest[11873:536812] settings.alertSetting: 是
您需要使用 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");
}
}];
测试结果始终为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 结果:0 2016-11-20 17:18:51.223 UserNotificationsTest[11873:536812] settings.alertSetting: 是
您需要使用 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");
}
}];