如何解决试图让 NSUserNotifications 在我的应用程序中工作
我正在尝试更新到 NSUserNotifications。
我已经改变了我的代码的编写方式并改变了它的位置,但同样的事情一直在发生。
在我的 AnotherViewController.h 中
#import <UserNotifications/UserNotifications.h>
#import <UserNotifications/UNUserNotificationCenter.h>
@interface AnotherViewController : UIViewController <UNUserNotificationCenterDelegate>
{
UNAuthorizationoptions UNAuthorizationoptionBadge;;
UNAuthorizationoptions UNAuthorizationoptionAlert;
UNAuthorizationoptions UNAuthorizationoptionSound;
}
@property(readonly,copy) Nsstring *localizedDescription;
在我的 AnotherViewController.m 中
@synthesize localizedDescription;
-(void)viewDidAppear:(BOOL)animated;{
[super viewDidAppear:YES];
NSLog(@"viewDidAppear");
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
if (@available(iOS 14.0,*)) {
if (settings.authorizationStatus == UNAuthorizationStatusEphemeral) {
NSLog(@"Ephermeral");
}
else if (settings.authorizationStatus == UNAuthorizationStatusProvisional) {
NSLog(@"provisional");
}
else if (settings.authorizationStatus == UNAuthorizationStatusAuthorized) {
NSLog(@"authorized");
}
else if (settings.authorizationStatus == UNAuthorizationStatusDenied) {
NSLog(@"denied");
}
else if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) {
NSLog(@"Not determined");
[center requestAuthorizationWithOptions:(self->UNAuthorizationoptionBadge|self->UNAuthorizationoptionAlert|self->UNAuthorizationoptionSound)
completionHandler:^(BOOL granted,NSError * _Nullable error) {
if (! error) {
NSLog(@"success");
}
else {
NSLog(@"desc%@",self.localizedDescription);
}
}];
}
}
else {
NSLog(@"earlier");
}
}];
在我的日志中,我没有确定然后成功。
if (! error){NSLog(@"success");}
因此,即使状态未确定,应用程序也会调用该方法,但不会显示请求许可的警报。
仍然不确定为什么会发生这种情况。
解决方法
目前的主要问题是这段代码:
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
if (settings.authorizationStatus != UNAuthorizationStatusAuthorized) {
}
}];
这太生硬了。您问的是什么授权状态不是。您需要检查授权状态以查看它是什么是。
如果不是“未确定”,您可以不使授权对话框出现给用户;地位问题的答案是众所周知的。用户可以选择在设置应用中进行更改,您可以设置一个普通对话框要求用户这样做,但您不能让系统显示授权对话框。
另外,授权的方式有多种; “授权”不是唯一的。
所以你的整个方法是倒退的。正确的策略是:
-
致电
getNotificationSettingsWithCompletionHandler
。 -
在完成处理程序中,检查状态。看看它是什么,而不是它不是什么:
一个。如果状态为“已授权”、“临时”或“临时”,您就知道可以继续向系统发布通知。
B.如果状态为“拒绝”,请勿发布通知。
c.如果状态为“未确定”,您现在可以根据需要调用
requestAuthorizationWithOptions
以显示授权对话框。- 在那个方法的完成处理程序中,如果 BOOL 为 YES,则您现在已获得授权并且可以发布通知。
这是一个在我的机器上运行的完整示例:
#import "ViewController.h"
@import UserNotifications;
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
UNAuthorizationStatus status = settings.authorizationStatus;
if (status == UNAuthorizationStatusNotDetermined) {
UNAuthorizationOptions opts = UNAuthorizationOptionAlert;
[center requestAuthorizationWithOptions:opts completionHandler:^(BOOL granted,NSError * _Nullable error) {
if (granted) {
NSLog(@"Hoorah");
} else {
NSLog(@"User refused.");
}
}];
} else {
NSLog(@"status was %ld",status);
}
}];
}
@end
,
我终于明白了。我必须启用这些模块。我转到 Target > Build Settings 并将 Enable Modules(C 和 Objective-C 模块)设置为 YES。它被设置为 NO,因此未使用 UNUsersNotification 中包含的模块。现在我接到了权限请求。现在只需要弄清楚如何在应用程序处于后台或未运行时显示通知。但这是一个不同的帖子和问题。谢谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。