ユーザーがアプリを開いて音楽の再生を開始できるようにしたいと思います。ユーザーが任意のビューコントローラーに移動して、音楽を停止せずに最初のコントローラーに戻ることができるようにしたいと思います。無期限にループさせたい。
最初のViewControllerのviewDidLoad
メソッドを入れて、再生を開始しようとしました。何が起こるかというと、ユーザーは最初のView Controllerを離れ、戻ってくると、元のコピーと重なって音楽の再生が再開されます。
これを修正するために、サウンドがすでに再生されているかどうかをチェックするifステートメントを配置して、別のコピーを起動しません。viewDidLoadメソッドはifステートメントを完全に無視し、とにかくそれを再度再生します。 viewDid/WillAppear
も使ってみました。 applicationDidLaunchWithOptions
メソッドでアプリデリゲートにサウンドを入れてみましたが、完全に無音になりました。
シングルトンの使用も同様に機能します。
import AVFoundation
class MusicHelper {
static let sharedHelper = MusicHelper()
var audioPlayer: AVAudioPlayer?
func playBackgroundMusic() {
let aSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("coolsong", ofType: "mp3")!)
do {
audioPlayer = try AVAudioPlayer(contentsOfURL:aSound)
audioPlayer!.numberOfLoops = -1
audioPlayer!.prepareToPlay()
audioPlayer!.play()
} catch {
print("Cannot play the file")
}
}
}
次に、任意のクラスから使用できます(Swift 2.1)
MusicHelper.sharedHelper.playBackgroundMusic()
Swift 4.2アップデート
ステップ1。新しいクラス「MusicHelper」を作成します
ステップ2。以下からコードをコピーして貼り付けます
import AVFoundation
class MusicHelper {
static let sharedHelper = MusicHelper()
var audioPlayer: AVAudioPlayer?
func playBackgroundMusic() {
let aSound = NSURL(fileURLWithPath: Bundle.main.path(forResource: "MUSICNAME(replece file name)", ofType: "mp3")!)
do {
audioPlayer = try AVAudioPlayer(contentsOf:aSound as URL)
audioPlayer!.numberOfLoops = -1
audioPlayer!.prepareToPlay()
audioPlayer!.play()
}
catch {
print("Cannot play the file")
}
}
ステップ。コードを下からコピーしてViewControllerに貼り付けます
import AVFoundation //import at the top
var player: AVAudioPlayer? //declare in code
MusicHelper.sharedHelper.playBackgroundMusic() //paste in viewDidLoad
これが私のやり方です。このコードは、音楽の再生を開始するクラスシーン以外の場所に追加します。まったく新しいSwiftファイルを作成し、そこにこのコードを追加することもできます(AVFoundationのインポート)
var backgroundMusicPlayer: AVAudioPlayer!
func playBackgroundMusic(filename: String) {
//The location of the file and its type
let url = NSBundle.mainBundle().URLForResource(filename, withExtension: "mp3")
//Returns an error if it can't find the file name
if (url == nil) {
println("Could not find the file \(filename)")
}
var error: NSError? = nil
//Assigns the actual music to the music player
backgroundMusicPlayer = AVAudioPlayer(contentsOfURL: url, error: &error)
//Error if it failed to create the music player
if backgroundMusicPlayer == nil {
println("Could not create audio player: \(error!)")
return
}
//A negative means it loops forever
backgroundMusicPlayer.numberOfLoops = -1
backgroundMusicPlayer.prepareToPlay()
backgroundMusicPlayer.play()
}
それが終わったら、didMoveToView関数に移動し、ファイルの名前で関数を呼び出します。
playBackgroundMusic("IntroMusic")
テストしたところ、シーンを切り替えた後は完璧に動作します。
「numberofLoops = -1」を追加するだけで、バックグラウンドで無限に再生されます。
例(Swift):
func playBackgroundMusic() {
do {
if let bundle = NSBundle.mainBundle().pathForResource("someMP3file", ofType: "mp3") {
let alertSound = NSURL(fileURLWithPath: bundle)
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)
try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound)
audioPlayer.numberOfLoops = -1
audioPlayer.prepareToPlay()
audioPlayer.play()
}
} catch {
print(error)
}
}
楽しんで。
解決策を見つけました。 signalというビューコントローラープロパティを宣言しました。私は信号を言った:ブール? -次に、viewDidLoadに、signal == nilの場合にのみバックグラウンドソングを再生するifステートメントを配置します。次に、他のView Controllerで、mainviewcontrollerに戻ったときにsignal property = falseになるように設定しました。その後、曲は再び再生されず、すべてが正しく機能します。
for Swift 4:
func playBackgroundMusic() {
let aSound = NSURL(fileURLWithPath: Bundle.main.path(forResource: "music", ofType: "mp3")!)
do {
audioPlayer = try AVAudioPlayer(contentsOf:aSound as URL)
audioPlayer!.numberOfLoops = -1
audioPlayer!.prepareToPlay()
audioPlayer!.play()
} catch {
print("Cannot play the file")
}
}