0

我正在尝试更新到 NSUserNotifications。

我已经改变了我的代码的编写方式并改变了它的位置,但同样的事情一直在发生。

在我的另一个视图控制器.h

#import <UserNotifications/UserNotifications.h>
#import <UserNotifications/UNUserNotificationCenter.h>

@interface AnotherViewController : UIViewController <UNUserNotificationCenterDelegate>

{
UNAuthorizationOptions UNAuthorizationOptionBadge;;
    UNAuthorizationOptions UNAuthorizationOptionAlert;
    UNAuthorizationOptions UNAuthorizationOptionSound;
}

@property(readonly, copy) NSString *localizedDescription;

在我的另一个视图控制器.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");}

因此,即使状态为未确定,应用程序也会调用该方法,但不会显示请求权限的警报。
仍然不确定为什么会这样。

4

2 回答 2

0

我终于想通了。我必须启用模块。我去了目标>构建设置并将启用模块(C和Objective-C模块)设置为YES。它被设置为 NO,所以 UNUsersNotification 包含的模块没有被使用。现在我接到了权限要求。现在只需要完成计算如何在应用程序处于后台或未运行时发出通知。但这是一个不同的帖子和问题。谢谢

于 2021-03-28T14:27:30.157 回答
0

到目前为止的主要问题是这段代码:

[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
    if (settings.authorizationStatus != UNAuthorizationStatusAuthorized) {
    }
}];

这测试太生硬了。您在问授权状态不是什么。您需要检查授权状态以了解它是什么

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

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

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

  1. 打电话getNotificationSettingsWithCompletionHandler

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

    一个。如果状态是“已授权”、“临时”或“临时”,您就知道可以继续向系统发布通知。

    湾。如果状态为“拒绝”,请不要发布通知。

    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
于 2021-03-27T22:20:10.153 回答