试图让 NSUserNotifications 在我的应用程序中工作
Trying to get NSUserNotifications to work in my app
我正在尝试更新到 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) {
}
}];
这个测试太生硬了。你问的授权状态是不是。您需要检查授权状态以查看它是什么 is.
如果不是“未确定”,您可以不导致向用户显示授权对话框;地位问题的答案是众所周知的。用户可以选择在设置应用程序中进行更改,您可以设置一个普通对话框要求用户这样做,但您不能让系统显示授权对话框。
此外,授权方式有多种; “授权”不是唯一的。
所以你的整个方法是倒退的。正确的策略是:
致电getNotificationSettingsWithCompletionHandler
.
在完成处理程序中,检查状态。看它是什么,不看它不是什么:
一个。如果状态是“已授权”或“临时”或“临时”,您就知道可以继续了,并且 post 向系统发送通知。
b。如果状态为“拒绝”,请不要 post 通知。
c。如果状态为“未确定”,您现在可以调用 requestAuthorizationWithOptions
来建立授权对话框,如果您愿意的话。
- 在 that 方法的完成处理程序中,如果 BOOL 为 YES,则您现在已获得授权并且可以post 通知。
这是在我的机器上运行的完整示例:
#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 并将启用模块(C 和 Objective-C 模块)设置为 YES。它被设置为 NO,因此未使用 UNUsersNotification 中包含的模块。现在我接到了权限请求。现在只需要完成弄清楚当应用程序是否在后台时如何让通知出现 运行。但这是一个不同的 post 和问题。谢谢
我正在尝试更新到 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) {
}
}];
这个测试太生硬了。你问的授权状态是不是。您需要检查授权状态以查看它是什么 is.
如果不是“未确定”,您可以不导致向用户显示授权对话框;地位问题的答案是众所周知的。用户可以选择在设置应用程序中进行更改,您可以设置一个普通对话框要求用户这样做,但您不能让系统显示授权对话框。
此外,授权方式有多种; “授权”不是唯一的。
所以你的整个方法是倒退的。正确的策略是:
致电
getNotificationSettingsWithCompletionHandler
.在完成处理程序中,检查状态。看它是什么,不看它不是什么:
一个。如果状态是“已授权”或“临时”或“临时”,您就知道可以继续了,并且 post 向系统发送通知。
b。如果状态为“拒绝”,请不要 post 通知。
c。如果状态为“未确定”,您现在可以调用
requestAuthorizationWithOptions
来建立授权对话框,如果您愿意的话。- 在 that 方法的完成处理程序中,如果 BOOL 为 YES,则您现在已获得授权并且可以post 通知。
这是在我的机器上运行的完整示例:
#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 并将启用模块(C 和 Objective-C 模块)设置为 YES。它被设置为 NO,因此未使用 UNUsersNotification 中包含的模块。现在我接到了权限请求。现在只需要完成弄清楚当应用程序是否在后台时如何让通知出现 运行。但这是一个不同的 post 和问题。谢谢