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

Добрый день,

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

Кнопка Play/Pause на экране блокировки работает в iOS 5, но не в iOS 6.

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/
  • Навигатор проекта> target My App > General
  • Прокрутите вниз, чтобы найти связанные структуры и библиотеки

Ответ от Криса Ланди выше превосходен! Я поместил его блок кода в AppDelegate моего проекта, и это сработало.

Предупреждение: 1) Обязательно добавьте фреймворк AVFoundation в свой проект

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

в 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)
  }
}

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

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

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

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

Здесь версия 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)  
}
Другие вопросы по тегам