UILocalNotification не останавливает звук, когда приложение выводится на передний план, скользя по предупреждению
Когда мое приложение получает сетевые сообщения в фоновом режиме, оно создает UILocalNotification со звуком и вызывает nowLocalNotificationNow.
UILocalNotification* localNotif = [[UILocalNotification alloc] init];
localNotif.alertBody = [NSString stringWithFormat:@"%@: \r%@ \r%@", NSLocalizedString(@"XXXXXXXXXXX", nil), XXXXX, XXXXXXXXXXX];
localNotif.alertAction = NSLocalizedString(@"View", nil);
localNotif.soundName = [NSString stringWithFormat:@"%@.%@", XXXXTONE_LONGVERSION_FILENAME, XXXXTONE_FILENAME_EXT];
[[UIApplication sharedInstance] presentLocalNotificationNow:localNotif];
[localNotif release];
Это предупреждение отображается со звуком, как ожидалось. Но в некоторых случаях мне трудно остановить звук.
1) Когда есть блокировка экрана и отображается это уведомление локального оповещения:
- Если пользователь разблокирует экран, скользя по предупреждению, звук НЕ останавливается.
- Если пользователь разблокирует экран, сдвинув " > слайд для разблокировки", он останавливает звук.
2) Когда приложение является фоновым с блокировкой экрана, звуковой сигнал предупреждения обычно прекращается после того, как приложение выходит на передний план.
Я отменяю запланированные локальные уведомления, когда приложение выходит на передний план в didReceiveLocalNotification и applicationDidBecomeActive.
application.applicationIconBadgeNumber = 0;
[application cancelAllLocalNotifications];
Ответы
Ответ 1
Это известная ошибка iOS7, которая раздражает как ад.
У вас будет такая же проблема, если вы используете удаленные уведомления.
Обходной путь для этого состоит в том, чтобы дважды изменить счетчик значков приложения, по крайней мере, с шагом 0.
У меня есть этот метод в моем приложении:
- (void)fixRing{
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
// iOS7 fix for notification sound not stopping.
// see http://stackoverflow.com/questions/19124882/stopping-ios-7-remote-notification-sound
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
}
}
Не забудьте обновить счетчик значков до действительного значения иногда после.
EDIT:
Фактически, это не работает для локальных уведомлений, но только для удаленных (push) уведомлений. [application cancelAllLocalNotifications];
не работает, и [application cancelLocalNotification:notif];
...
Это ошибка, о которой я сообщил Apple, и находится на стадии "процесса" на момент написания.
Я пробовал много обходных решений (нажимать notif с небольшим звуком, чтобы стереть длинный звук, использовать таймер и повторять уведомление с более коротким звуком, а не позволять ему задерживаться на 30 секунд и т.д.), Но никто не работал.
Заметьте, что Google Hangout, похоже, тоже страдает от этой проблемы.. поэтому я думаю, что нет реального решения.
Ответ 2
В AppDelegate
в didFinishLaunchingWithOptions
вы получите свое уведомление:
UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (localNotif) {
// do something with it
}
Проверьте, можно ли остановить предупреждение от cancelLocalNotification: