objetivo c: intentar que NSUserNotifications funcione en mi aplicación

CorePress2024-01-24  9

Estoy intentando actualizar a NSUserNotifications.

Cambié la forma en que se escribe mi código y cambié su ubicación, pero sigue sucediendo lo mismo.

En mi 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;

En mi 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");
   }
   
}];

En mi registro aparece No determinado y luego éxito.

 if (! error){NSLog(@"success");}

Entonces, aunque el estado sea No determinado, la aplicación llama al método pero no muestra la alerta solicitando permiso. Todavía no estoy seguro de por qué sucede esto.

La expresión UNAuthorizationOptionAlert + UNAuthorizationOptionSound + UNAuthorizationOptionBadge está mal, por un lado.

- mate

26/03/2021 a las 23:57

Gracias por la sugerencia. Intenté poner | entre las opciones pero eso no funcionó, así que intenté poner solo NSAuthorizationOptionAlert en lugar de las opciones, pero tampoco funcionó. ¿Podrías sugerir algo que haga que esa aplicación solicite los permisos que me faltan?

- usuario1114881

27 de marzo de 2021 a las 0:18

No puedes forzar la aparición del cuadro de diálogo. Por ejemplo, si ya denegó el permiso, no volverá a ver el cuadro de diálogo. Además, el controlador de finalización le entrega un error que explica si hay un problema y usted lo desecha sin mirarlo. De manera similar, su getNotificationSettingsWithCompletionHandler está intentando decirle cuál es realmente el estado de autorización, pero usted no está escuchando; todo lo que sabes es lo que no es.

- mate

27 de marzo de 2021 a las 0:49

Entiendo lo que estás diciendo. El problema es que cuando instalo la aplicación por primera vez en mi dispositivo no se me pide que la permita ni la niegue. No aparece ninguna etiqueta. Entonces, después de instalar e iniciar la aplicación por primera vez y entro en la configuración en notificaciones, no muestra que mi aplicación tenga ningún estado de notificación. Entonces no estoy seguro de por qué no se llama. Intenté poner localizedDescription en el error pero devuelve (nulo). Entonces no sé qué estoy haciendo mal. Lo siento.

- usuario1114881

27 de marzo de 2021 a las 4:08

Ni siquiera has mostrado dónde está tu código.

- mate

27 de marzo de 2021 a las 4:10



------------------------------------

El principal problema hasta ahora es este código:

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

Esa es una prueba demasiado directa. Está preguntando cuál no es el estado de autorización. Debe examinar el estado de la autorización para ver cuál es.

Si no está "no determinado", no puede hacer que el cuadro de diálogo de autorización le aparezca al usuario; La respuesta a la pregunta sobre el estatus ya se conoce. El usuario puede optar por realizar un cambio en la aplicación de configuración y usted puede abrir un cuadro de diálogo normal pidiéndole al usuario quePuedes hacer eso, pero no puedes hacer que el sistema presente el cuadro de diálogo de autorización.

Además, existen varias formas de obtener autorización; "autorizado" no es el único.

Así que todo tu enfoque es al revés. La estrategia correcta es:

Llame a getNotificationSettingsWithCompletionHandler.

En el controlador de finalización, examine el estado. Mira lo que es, no lo que no es:

a. Si el estado es "autorizado" o "provisional" o "efímero", sabes que puedes seguir adelante y publicar una notificación en el sistema.

b. Si el estado es "rechazado", no publique una notificación.

c. Si el estado es "no determinado", ahora puede llamar a requestAuthorizationWithOptions para abrir el cuadro de diálogo de autorización, silo deseas.

En el controlador de finalización de ese método, si BOOL es YES, ahora está autorizado y puede publicar una notificación.

Este es un ejemplo completo que funciona en mi máquina:

#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

3

He actualizado mi publicación para reflejar lo que me sugeriste que hiciera (creo que lo hice). También puse esto en una aplicación nueva en ViewDidLoad de ViewController y no apareció ninguna alerta, simplemente No determinado y exitoso. Claramente estoy haciendo algo mal pero no estoy seguro de qué. Gracias por su paciencia y ayuda.

- usuario1114881

27/03/2021 a las 23:46

Bueno, no sé qué estás haciendo ahora. Te aseguro que si haces lo que te dije, verás el diálogo o sabrás por qué no.

- mate

28 de marzo de 2021 a las 0:04

Se agregó un ejemplo funcional completo. Realmente no veo qué más puedo hacer.

- mate

28 de marzo de 2021 a las 0:07



------------------------------------

Finalmente me di cuenta de esto. Tuve que habilitar los módulos. Fui al Target > Cree la configuración y establezca Habilitar módulos (módulos C y Objective-C) en SÍ. Se configuró en NO, por lo que los módulos incluidos con UNUsersNotification no se estaban utilizando. Ahora recibo la llamada de permisos. Ahora sólo tengo que terminar de descubrir cómo hacer que aparezca la notificación cuando la aplicación esté en segundo plano o no se esté ejecutando. Pero esa es una publicación y una pregunta diferente. Gracias

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare