Запускайте метод в течение 24 часов

#iphone #objective-c #ios #ios4 #iphone-sdk-3.0

#iPhone #objective-c #iOS #ios4 #iphone-sdk-3.0

Вопрос:

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

Ответ №1:

UILocalNotification позволит вам запускать уведомление (но не метод), когда ваше приложение работает в фоновом режиме, или вызовет метод делегирования, который вы реализуете (приложение: didReceiveLocalNotification:), если приложение запущено на переднем плане, или вызовет метод, который вы должны реализовать (приложение: didFinishLaunchingWithOptions:), когда пользователь отвечает на предупреждение. Кроме этого, вы не сможете вызывать метод, когда приложение не находится на переднем плане, вы сможете запускать только уведомление (которое может отображать значок, воспроизводить звук и т.д.).

Кстати, подумайте о том, чтобы отправить отчет об ошибке в Apple, если вам нужна эта функция. Я хотел бы иметь возможность запускать методы в фоновом режиме на основе локальных уведомлений, не дожидаясь, пока пользователь ответит первым.

Смотрите пример кода Apple:

 - (void)scheduleNotificationWithItem:(ToDoItem *)item interval:(int)minutesBefore {
    NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
    NSDateComponents *dateComps = [[NSDateComponents alloc] init];
    [dateComps setDay:item.day];
    [dateComps setMonth:item.month];
    [dateComps setYear:item.year];
    [dateComps setHour:item.hour];
    [dateComps setMinute:item.minute];
    NSDate *itemDate = [calendar dateFromComponents:dateComps];
    [dateComps release];

    UILocalNotification *localNotif = [[UILocalNotification alloc] init];
    if (localNotif == nil)
        return;
    localNotif.fireDate = [itemDate addTimeInterval:-(minutesBefore*60)];
    localNotif.timeZone = [NSTimeZone defaultTimeZone];

    localNotif.alertBody = [NSString stringWithFormat:NSLocalizedString(@"%@ in %i minutes.", nil),
         item.eventName, minutesBefore];
    localNotif.alertAction = NSLocalizedString(@"View Details", nil);

    localNotif.soundName = UILocalNotificationDefaultSoundName;
    localNotif.applicationIconBadgeNumber = 1;

    NSDictionary *infoDict = [NSDictionary dictionaryWithObject:item.eventName forKey:ToDoItemKey];
    localNotif.userInfo = infoDict;

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
    [localNotif release];
}
  

Комментарии:

1. Если приложение активно, сработает ваша реализация application:didReceiveLocalNotification: (если она у вас есть).