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: