UIWebView: аудио-паузы HTML5 в iOS 6, когда приложение входит в фоновый режим
Добрый день,
Мое приложение - приложение для воспроизведения музыки. Я управляю <audio>
-Tag с Javascript. Пока не работают никакие проблемы, воспроизведение, пауза, следующая и предыдущие кнопки. Когда я поддерживаю устройство в iOS 5, музыка продолжает играть, но автоматическая следующая песня не работает. Когда он не находится в режиме ожидания, он работает. И в iOS 6, сразу после нажатия кнопки, музыка исчезает.
Кнопка Play/Pause на заблокированном экране работает в iOS 5, но не в iOS 6.
Ответы
Ответ 1
Начиная с 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.
Если вы используете Кордову, файл, который вам нужно изменить, 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 > Общие сведения
- Прокрутите страницу вниз, чтобы найти связанные структуры и библиотеки.
Ответ 2
Я работаю над IOS7.
Работает с AVPlayer или AVAudioPlayer. Но он не работает для меня с видео html5 в UIWebView.
Весь мой код здесь.
- Вы можете вставить код в AppDelegate из нового пустого приложения ios
- Добавить структуру AVFoundation
- Включить фоновое аудио
-
Я не работаю, он появляется в центре управления, но музыка приостанавливается, когда приложение входит в Background!
#import "AppDelegate.h"
#import <AVFoundation/AVFoundation.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
BOOL ok;
NSError *setCategoryError = nil;
ok = [audioSession setCategory:AVAudioSessionCategoryPlayback
error:&setCategoryError];
if (!ok) {
NSLog(@"%s setCategoryError=%@", __PRETTY_FUNCTION__, setCategoryError);
}
UIViewController *vc = [[UIViewController alloc] init];
UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController: vc];
self.window.rootViewController = nav;
//WEBVIEW
UIWebView *myWeb = [[UIWebView alloc] initWithFrame:CGRectMake(0, 200, 320, vc.view.frame.size.height)];
myWeb.mediaPlaybackRequiresUserAction = NO;
myWeb.allowsInlineMediaPlayback = YES;
[vc.view addSubview:myWeb];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://www.romito.fr/public/inlineHTML5/"]];
[myWeb loadRequest: request];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
Ответ 3
Ответ от Chris Lundie выше! Я поместил свой блок кода в AppDelegate моего проекта, и он сработал.
Предупреждение:
1) Убедитесь, что вы добавили фреймворк AVFoundation в свой проект
Ответ 4
Этот плагин заставит ваше приложение игнорировать переключатель отключения звука. Это в основном тот же код, что и в других ответах, но он красиво завернут в плагин, так что вам не нужно выполнять какие-либо ручные задания c.
https://github.com/EddyVerbruggen/cordova-plugin-backgroundaudio
Запустите эту команду, чтобы добавить ее в свой проект:
cordova plugin add https://github.com/EddyVerbruggen/cordova-plugin-backgroundaudio.git
Ответ 5
Синтаксис Swift:
в 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)
}
}
Ответ 6
Здесь версия 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)
}