2016-11-17 6 views
1

アプリがバックグラウンドに入ったときや画面がロックされているときに音を鳴らす必要がある運動アプリケーションに取り組んでいます。私はまた、他のアプリからのサウンド(音楽など)を再生しながら、サウンドエフェクトを再生できるようにする必要があります。Swift 3でアプリがバックグラウンドになっているときのiOS 10での音の再生方法

私はAVAudioSessionCategoryAmbientを使用してiOS 9でこの作業を行っていましたが、私のアプリが非アクティブになるか画面がロックされるとすぐに音が止まります。

ここに私のコードの簡易版はデモアプリにあります:

import UIKit 
import AVFoundation 

class ViewController: UIViewController { 

var session: AVAudioSession = AVAudioSession.sharedInstance() 
var timer = Timer() 
let countdownSoundFile = "154953__keykrusher__microwave-beep" 
let countdownSoundExt = "wav" 
var audioPlayer = AVAudioPlayer() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    activateAudio() 

} 

func activateAudio() { 
     _ = try? session.setCategory(AVAudioSessionCategoryAmbient, with: []) 
     _ = try? session.setActive(true, with: []) 
} 

@IBAction func play() { 
    timer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(ViewController.playSound), userInfo: nil, repeats: true) 
} 

func playSound() { 

    if let soundURL = Bundle.main.url(forResource: countdownSoundFile, withExtension: countdownSoundExt) { 
     do { 

      print("sound playing") 
      try audioPlayer = AVAudioPlayer(contentsOf: soundURL) 
      audioPlayer.prepareToPlay() 
      audioPlayer.play() 
     } catch { 
      print("no sound found") 
     } 
    } 

} 
} 

私も自分のplistに必要なバックグラウンドモードを追加した、バックグラウンドモードでAudio, Airplay, and Picture in Pictureの能力を確認しました。

私はデバイスでこれをテストしています。スクリーンをロックしたり、ホームボタンを押すと、私のサウンドは止まり、アプリケーションが再びアクティブになると再開します。

私が使用して回避策が見つかりました:

var mySound: SystemSoundID = 0 
AudioServicesCreateSystemSoundID(soundURL as CFURL, &mySound) 
AudioServicesPlaySystemSound(mySound); 

をしかし、これは音の音量を変更することはできませんし、私もAVSpeechSynthesizerを使用する必要があり、この回避策は、そのために動作しません。 。

私はこの作業をするために何ができるのですか?

EDIT:

私は_ = try? session.setCategory(AVAudioSessionCategoryPlayback, with: [.mixWithOthers])にカテゴリ行を変更し、これはアプリの実行中に音楽を再生することを可能にする、しかし音はまだ時に画面がロックまたはバックグラウンドになり停止します。私はこれらのシナリオで演奏を続ける音が必要です。

EDIT:答えは指摘したように

、私は私のアプリがバックグラウンドにしたときの音を再生することはできませんが、_ = try? session.setCategory(AVAudioSessionCategoryPlayback, with: [.mixWithOthers])を使用すると、画面がオフになり、他のアプリからの音(音楽)と混合したときに音が再生できるようありません。

答えて

3

アンビエントオーディオセッションカテゴリでは、バックグラウンドで再生することはできません。あなたのカテゴリーは再生でなければなりません。

他のアプリからのサウンドを再生するには、Mixableオプション(.mixWithOthers)で再生カテゴリを変更します。

(カテゴリはいつでも変更することができますが、ほとんどの場合、周囲の雰囲気にすることができますが、バックグラウンドに入ることを知っているときは再生に切り替えることができます

EDITまた、解決が必要な可能性のある誤解もあります。新しい音を(簡単に)開始することはできません。あなたのアプリがバックグラウンドに入るとき、バックグラウンドオーディオはあなたが行うことを可能にしますは現在の音を再生し続けます。そのサウンドが(バックグラウンドで)止まると、あなたのアプリは中断し、それが終わりです。

+1

また、オーディオ用に「背景モード機能」も有効にする必要があります。 – iphonic

+0

@iphonic質問をお読みください。彼はそれをしたと言います。問題はなぜそれが不十分かということです。 – matt

+0

@mattアップデートで私の質問を編集しました。あなたの提案は、私のアプリがサウンドを再生している間に別のアプリからの音楽を再生できるようにしますが、画面が消えたり、アプリがバックグラウンドに入ると、何か案は? – OffensivelyBad

1

ここをクリックしてください。this answer詳細をご確認ください。アプリの設定からオーディオモードも有効にする必要があります。

do { 
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: .mixWithOthers) 
print("AVAudioSession Category Playback OK") 
do { 
    try AVAudioSession.sharedInstance().setActive(true) 
    print("AVAudioSession is Active") 
} catch { 
    print(error) 
} 
} catch { 
print(error) 
} 
関連する問題