Возможно ли иметь условную `firedate` для UILocalNotification?

Я пытаюсь установить условную дату запуска для своих локальных уведомлений, однако, когда я попробовал эти два способа, это не сработало, но все равно не сработало. Итак, мне было интересно, могу ли я сделать такую ​​​​вещь?

Примечание. startTime и endTime — это время из средств выбора даты.

-(void) TEST {

NSCalendar *calendar = [NSCalendar currentCalendar];
calendar.timeZone = [NSTimeZone timeZoneWithName:@"GMT"];

NSDateComponents *components = [calendar components:NSHourCalendarUnit fromDate:[NSDate date]];
components.hour   = 3;
components.minute = (components.minute + 1) % 60;
components.second = 57;

NSDate *fire = [calendar dateFromComponents:components];
UILocalNotification *notif = [[UILocalNotification alloc]  init] ;
if (notif == nil)
    return;

if (fire < startTime.date) {


notif.fireDate =fire ;
    notif.repeatInterval= NSMinuteCalendarUnit ;
    notif.alertBody = [NSString stringWithFormat: @"You are missed!"] ;
    [[UIApplication sharedApplication] scheduleLocalNotification:notif] ;


    }

if (fire > endTime.date) {


    notif.fireDate =fire ;
    notif.repeatInterval= NSMinuteCalendarUnit ;
    notif.alertBody = [NSString stringWithFormat: @"You are missed!"] ;
    [[UIApplication sharedApplication] scheduleLocalNotification:notif] ;


}}

ИЛИ

-(void) TEST {

NSCalendar *calendar = [NSCalendar currentCalendar];
calendar.timeZone = [NSTimeZone timeZoneWithName:@"GMT"];

NSDateComponents *components = [calendar components:NSHourCalendarUnit fromDate:[NSDate date]];
components.hour   = 3;
components.minute = (components.minute + 1) % 60;
components.second = 57;

NSDate *fire = [calendar dateFromComponents:components];
UILocalNotification *notif = [[UILocalNotification alloc]  init] ;
if (notif == nil)
    return;

if (fire > startTime.date & fire < endTime.date) {

    [[UIApplication sharedApplication] cancelAllLocalNotifications] ;
}

else {
    notif.fireDate =fire ;
    notif.repeatInterval= NSMinuteCalendarUnit ;
    notif.alertBody = [NSString stringWithFormat: @"You are missed!"] ;
    [[UIApplication sharedApplication] scheduleLocalNotification:notif] ;


}}

Спасибо

Если нет, то какой самый простой способ создать такое условие?


person user1949873    schedule 05.05.2013    source источник
comment
Вы записывали дату пожара? Если вы используете минуты из компонента, вам нужно загрузить минуты при получении компонента из календаря + дата (NSMinuteCalendarUnit).   -  person Wain    schedule 05.05.2013
comment
Да, я зарегистрировал это, и оно никогда не входит в условие if   -  person user1949873    schedule 05.05.2013
comment
Попробуйте if ([fire timeIntervalSinceDate:startTime.date] >= 0) // fire is before start.   -  person    schedule 07.05.2013
comment
@relikd Спасибо, но все еще не работает! :/   -  person user1949873    schedule 08.05.2013
comment
@Bonnie ни один из ваших ответов не сработал, и я думаю, что нет решений для такой вещи, как я все равно не смог найти, чтобы выполнить отмену уведомлений в определенное время в фоновом режиме. Однако вы заслуживаете 100 баллов за свою усердную работу. Спасибо.   -  person user1949873    schedule 13.05.2013
comment
спасибо, приятель, приятно. но если вы когда-нибудь что-нибудь найдете, опубликуйте это здесь.   -  person Bonnie    schedule 13.05.2013


Ответы (2)


используйте метод NSDate Compare: вместо if(fire > startTime.date)

if([fire compare: startTime.date] == NSOrderedDescending) // if start is later in time than end
{
    // do something
}

Из ссылки на класс:

If:
The receiver and anotherDate are exactly equal to each other, NSOrderedSame.
The receiver is later in time than anotherDate, NSOrderedDescending.
The receiver is earlier in time than anotherDate, NSOrderedAscending.

так что для вашего состояния

if (fire > startTime.date & fire < endTime.date) {

    [[UIApplication sharedApplication] cancelAllLocalNotifications] ;
}

ты можешь использовать

if([fire compare: startTime.date] == NSOrderedDescending && [fire compare: endTime.date]== NSOrderedAescending)
{
   [[UIApplication sharedApplication] cancelAllLocalNotifications] ;
}

это отменит все локальные уведомления, если пожар произойдет между выбранной датой начала и окончания.

else {
// Fire the notifications
}

также взгляните на ссылку, которая похожа на то, что вам нужно ссылка

