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