Alarma en IOS


#1

Estoy desarrollando una app en react native que entre otras cosas maneja alarmas (“despertador”), la misma te deja seleccionar una fecha y un sonido y te “despierta” en la fecha seleccionada.

El problema que estoy teniendo más que nada es cuando la app está en background o totalmente cerrada.

Leí este post que me pareció muy interesante: building-an-alarm-app-on-ios pero el mismo da hacks que quiero creer que no son necesarios y creo que no son necesarios porque hay apps como alarmy que funcionan en todos los casos de usos sin usar (creo yo) esos hacks.

Y creo que no usan esos hacks ya que cuando probé la alarma no le di permisos de localización y desactive el wifi y funcionó igualmente

Por lo que tengo dos preguntas por si alguien conoce la solución:

  1. ¿Se puede ejecutar código a la hora de recibir una notificación si la app está en background?
  2. ¿Cuál sería la mejor implementación para dejar un sonido ejecutándose en loop hasta que el usuario lo desactive siendo que la app se encuentra cerrada?

Estado actual de la app:

Actualmente tengo las alarmas ejecutándose correctamente si la app esta activa pero si la misma se encuentra en background o cerrada lo único que estoy logrando es disparar una única notificación con un único sonido.

Para cuando la app está activa estoy usando:

// This code block is invoked when application is in foreground (active-mode)*
func application( _ application: UIApplication, didReceive notification: UILocalNotification) {
  var alert: UIAlertController?
  if (notification.category == Alarm.notifitactionType) {
  ...

Ese código funciona bien pero sólo se ejecuta si la app se encuentra activa, no funciona ni en background ni si la app está cerrada.

Para el schedule de las alarmas utilizo:

internal func setNotificationWithDate(_ date: Date, onSnooze: Bool, index: Int) {
  ...
  let AlarmNotification: UILocalNotification = UILocalNotification()
  ...
  UIApplication.shared.scheduleLocalNotification(AlarmNotification)

Desde ya muchas gracias a todos y espero que este tema le pueda servir a varias personas.


#2

Hola :wave:

Vos podes mandar notificaciones silenciosas (Silent Notifications) y ejecutar to background code ahí. Ya sea desde el servidor (Push) o local (Scheduled).

Mirate esto: https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/pushing_updates_to_your_app_silently


#3

Una pregunta más:

Teniendo en cuenta esto:

Important

The system treats silent notifications as low-priority. You can use them to refresh your app’s content, but the system doesn't guarantee their delivery. In addition, the delivery of silent notifications may be throttled if the total number becomes excessive. The actual number of silent notifications allowed by the system depends on current conditions, but don't try to send more than two or three silent notifications per hour.

¿No es peligroso para un despertador depender de una funcionalidad que puede no ser ejecutada?


#4

En tu caso (una alarma) no creo que supere las dos/tres notificaciones por hora. Aún así es medio embole esa reestricción si, pero por lo que tengo entendido solo aplica a las silent push, no a las scheduled (locales).


#5

Bueno, voy a probar un poco con esto, gracias.