Cómo repetir las notifications locales todos los días en diferentes horarios.

Estoy trabajando en una aplicación de oración que permite a los usuarios configurar una alarma (notificación local) para los times de oración, es decir, el usuario establece la aplicación para notificarle la oración de Fajr todos los días, el problema es que el time de cada oración cambia diariamente la hora en que la aplicación notificará al usuario la feria en jueves será diferente de la hora del viernes, tengo que repetir la notificación local todos los días, pero de acuerdo con el time de oración diaria, ¿podría alguien darme una idea?

Hay algunas soluciones posibles para esto. Puede ser más seguro utilizar un enfoque en el que se programen un número limitado de notifications a la vez, ya que iOS solo conserva las 64 notifications más próximas:

Una aplicación solo puede tener una cantidad limitada de notifications progtwigdas; el sistema mantiene las notifications de 64 disparos más recientes (con las notifications reprogtwigdas automáticamente contando como una única notificación) y descarta el rest.

Fuente: reference de la class UILocalNotification

Tampoco es una buena idea confiar en el uso de UILocalNotification pasado a la application:didFinishLaunchingWithOptions: ya que solo se pasa cuando el usuario pasa la notificación:

Mira el dictionary de opciones de lanzamiento para determinar por qué se lanzó tu aplicación. La aplicación: willFinishLaunchingWithOptions: y la aplicación: didFinishLaunchingWithOptions: los methods proporcionan un dictionary con keys que indican el motivo por el que se lanzó su aplicación.

El valor key para el lanzamiento en respuesta a una notificación local es: UIApplicationLaunchOptionsLocalNotificationKey

Origen: Referencia de class UIApplicationDelegate

Opción 1: progtwigr un día a la vez (el código para esto se proporciona a continuación)

Una forma de manejar la progtwigción de notifications es presentar un progtwig al usuario, donde las notifications del día están progtwigdas en el momento de la apertura inicial de la aplicación.

Use una class CustomNotificationManager para manejar notifications cuyos times son variables (el código se proporciona a continuación). En su AppDelegate, puede delegar en esta class el event handling las notifications locales, que progtwigrá las notifications del día actual más la notificación del día fijo del siguiente día o responderá a una notificación de oración.

Si el usuario abre la aplicación en respuesta a una notificación de oración, la aplicación puede dirigir al usuario a una parte apropiada de la aplicación. Si el usuario abre la aplicación en respuesta a la notificación de time fijo, la aplicación progtwigrá las notifications locales de ese día según la date y la location del usuario.

Opción 2 (enfoque ligeramente más delgado, pero que proporciona less al usuario)

Otro enfoque es simplemente utilizar el inicio de una aplicación de notificación de oración para progtwigr el que sigue inmediatamente. Sin embargo, esto es less confiable y no proporciona la posibilidad de get una vista previa de un progtwig de notifications.

Archivo de encabezado de Notification Manager

 @interface CustomNotificationManager : NSObject - (void) handleLocalNotification:(UILocalNotification *localNotification); @end 

Archivo de implementación de Notification Manager

 #import "CustomNotificationManager.h" #define CustomNotificationManager_FirstNotification @"firstNotification" @implementation CustomNotificationManager - (instancetype) init { self = [super init]; if (self) { } return self; } - (void) handleLocalNotification:(UILocalNotification *)localNotification { //Determine if this is the notification received at a fixed time, // used to trigger the scheculing of today's notifications NSDictionary *notificationDict = [localNotification userInfo]; if (notificationDict[CustomNotificationManager_FirstNotification]) { //TODO: use custom algorithm to create notification times, using today's date and location //Replace this line with use of algorithm NSArray *notificationTimes = [NSArray new]; [self scheduleLocalNotifications:notificationTimes]; } else { //Handle a prayer notification } } /** * Schedule local notifications for each time in the notificationTimes array. * * notificationTimes must be an array of NSTimeInterval values, set as intervalas * since 1970. */ - (void) scheduleLocalNotifications:(NSArray *)notificationTimes { for (NSNumber *notificationTime in notificationTimes) { //Optional: create the user info for this notification NSDictionary *userInfo = @{}; //Create the local notification UILocalNotification *localNotification = [self createLocalNotificationWithFireTimeInterval:notificationTime alertAction:@"View" alertBody:@"It is time for your next prayer." userInfo:userInfo]; //Schedule the notification on the device [[UIApplication shanetworkingApplication] scheduleLocalNotification:localNotification]; } /* Schedule a notification for the following day, to come before all other notifications. * * This notification will trigger the app to schedule notifications, when * the app is opened. */ //Set a flag in the user info, to set a flag to let the app know that it needs to schedule notifications NSDictionary *userInfo = @{ CustomNotificationManager_FirstNotification : @1 }; NSNumber *firstNotificationTimeInterval = [self firstNotificationTimeInterval]; UILocalNotification *firstNotification = [self createLocalNotificationWithFireTimeInterval:firstNotificationTimeInterval alertAction:@"View" alertBody:@"View your prayer times for today." userInfo:userInfo]; //Schedule the notification on the device [[UIApplication shanetworkingApplication] scheduleLocalNotification:firstNotification]; } - (UILocalNotification *) createLocalNotificationWithFireTimeInterval:(NSNumber *)fireTimeInterval alertAction:(NSString *)alertAction alertBody:(NSString *)alertBody userInfo:(NSDictionary *)userInfo { UILocalNotification *localNotification = [[UILocalNotification alloc] init]; if (!localNotification) { NSLog(@"Could not create a local notification."); return nil; } //Set the delivery date and time of the notification long long notificationTime = [fireTimeInterval longLongValue]; NSDate *notificationDate = [NSDate dateWithTimeIntervalSince1970:notificationTime]; localNotification.fireDate = notificationDate; //Set the slider button text localNotification.alertAction = alertAction; //Set the alert body of the notification localNotification.alertBody = alertBody; //Set any userInfo, eg userID etc. (Useful for app with multi-user signin) //The userInfo is read in the AppDelegate, via application:didReceiveLocalNotification: localNotification.userInfo = userInfo; //Set the timezone, to allow for adjustment for when the user is traveling localNotification.timeZone = [NSTimeZone localTimeZone]; return localNotification; } /** * Calculate and return a number with an NSTimeInterval for the fixed daily * notification time. */ - (NSNumber *) firstNotificationTimeInterval { //Create a Gregorian calendar NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; //Date components for next day NSDateComponents *dateComps = [[NSDateComponents alloc] init]; dateComps.day = 1; //Get a date for tomorrow, same time NSDate *today = [NSDate date]; NSDate *tomorrow = [cal dateByAddingComponents:dateComps toDate:today options:0]; //Date components for the date elements to be preserved, when we change the hour NSDateComponents *preservedComps = [cal components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:tomorrow]; preservedComps.hour = 5; tomorrow = [cal dateFromComponents:preservedComps]; NSTimeInterval notificationTimeInterval = [tomorrow timeIntervalSince1970]; NSNumber *notificationTimeIntervalNum = [NSNumber numberWithLongLong:notificationTimeInterval]; return notificationTimeIntervalNum; } @end 

