Показывать (локальное) уведомление, когда пользователь закрывает приложение из переключателя задач
Я хотел бы показать (локальное) уведомление пользователю, когда мое приложение завершается, будь то самой 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
будет работать до тех пор, пока приложение работает / в фоновом режиме. Как только оно будет завершено, уже запланированные локальные уведомления будут срабатывать вовремя. Интервал времени мы можем изменить по нашему интересу.