Показывать (локальное) уведомление, когда пользователь закрывает приложение из переключателя задач

Я хотел бы показать (локальное) уведомление пользователю, когда мое приложение завершается, будь то самой iOS или пользователем через переключатель задач.

Когда iOS убивает приложение из-за нехватки памяти, applicationWillTerminate функция вызывается на моем AppDelegateтак что я могу запланировать локальное уведомление в этом случае.

Тем не менее, когда пользователь убивает приложение, проводя его вверх в переключателе задач, applicationWillTerminate функция не вызывается (как указано в документации Apple и различные ответы здесь на SO). И все же, есть приложения, которые все же успешно показывают (локальное) уведомление пользователю в этом случае (особенно приложения отслеживания фитнеса, например, Human), с просьбой перезапустить приложение, чтобы можно было продолжить фоновое отслеживание.

Я могу подумать о некоторых (в основном неуклюжих или по крайней мере потребляющих батарею) способах сделать это, но есть ли хороший способ показать такое уведомление пользователю? Особенно, чтобы сделать это практически мгновенно после того, как приложение было убито пользователем, что исключает множество возможных обходных путей с планированием и отменой локальных уведомлений каждые n секунд в фоновом режиме...

2 ответа

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

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

Было бы неплохо иметь более приличный (и энергосберегающий) способ сделать это, например, постоянно получая время, чтобы сделать что-то непосредственно перед завершением работы приложения, независимо от причины его завершения.

Я пытался так:

  • Необходимо включить фоновый режим (Bluetooth, VoIP, служба определения местоположения)
  • Добавьте этот код в didFinishLaunchingWithOptions:

    [self addLocalNotification];
    [NSTimer scheduledTimerWithTimeInterval:9.0f
                                         target:self
                                   selector:@selector(addLocalNotification)
                                       userInfo:nil
                                        repeats:YES];
    
  • в addLocalNotification

    - (void) addLocalNotification{
    NSDate * theDate = [[NSDate date] dateByAddingTimeInterval:10]; // set a localnotificaiton for 10 seconds
    
    UIApplication* app = [UIApplication sharedApplication];
    NSArray*    oldNotifications = [app scheduledLocalNotifications];
    
    
    // Clear out the old notification before scheduling a new one.
    if ([oldNotifications count] > 0)
        [app cancelAllLocalNotifications];
    
    // Create a new notification.
    UILocalNotification* alarm = [[UILocalNotification alloc] init];
    if (alarm)
    {
        alarm.fireDate = theDate;
        alarm.timeZone = [NSTimeZone defaultTimeZone];
        alarm.repeatInterval = 0;
        alarm.alertBody =@"App must run" ;
    
        [app scheduleLocalNotification:alarm];
    }}
    

И это работает для меня. addLocalNotification будет работать до тех пор, пока приложение работает / в фоновом режиме. Как только оно будет завершено, уже запланированные локальные уведомления будут срабатывать вовремя. Интервал времени мы можем изменить по нашему интересу.

Другие вопросы по тегам