2014-09-06 2 views
9

Я работаю над приложением для молитв, которое позволяет пользователям устанавливать будильник (местное уведомление) на время молитвы, то есть пользователь устанавливает, что приложение уведомляет его о молитве Фаджр каждый день , проблема в том, что время для каждой молитвы меняется ежедневно, поэтому время, когда приложение будет уведомлять пользователя о честности в четверг, будет отличаться от времени в пятницу, мне нужно повторять местное уведомление каждый день, но в соответствии с ежедневным временем молитвы, пожалуйста, мог бы кто-нибудь дать мне идею?Как повторять местные уведомления каждый день в разное время

+0

Вы когда-нибудь понять это? Я закончил вычислять молитвы в течение следующих 10 дней и планировал уведомления таким образом. Единственное, что касается 50 ограничений на уведомления, поэтому я должен настроить другое уведомление для пользователя, чтобы открыть мое приложение, чтобы следующие 10 дней оттуда могли быть запланированы. Не нравится, но только так, как я мог думать. – TruMan1

+0

http://stackoverflow.com/questions/9862261/local-notification-repetation-at-different-times – TruMan1

+0

@ TruMan1: вы хотите, чтобы пользователь установил время или вы хотите, чтобы приложение установило время для пользователь? И сколько времени нужно добавить к времени? Я хотел бы обеспечить некоторую реализацию, но мне нужно больше информации. :) – Sheamus

ответ

2

Таким образом, проблема в том, что вам нужно периодически устанавливать это локальное уведомление, но не может быть повторяемым уведомлением. Я предполагаю, что пользователь устанавливает время молитвы и хочет получить уведомление. Я предлагаю вам установить несколько из них, поскольку вы знаете из списка. Затем установите фоновый выбор, чтобы говорить каждые 5 часов, а также при запуске приложения, просто проверьте, какие локальные уведомления все еще установлены, и обновите список соответственно на основе текущей даты. Фоновая выборка не разбудит ваше приложение ровно через каждые 5 часов в этом случае, но приложит все усилия. Я уверен, что ваше приложение проснется не реже двух раз в день. Вы можете настроить время, основанное на ваших потребностях.

Получение небольших количеств Содержание оппортунистически Apps, которые необходимо проверить новое содержание может периодически просить систему, чтобы разбудить их, чтобы они могли инициировать операцию выборки для этого содержимого. Чтобы поддержать этот режим, включите опцию Фоновая выборка из раздела «Фоновые режимы» на вкладке «Возможности» в вашем проекте Xcode. (Вы также можете включить эту поддержку, включив ключ UIBackgroundModes со значением выборки в файле Info.plist вашего приложения.) Включение этого режима не является гарантией того, что система предоставит ваше приложение в любое время для выполнения фоновых настроек. Система должна сбалансировать потребность вашего приложения в получении контента с учетом потребностей других приложений и самой системы. Оценив эту информацию, система дает время для приложений, когда есть хорошие возможности для этого. Когда возникает хорошая возможность, система просыпается или запускает ваше приложение в фоновом режиме и вызывает приложение делегата приложения: executeFetchWithCompletionHandler: method. Используйте этот метод для проверки нового содержимого и запуска операции загрузки, если контент доступен. Как только вы закончите загрузку нового контента, вы должны выполнить предоставленный блок обработчика завершения, передав результат, который указывает, доступен ли контент. Выполнение этого блока сообщает системе, что оно может переместить ваше приложение обратно в приостановленное состояние и оценить его использование энергии. Приложения, которые быстро загружают небольшие объемы контента и точно отражают, когда у них есть контент, доступный для загрузки, с большей вероятностью получат время выполнения в будущем, чем приложения, которые занимают много времени, чтобы загрузить их контент или что контент заявки был доступен, но затем не загружайте ничего.

Для получения дополнительной информации относится к документации компании Apple на выполнение фона:

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

+0

Интересно, хорошая идея о регистрации фоновой выборки для расчета и планирования будущих уведомлений. – TruMan1

6

Есть несколько возможных решений для этого. Это может быть безопаснее использовать подход, при котором ограниченное количество уведомлений по расписанию в то время, так как 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.

2

Есть три способа сделать это:

  1. Используйте уведомления толчка вместо локальных уведомлений и переместить логику на сервер. Проблема. Пользователь не будет получать уведомления в автономном режиме.

  2. Продолжайте использовать местные уведомления. Вам нужно будет запланировать новое уведомление за каждое время молитвы. Конечно, количество локальных уведомлений ограничено (макс. 64 запланированных уведомлений), но этого должно быть достаточно на неделю уведомлений. Уведомление не является сигналом тревоги, пользователь должен открыть приложение в ответ на получение уведомления. Таким образом, вы всегда можете перенести все уведомления, когда приложение будет открыто. Кроме того, последнее уведомление может быть похоже на «вы не открыли приложение через некоторое время, вы не будете получать больше уведомлений».

  3. Вместо того чтобы создавать локальные уведомления, создавать сигналы тревоги/напоминания в календаре устройства (Event Kit)

Смежные вопросы