UIWebView: звук HTML5 приостанавливается в iOS 6, когда приложение переходит в фоновый режим

Добрый день,

Мое приложение — это приложение для воспроизведения музыки. Я управляю тегом <audio> с помощью Javascript. Пока проблем нет, кнопки плей, пауза, далее и назад работают. Когда я жду устройство в iOS 5, музыка продолжает играть, но автоматическая следующая песня не работает. Когда он не в режиме ожидания, он работает. А в iOS 6 сразу после нажатия кнопки музыка затухает.

Кнопка «Воспроизведение/Пауза» на экране блокировки работает в iOS 5, но не в iOS 6.


person heysamhey    schedule 23.07.2012    source источник
comment
Возможно, подождать и посмотреть, исправят ли они это в более поздней сборке?   -  person BoltClock    schedule 23.07.2012
comment
Может это фича, а не баг?   -  person heysamhey    schedule 23.07.2012


Ответы (4)


Начиная с iOS 6, вы ДОЛЖНЫ установить категорию аудиосеанса на «воспроизведение» перед созданием UIWebView. Это все, что вам нужно сделать. Нет необходимости делать сеанс активным.

Это также следует использовать для html-видео, потому что, если вы не настроите сеанс, ваше видео будет отключено, когда переключатель звонка выключен.

#import <AVFoundation/AVFoundation.h>

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
BOOL ok;
NSError *setCategoryError = nil;
ok = [audioSession setCategory:AVAudioSessionCategoryPlayback
                         error:&setCategoryError];
if (!ok) {
  NSLog(@"%s setCategoryError=%@", __PRETTY_FUNCTION__, setCategoryError);
}

Убедитесь, что ваша цель связана с инфраструктурой AVFoundation.


Если вы используете Cordova, вам нужно изменить файл platforms/ios/MyApp/Classes/AppDelegate.m, и в конечном итоге он будет выглядеть так:

#import "AppDelegate.h"
#import "MainViewController.h"
#import <AVFoundation/AVFoundation.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    BOOL ok;
    NSError *setCategoryError = nil;
    ok = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError];
    if (!ok) {
        NSLog(@"%s setCategoryError=%@", __PRETTY_FUNCTION__, setCategoryError);
    }

    self.viewController = [[MainViewController alloc] init];
    return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

@end

Кроме того, как упоминалось в комментариях, вам необходимо связать AVFoundation Framework, как описано в этот ответ:

  • Откройте свой проект с помощью xcode open ./platforms/ios/MyApp.xcworkspace/
  • Навигатор проекта > целевое Мое приложение > Общие
  • Прокрутите вниз, чтобы найти связанные платформы и библиотеки.
person Chris Lundie    schedule 13.09.2012
comment
Вау, похоже, это связано с похожей проблемой, с которой я сталкиваюсь. Где ты это узнал? Есть ли где-нибудь документация о том, что изменилось в iOS6 с помощью UIWebView/AVAudioSession? - person strawtarget; 25.09.2012
comment
В примечаниях к выпуску iOS 6 говорится, что UIWebView больше не устанавливает сеанс воспроизведения звука, поэтому вы должны сделать это самостоятельно. Примечание, возможно, было добавлено только в выпуске GM. По крайней мере, у меня была эта проблема в период бета-тестирования, но я не нашел решения до GM. - person Chris Lundie; 25.09.2012
comment
Я никогда не работал с Objective-C и понятия не имею, что мне делать с этим фрагментом кода, не могли бы вы мне объяснить? - person heysamhey; 27.10.2012
comment
Нужно ли это делать до создания веб-просмотра или это можно сделать позже, когда начнется воспроизведение? - person pt2ph8; 18.11.2012
comment
@heysamhey этот код можно поместить в ViewController.m. Оператор импорта должен идти вверху, а остальные могут идти в viewDidLoad. Чтобы связать структуру AVFoundation, проверьте этот ответ на ТАК. - person block14; 24.01.2014
comment
Как предотвратить приостановку переключения видео на фон? - person Danil; 22.03.2014
comment
@ChrisLundie, возможно, вам следует добавить, что режим фонового звука также необходимо включить на вкладке возможностей XCode. Просто для полноты картины :-) - person bk138; 04.05.2015
comment
Раньше это решение отлично работало для меня в каждом приложении Cordova. Но кажется, что Cordova iOS 4.0.1, возможно, сделала что-то, чтобы сломать это, потому что я использовал точно такой же код, но фоновый звук по-прежнему не работает. Чтобы исправить это, я просто использовал плагин фонового звука, который не требует ручного ввода файлов классов: npmjs.com/package/nl.kingsquare.cordova.background-audio - person kdpnz; 17.02.2016
comment
Этот обходной путь все еще работает в последней версии iOS 13.4.1? - person magero; 07.05.2020

Этот плагин заставит ваше приложение игнорировать переключатель отключения звука. В основном это тот же код, что и в других ответах, но он красиво упакован в плагин, так что вам не нужно вносить какие-либо ручные изменения.

https://github.com/EddyVerbruggen/cordova-plugin-backgroundaudio

Запустите эту команду, чтобы добавить его в свой проект:

cordova plugin add https://github.com/EddyVerbruggen/cordova-plugin-backgroundaudio.git
person Dev01    schedule 05.02.2015

Быстрый синтаксис:

в AppDelegate:

import AVFoundation

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
  do{
      let audio = AVAudioSession.sharedInstance()
      try audio.setCategory(AVAudioSessionCategoryPlayback)
  }catch let error as NSError{
     print(error)
  }
}
person Weles    schedule 04.03.2016

Здесь версия SWIFT 2.0 для установки категории аудиосеанса на «воспроизведение» перед созданием UIWebView.

do {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
}
catch let error as NSError {
    print(error)  
}

do {
    try AVAudioSession.sharedInstance().setActive(true)
}
catch let error as NSError {
    print(error)  
}
person Aaleks    schedule 18.04.2016
comment
Есть ли такой метод для встроенных видео, которые могут воспроизводить звук, когда приложение переходит в фоновый режим. В настоящее время, когда приложение переходит в фоновый режим, звук перестает воспроизводиться. Однако я могу открыть Центр управления и продолжить играть в любое время. - person Justin Bush; 20.01.2017