Я работаю над приложением для молитв, которое позволяет пользователям устанавливать будильник (местное уведомление) на время молитвы, то есть пользователь устанавливает, что приложение уведомляет его о молитве Фаджр каждый день , проблема в том, что время для каждой молитвы меняется ежедневно, поэтому время, когда приложение будет уведомлять пользователя о честности в четверг, будет отличаться от времени в пятницу, мне нужно повторять местное уведомление каждый день, но в соответствии с ежедневным временем молитвы, пожалуйста, мог бы кто-нибудь дать мне идею?Как повторять местные уведомления каждый день в разное время
ответ
Таким образом, проблема в том, что вам нужно периодически устанавливать это локальное уведомление, но не может быть повторяемым уведомлением. Я предполагаю, что пользователь устанавливает время молитвы и хочет получить уведомление. Я предлагаю вам установить несколько из них, поскольку вы знаете из списка. Затем установите фоновый выбор, чтобы говорить каждые 5 часов, а также при запуске приложения, просто проверьте, какие локальные уведомления все еще установлены, и обновите список соответственно на основе текущей даты. Фоновая выборка не разбудит ваше приложение ровно через каждые 5 часов в этом случае, но приложит все усилия. Я уверен, что ваше приложение проснется не реже двух раз в день. Вы можете настроить время, основанное на ваших потребностях.
Получение небольших количеств Содержание оппортунистически Apps, которые необходимо проверить новое содержание может периодически просить систему, чтобы разбудить их, чтобы они могли инициировать операцию выборки для этого содержимого. Чтобы поддержать этот режим, включите опцию Фоновая выборка из раздела «Фоновые режимы» на вкладке «Возможности» в вашем проекте Xcode. (Вы также можете включить эту поддержку, включив ключ UIBackgroundModes со значением выборки в файле Info.plist вашего приложения.) Включение этого режима не является гарантией того, что система предоставит ваше приложение в любое время для выполнения фоновых настроек. Система должна сбалансировать потребность вашего приложения в получении контента с учетом потребностей других приложений и самой системы. Оценив эту информацию, система дает время для приложений, когда есть хорошие возможности для этого. Когда возникает хорошая возможность, система просыпается или запускает ваше приложение в фоновом режиме и вызывает приложение делегата приложения: executeFetchWithCompletionHandler: method. Используйте этот метод для проверки нового содержимого и запуска операции загрузки, если контент доступен. Как только вы закончите загрузку нового контента, вы должны выполнить предоставленный блок обработчика завершения, передав результат, который указывает, доступен ли контент. Выполнение этого блока сообщает системе, что оно может переместить ваше приложение обратно в приостановленное состояние и оценить его использование энергии. Приложения, которые быстро загружают небольшие объемы контента и точно отражают, когда у них есть контент, доступный для загрузки, с большей вероятностью получат время выполнения в будущем, чем приложения, которые занимают много времени, чтобы загрузить их контент или что контент заявки был доступен, но затем не загружайте ничего.
Для получения дополнительной информации относится к документации компании Apple на выполнение фона:
Интересно, хорошая идея о регистрации фоновой выборки для расчета и планирования будущих уведомлений. – TruMan1
Есть несколько возможных решений для этого. Это может быть безопаснее использовать подход, при котором ограниченное количество уведомлений по расписанию в то время, так как IOS только держит 64 наиболее скороскоро уведомления:
Приложение может иметь только ограниченное количество запланированных уведомлений; система сохраняет самые быстрые 64 уведомления (с автоматическим перераспределением уведомлений, считая как одно уведомление) и отбрасывает остальное.
Источник: ссылка на класс UILocalNotification
Это также не очень хорошая идея, чтобы полагаться на использовании UILocalNotification
переходила в application:didFinishLaunchingWithOptions:
, так как она передается только, когда пользователь пойло уведомление:
Посмотрите на словарь параметров запуска, чтобы определить, почему было запущено ваше приложение. Приложение: willFinishLaunchingWithOptions: и приложение: didFinishLaunchingWithOptions: методы предоставляют словарь с ключами, указывающими причину, по которой было запущено ваше приложение.
Ключевое значение для запуска в ответ на местном уведомлении: UIApplicationLaunchOptionsLocalNotificationKey
Источник: ссылка на класс UIApplicationDelegate
Вариант 1: график один день за один раз (Код для этого приводится ниже)
Один из способов обработки расписаний уведомлений - представить пользователю расписание, re уведомления дня запланированы во время первоначального открытия приложения.
Используйте класс CustomNotificationManager
для обработки уведомлений, чьи времена являются переменными (код приведен ниже). В AppDelegate вы можете делегировать этому классу обработку локальных уведомлений, которые либо планируют уведомления текущего дня, либо уведомление о фиксированном времени следующего дня, либо отвечают на уведомление о молитве.
Если пользователь открывает приложение в ответ на уведомление о молитве, приложение может направить пользователя в соответствующую часть приложения. Если пользователь открывает приложение в ответ на уведомление о фиксированном времени, приложение будет планировать локальные уведомления этого дня в соответствии с датой и местоположением пользователя.
Вариант 2 (Немного более тонкий подход, но дает меньше Пользователя)
Другому подход заключается просто в использовании запуска приложения молитвенных уведомлений, чтобы запланировать тот, который следует непосредственно. Однако это менее надежно и не обеспечивает возможности предварительного просмотра расписания уведомлений.
Заголовочный файл Уведомление менеджер
@interface CustomNotificationManager : NSObject
- (void) handleLocalNotification:(UILocalNotification *localNotification);
@end
Notification файл Реализация менеджер
#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 sharedApplication] 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 sharedApplication] 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, e.g. 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 Реализация
- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
CustomNotificationManager *notificationManager = [[CustomNotificationManager alloc] init];
[notificationManager handleLocalNotification:notification];
}
Предложение для возможной модификации: Если CustomNotificationManager должен поддерживать состояние, вы можете преобразовать его в Singleton.
Есть три способа сделать это:
Используйте уведомления толчка вместо локальных уведомлений и переместить логику на сервер. Проблема. Пользователь не будет получать уведомления в автономном режиме.
Продолжайте использовать местные уведомления. Вам нужно будет запланировать новое уведомление за каждое время молитвы. Конечно, количество локальных уведомлений ограничено (макс.
64
запланированных уведомлений), но этого должно быть достаточно на неделю уведомлений. Уведомление не является сигналом тревоги, пользователь должен открыть приложение в ответ на получение уведомления. Таким образом, вы всегда можете перенести все уведомления, когда приложение будет открыто. Кроме того, последнее уведомление может быть похоже на «вы не открыли приложение через некоторое время, вы не будете получать больше уведомлений».Вместо того чтобы создавать локальные уведомления, создавать сигналы тревоги/напоминания в календаре устройства (Event Kit)
- 1. Местное уведомление в разное время каждый день
- 2. initWithFireDate повторять каждый день
- 3. Расписание уведомления каждый день в точное время
- 4. Как установить интервал повторения локального уведомления на время молитвы каждый раз в разное время?
- 5. мне нужно, чтобы вызвать уведомление каждый день в разное время
- 6. Иос Повторяющиеся местные уведомления
- 7. Fire UILocalNotification каждый день, но каждый день в определенное время
- 8. Местные уведомления только в понедельник
- 9. GoogleMap показывает разное местоположение каждый день
- 10. Местные уведомления iOS пользовательские данные
- 11. данные за день в разное местное время
- 12. Местные Уведомления ИОС
- 13. iPhone: Ежедневные местные уведомления
- 14. Уведомления Blackberry Push (местные уведомления)
- 15. Ежедневное уведомление о пожаре каждый раз в разное время
- 16. Менеджер местоположения + Местные уведомления
- 17. iOS и местные уведомления
- 18. Местные уведомления Firebase
- 19. Местные уведомления android раз в неделю
- 20. ИОСА проверить отображенные местные уведомления
- 21. Как добавить несколько уведомлений в разное время за один день
- 22. Как создать уведомление в разное время суток?
- 23. Я хочу установить повторяющийся сигнал тревоги, который срабатывает каждый день в разное время.
- 24. Местные уведомления PhoneGap не работают
- 25. Уведомление в Swift каждый день в указанное время?
- 26. fullCalendar jQuery, повторять каждый понедельник?
- 27. Вызов метода в определенное время Каждый день
- 28. менеджера сигнализации запланировать событие, чтобы стрелять каждый день в разное время
- 29. Метод запуска каждый день в определенное время
- 30. Повторите все значения массива в разное время
Вы когда-нибудь понять это? Я закончил вычислять молитвы в течение следующих 10 дней и планировал уведомления таким образом. Единственное, что касается 50 ограничений на уведомления, поэтому я должен настроить другое уведомление для пользователя, чтобы открыть мое приложение, чтобы следующие 10 дней оттуда могли быть запланированы. Не нравится, но только так, как я мог думать. – TruMan1
http://stackoverflow.com/questions/9862261/local-notification-repetation-at-different-times – TruMan1
@ TruMan1: вы хотите, чтобы пользователь установил время или вы хотите, чтобы приложение установило время для пользователь? И сколько времени нужно добавить к времени? Я хотел бы обеспечить некоторую реализацию, но мне нужно больше информации. :) – Sheamus