AppDelegate didReceiveLocalNotification Implementation

 - (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { CustomNotificationManager *notificationManager = [[CustomNotificationManager alloc] init]; [notificationManager handleLocalNotification:notification]; } 

Sugerencia para una posible modificación: si el CustomNotificationManager necesita mantener el estado, puede convertirlo en un Singleton.

Por lo tanto, el problema parece ser que necesita configurar esta notificación local de vez en cuando, pero no puede ser una notificación repetible. Supongo que el usuario establece el time de oración y quiere que se le notifique. Sugiero que configure algunos de ellos, ya que sabe de la list. A continuación, configure la búsqueda de background para que digamos cada 5 horas, y al iniciar el background de la aplicación, simplemente verifique qué notifications locales siguen configuradas y actualice la list de acuerdo con la date actual. La captura de background no despierta su aplicación precisamente cada 5 horas en este caso, pero hará todo lo posible. Estoy seguro de que su aplicación se despertará al less dos veces al día. Puede modificar el time según sus necesidades.

Obteniendo pequeñas cantidades de contenido de forma oportuna Las aplicaciones que necesitan verificar el contenido nuevo periódicamente pueden pedirle al sistema que las active para que puedan iniciar una operación de obtención de ese contenido. Para admitir este modo, active la opción Traer background en la sección Modos en segundo plano de la pestaña Capacidades en su proyecto Xcode. (También puede habilitar esta compatibilidad al include la key UIBackgroundModes con el valor de recuperación en el file Info.plist de su aplicación). La habilitación de este modo no garantiza que el sistema le proporcionará a su aplicación cualquier momento para realizar búsquedas de antecedentes. El sistema debe equilibrar la necesidad de su aplicación para search contenido con las necesidades de otras aplicaciones y el sistema en sí. Después de evaluar esa información, el sistema le da time a las aplicaciones cuando hay buenas oportunidades para hacerlo. Cuando surge una buena oportunidad, el sistema despierta o inicia su aplicación en segundo plano y llama a la aplicación del delegado de la aplicación: performFetchWithCompletionHandler: method. Use ese método para verificar el contenido nuevo e iniciar una operación de descarga si el contenido está disponible. Tan pronto como termine de download el nuevo contenido, debe ejecutar el bloque de controller de finalización proporcionado, pasando un resultado que indica si el contenido estaba disponible. Al ejecutar este bloque le dice al sistema que puede mover su aplicación de nuevo al estado suspendido y evaluar su uso de energía. Las aplicaciones que descargan pequeñas cantidades de contenido rápidamente y reflejan con precisión cuándo tenían el contenido disponible para download, es más probable que reciban time de ejecución en el futuro que las aplicaciones que tardan mucho time en download su contenido o que el contenido de la reclamación estuvo disponible, pero luego No descargues nada.

Para get más información, consulte la documentation de Apple sobre la ejecución de background:

https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

Hay tres maneras de hacer esto:

  1. Use notifications push en lugar de notifications locales y mueva la lógica al server. Problema: el usuario no recibirá notifications cuando esté fuera de línea.

  2. Siga usando notifications locales. Tendrá que planificar una nueva notificación para cada time de oración. Por supuesto, el número de notifications locales es limitado (máximo 64 notifications progtwigdas), pero debería ser suficiente para una semana de notifications. Una notificación no es una alarma, se supone que el usuario debe abrir la aplicación en respuesta a la recepción de una notificación. De esta forma, siempre puede reprogtwigr todas las notifications cuando se vuelve a abrir la aplicación. Además, la última notificación puede ser algo similar a "no has abierto la aplicación en un time, no recibirás más notifications".

  3. En lugar de crear notifications locales, cree alarmas / recordatorios en el calendar de su dispositivo ( Kit de events )