topic{UIApplicationWillTerminateNotification не работает}
IOS4 UIApplicationWillTerminateNotification

Учусь тут по книжке Head First iPhone Development, и дошел до DrinkMixer, приложения для барменов вроде Сэма.

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

За решением проблемы и причиной её возникновения добро пожаловать под кат.

cut
Home - IOS3 - UIApplicationWillTerminateNotification - application termination

Тут нужно отметить, что я использую Xcode 3.2.5 и в симуляторе эмулируется iOS4. В однозадачных iOS3 и младше по нажатию кнопки Домой (1) генерировалось системное уведомление UIApplicationWillTerminateNotification (2), получая которое можно было отслеживать момент завершения приложения (3). На этом основывалось сохранение данных, по уведомлению данные сохраняются и приложение благополучно завершается.

Сначала регистрируюсь на получение UIApplicationWillTerminateNotification: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:nil]; В методе, вызываемом по уведомлению добавил отправку сообщения в лог, чтобы убедится в том что он вызывается: - (void)applicationWillTerminate:(NSNotification *)notification { NSLog(@"terminate message received"); } Естественно не забыл изъять себя из списка получателей уведомления: [[NSNotificationCenter defaultCenter] removeObserver:self];

С версии 4 в iOS добавлена многозадачность, когда пользователь жмет кнопку Домой, приложение не завершается а переводится в приостановленное состояние (suspended mode или "отправляется в бэкграунд или фон") и уведомление UIApplicationWillTerminateNotification не генерируется. В приостановленном состоянии оно висит, пока ОС либо не вернет его обратно, либо завершит его, причем во втором случае приложение не информируется об этом.

Быстрым решением проблемы без изменения кода было запретить приложению переходить в приостановленное состояние. Для этого нужно добавить (2) в имя_проекта-Info.plist (1) параметр "Application does not run in background" (3) и не забыть поставить галку (4).

Добавление параметра Application does not run in background в plist

Всё, теперь приложнение не сможет переходить в приостановленное состояние, вместо чего будет завершено, перед чем будет сгенерировано системное уведомление UIApplicationWillTerminateNotification.

Замечательно! Уведомление о завершении приложения генерируется, метод исполняется, в лог сообщение отправляется.

Кроме того можно было регистрироваться на уведомление UIApplicationDidEnterBackgroundNotification, которое генерируется перед тем как приложение будет переведено в приостановленное состояние или использовать метод applicationDidEnterBackground в application delegate.

К списку постов   На главную
comments
Комментарии закрыты.