试图让 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.

如果不是“未确定”,您可以导致向用户显示授权对话框;地位问题的答案是众所周知的。用户可以选择在设置应用程序中进行更改,您可以设置一个普通对话框要求用户这样做,但您不能让系统显示授权对话框。

此外,授权方式有多种; “授权”不是唯一的。

所以你的整个方法是倒退的。正确的策略是:

  1. 致电getNotificationSettingsWithCompletionHandler.

  2. 在完成处理程序中,检查状态。看它是什么,不看它不是什么:

    一个。如果状态是“已授权”或“临时”或“临时”,您就知道可以继续了,并且 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 和问题。谢谢