Pregunta

Estoy escribiendo una aplicación para iPhone en la que tengo tres temporizadores de cuenta regresiva, cada uno establece una notificación local cuando el usuario inicia el usuario (IBACTION).

Mi pregunta es, ¿cómo puedo hacer referencia a una notificación local existente en otra parte del código? He intentado hacer referirlo directamente así, lo que se bloquea:

[[UIApplication sharedApplication] cancelLocalNotification:myNotification];

Y así después de programar la notificación y agregarla a los valores predeterminados del usuario:

In my scheduling method...
[myDefaults setObject:myNotification forKey:@"myNotification"];
...

And in my cancelling method...
NSUserDefaults *myDefaults = [NSUserDefaults standardUserDefaults];
[[UIApplication sharedApplication] cancelLocalNotification:[myDefaults objectForKey:@"myNotification"]];
[myDefaults synchronize];

Mi aplicación se bloquea con un error SigAbrt en la línea CancElLocalNotification anterior. ¿Alguien puede decirme a dónde me estoy equivocando?

¡Gracias por adelantado!

¿Fue útil?

Solución

Ok, he encontrado una solución de trabajo para mi problema después de pensarlo paso a paso. ¡Descubrí que iba sobre todo el tema por completo de la manera incorrecta!

Esencialmente, descubrí que no necesita notificaciones locales cuando la aplicación está activa (es decir, en primer plano). Entonces, en lugar de establecer la notificación local cuando se inicia el temporizador, configuré las notificaciones relevantes cuando la aplicación está a punto de renunciar.

Puse a estos observadores en mi ViewDidload;

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appWillResign) name:UIApplicationWillResignActiveNotification 
object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appIsActive) name:UIApplicationDidBecomeActiveNotification 
object:nil];

Y en mi método AppWillResign, configuré las notificaciones para cualquier temporizador activo. Cuando se reanuda la aplicación, simplemente cancelo todas las notificaciones.

[[UIApplication sharedApplication] cancelAllLocalNotifications];

En resumen, no debe necesitar hacer referencia a las notificaciones en otras partes del código. Solo los configura cuando sean absolutamente necesarios: ¡cuando la aplicación tiene un fondo! Por lo tanto, realmente no necesita 'almacenarlos' en ningún lugar para su uso posterior.

¡Gracias por su contribución @learner, me ayudó a ponerme en el camino correcto! :D

Otros consejos

Es difícil de predecir, pero en general, Sigabrt viene cuando accede a un objeto nulo o liberado.

Así [[UIApplication sharedApplication] cancelLocalNotification:myNotification]; `

Puede ser "mynotificación" que es nulo.

O si [myDefaults objectForKey:@"myNotification"] returns nil.

Posible resason para eso puede ser que NsUserDefaults almacena solo unos pocos tipo de datos como se menciona en el siguiente párrafo de referencia de clase.

Un objeto predeterminado debe ser una lista de propiedades, es decir, una instancia de (o para colecciones una combinación de instancias de): NSDATA, NSString, NSNumber, NSDate, NsArray o NSDictionary. Si desea almacenar cualquier otro tipo de objeto, generalmente debe archivarlo para crear una instancia de NSDATA.

Lo que puedo predecir es que myNotification que se almacena es de tipo UILocalNotification. Entonces, probablemente el almacenamiento de datos está fallando.

Debuge más el código y publique si los casos anteriores no funcionan.

La solución es sincronizar el NSUserDefaults. Supongo que simplemente establece el objeto y no lo sincronizó. Si es así, el objeto no guardará en realidad NSUserDefaults, más bien solo al local NSUserDefaults objeto. Lo que necesitas hacer es llamar [defaults synchronize] Después de configurar el objeto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top