person Bonnie    schedule 07.05.2013
comment
к сожалению, уведомление все еще работает, и оно не было отменено!! Я слышал, что у вас не может быть ограничений на UILocalNotification, это правда? - person user1949873; 08.05.2013
comment
скажите пожалуйста, что именно вам нужно сделать, и что не работает, мое предположение: startTime и EndTime - это время, между которым не будут срабатывать уведомления.? правильно.?? в соответствии с этим кодом, если fireDate находится между временем начала и окончания, уведомление не будет создано, поэтому нет возможности его срабатывания. Вы хотите просто отменить все уведомления, уже созданные этой осенью в рамках временных рамок DoNotDisturb.?? или вы просто не хотите, чтобы пользователь разрешал создавать новую UILocalnotation между временными рамками DoNotDisturb - person Bonnie; 08.05.2013
comment
Ваши предположения верны. Я хочу отменить уведомления между startTime и endTime. Итак, сможет ли этот код отменить AllLocalNotifications в фоновом режиме, когда он уже был запланирован? Потому что я пробовал, и это не сработало! - person user1949873; 08.05.2013
comment
Вот сценарий: у меня есть локальное уведомление, которое запланировано на интервал повторения каждый час. Я хочу, чтобы когда пользователь выбирал startTime и endTime, эти уведомления автоматически останавливались ночью и снова переназначались без необходимости открывать приложение. Как я могу это сделать? Возможно ли это с этим кодом? - person user1949873; 08.05.2013
comment
нет прямого способа сделать это, но взгляните на это stackoverflow.com/questions/15773544/ именно то, что вам нужно - person Bonnie; 08.05.2013
comment
На самом деле это был мой вопрос, но когда я попытался, я не смог заставить его работать, потому что у меня есть повторяющееся уведомление с 24-часовым интервалом, и он просит меня сделать его ежедневным интервалом повторения. Если прямого пути нет, то как это сделать? Учитывая, что мне нужно запускать уведомление каждые 5 минут. - person user1949873; 08.05.2013

что я попытаюсь сделать, так это, когда начнется время сна, вызовите метод, например: goingToSleep:, для этого вы можете использовать dispatch_later или performSelector:withObject:afterDelay:,

in goingToSleep:

NSArray* localNotifications = [[UIApplication sharedApplication] 
                                              scheduledLocalNotifications];
for (UILocalNotification *notification in localNotifications)
{
    if([fire compare: startTime.date] == NSOrderedDescending &&
       [fire compare: endTime.date]== NSOrderedAescending)
    {

Это важная часть

}

затем после окончания SleepTime снова вызовите метод, например: wakingUp:

затем в wakingUp:

  • прочитать массив NSDictionary, который мы сохранили.
  • снова создайте UILocalnotifications, используя те же свойства.

таким образом, никакие UILocalNotifications не будут срабатывать во время сна. одна проблема может заключаться в выполнении этих методов, если приложение не является памятью.

EDIT Чтобы иметь длительные запуски приложений.

person Bonnie    schedule 10.05.2013
comment
Большое спасибо, код сработал частично. Я попробовал свойство задержки, и оно работало во время работы приложения. Тем не менее, я все еще пытаюсь понять Plist, NSDictionary и массивы, чтобы заставить его работать в фоновом режиме. У меня есть 2 вопроса: есть ли у вас ссылки на учебник, объясняющий ваш ответ? Или вы можете указать мне на подробные ответы? - person user1949873; 11.05.2013
comment
Что вы подразумеваете под одной проблемой, которая может заключаться в выполнении этих методов, если приложение не является памятью? Что такое приложение памяти? - person user1949873; 11.05.2013
comment
К сожалению, PerformSelctor:withObject:afterDelay не будет работать в фоновом режиме после первых 10 минут :/ - person user1949873; 11.05.2013
comment
точно ..dats, что я имел в виду, когда сказал, что одна проблема может заключаться в выполнении этих методов, если приложение не является памятью. т.е. приложение закрывается ОС. найти способ, чтобы он работал, я разместил ссылка, посмотрите мой другой ответ - person Bonnie; 13.05.2013
comment
Почему вы ответили дважды? Вы не должны этого делать, вы должны обновить свой исходный ответ. - person Popeye; 13.05.2013
comment
Я знаю это, братан, но ты должен посмотреть на вопрос. мой первый ответ был связан только с условиями, которые не работали должным образом. и мой второй ответ был о награде. Если нет, то какой самый простой способ сделать такое условие? Мне пришлось опубликовать два ответа, потому что человек, посетивший вопрос позже, не понял бы. И нет необходимости всегда обновлять предыдущий ответ, особенно если оба они совершенно разные и правильные. в противном случае переполнение стека не дало бы возможности добавить два ответа. - person Bonnie; 13.05.2013
comment
Если честно, приятель, все выглядит так, будто ты дважды ответил на вопрос, и все. Нечего сказать, почему. Возможно, вам следует указать причину в своем ответе. Просто мое мнение, решать вам, если вы включите его. Пользователи не очень часто отвечают дважды, они обычно просто обновляют исходный ответ и дают понять, что это редактирование и причина редактирования. - person Popeye; 13.05.2013
comment
если бы вы прочитали вопрос и оба ответа правильно, у вас было бы другое мнение, оставьте его, приятель, идите дальше. - person Bonnie; 13.05.2013
comment
Я только что перечитал вопрос и оба ответа, и теперь я не вижу причин, почему для этого нужны два ответа от вас, это определенно мог быть один ответ. Во всяком случае, я собираюсь задать вопрос, как этот ответ (не первый) на самом деле отвечает на вопрос. Если что-то было включено в причину вознаграждения, то это должно быть где-то включено, поскольку никто не знает причину этого. Сейчас я рассматриваю возможность отрицательного ответа по обеим причинам, указанным в комментариях. - person Popeye; 13.05.2013
comment
хахаха. Я только что видел твой профиль, ты сумасшедший. даже когда я сказал оставить это и двигаться дальше, ты все еще застрял на том, что я публикую два ответа, и теперь голосую против него по причине публикации двух ответов, а не из-за качества самого ответа, и ты обо мне смешно называть людей в своем профиле .. ха-ха .. тебе серьезно нужно лекарство, приятель, теперь я понимаю, что с тобой не так, твой отрицательный голос никак не влияет на меня, это просто смутит других. Иди и сделай что-нибудь конструктивное, приятель, а не жалуйся, как ребенок. Это будет мой последний комментарий, у меня больше нет времени тратить на таких как вы. - person Bonnie; 14.05.2013