web-dev-qa-db-ja.com

UIWebView:アプリがバックグラウンドに入ると、iOS 6でHTML5オーディオが一時停止する

良い一日、

私のアプリは音楽再生アプリです。私は<audio>- JavaScriptを使用したタグ。これまでのところ問題はありません。再生、一時停止、次のボタン、前のボタンが機能しています。 iOS 5でデバイスをスタンバイすると、音楽は再生され続けますが、次の自動曲が機能しません。スタンバイ状態でない場合は機能します。そしてiOS 6では、ボタンを押した直後に音楽がフェードアウトします。

ロック画面の再生/一時停止ボタンはiOS 5では機能しますが、iOS 6では機能しません。

27
heysamhey

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/でプロジェクトを開きます
  • プロジェクトナビゲーター>ターゲットマイアプリ>一般
  • 下にスクロールして、リンクされたフレームワークとライブラリを見つけます
73
Chris Lundie

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

このプラグインは、アプリにミュートスイッチを無視させます。基本的には他の回答にあるものと同じコードですが、プラグインにうまくラップされているため、手動でObjective Cを編集する必要はありません。

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

次のコマンドを実行して、プロジェクトに追加します。

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

ここでは、UIWebViewを作成する前に、オーディオセッションカテゴリを「再生」に設定するためのSwift 2.0バージョンです。

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