Подтвердить что ты не робот

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

Добрый день,

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

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

4b9b3361

Ответ 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)  
}