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.


#6

Hola franco, estuve alejado un tiempo pero después de unas semanas volví a tener que ver este tema.

Antes que nada gracias por tu aporte, pero sigo teniendo dudas de cómo implementarlo, no encuentro en ningun lugar de la documentación, como realizar un scheduled de “Silent push notifications” y por lo que entiendo siempre dependes de un servidor que haga un push.

Estuve viendo los siguientes links y en ninguno encontré forma de hacerlo:

https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CreatingtheNotificationPayload.html#//apple_ref/doc/uid/TP40008194-CH10-SW8

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

De ser posible me gustaría que me indiques donde puedo leer cómo realizar un schedule de una “silent notification” para correr código en background.

Gracias por tu ayuda.

Saludos.


#7

iOS es bastante restrictivo a la hora de ejecutar código en background. Si podés contar, ¿para qué estás necesitando eso? Quizás podés resolver ese problema sin la necesidad de ejecutar código en background.


#8

La app tiene una alarma que te permite configurar un streaming como “audio”.

Tengo 3 estados con 3 soluciones distintas:

App en foreground (ya anda):

Utilizo el siguiente código para atrapar el ejecución de la notificación:

application( **_** application: UIApplication, didReceive notification: UILocalNotification)

App cerrada (ya anda):

En el caso de que la app esté cerrada suena un failsafe (notificaciones encoladas consecutivamente para simular el loop del audio)

En este modo no podés configurar el streaming pero eso fué aceptado por el cliente

App en background (anda igual que con la app cerrada):

El problema lo tengo en este modo, si se bajan y prueban la alarma “Alarmy” van a notar que si la app esta en backdround la misma no utiliza la estrategia de múltiples notificaciones sino que de alguna forma ejecuta código.

Yo necesito poder levantar el streaming aunque la app este en background para replicar el funcionamiento de la app en foreground. No es necesario “despertar” a la app, simplemente levantar el streaming y mostrar una notificación para que el usuario a partir de la misma pueda abrir la app para parar la alarma.

Leyendo lo que dice en este post entiendo que hay diferentes estrategias para implementar lo que quiero hacer, pero ninguna de esas son usadas por Alarmy y aun asi funciona. Digo que no usan ninguna de esas estrategias ya que no le di permisos de ubicación y probé la alarma en modo avión por lo que sé que no usaron push notifications.


#9

Bajé Alarmy para ver qué onda y claramente schedulea un montón de local notifications para la alarma (fijate como van cayendo constantemente notificaciones) Ver video


#10

Si, pero ese es el caso App cerrada y eso ya esta implementado, pero si probás alarmy con la app en background vas a ver que no hace eso.

Fijate que al principio del video se ve una notificación de alarmy que te dice que la app tiene que estar en background.


#11

Ahí la probé en background. Es una pesadilla esa app, mientras suena el sonido si le querés bajar el volumen te lo vuelve a subir :scream:

Tu app tiene implementada una notification extension para handlear las notificaciones? Quizás es por ahí: https://stackoverflow.com/questions/43989656/handling-local-push-notifications-when-app-is-in-the-background


#12

No, no lo tiene, voy a probar y te aviso como me fue. Muchas gracias!