アプリがバックグラウンドになったとしても音楽を再生したい。すべてのstackoverflowリンクをチェックしましたが、どれも機能しませんでした。今日それをする必要があるのを手伝ってください。
私は次のコードを使用していました:-
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"Day At The Beach" ofType: @"mp3"];
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
NSError *error;
playerTemp = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error];
playerTemp.numberOfLoops = 0;
AudioSessionSetActive(true);
[playerTemp play];
Mehulの答えにメモを追加したかっただけです。この行:
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
実際には非常に重要です。他のチュートリアルを使用して、AVAudioPlayerを起動して実行しました。アプリがバックグラウンドにある場合、私のオーディオが起動しないことを除いて、すべてが正常に機能しました。明確にするために、アプリがバックグラウンドになったときに既に再生されていた場合、私のオーディオは問題ありませんでしたが、アプリが既にバックグラウンドにあった場合は起動しませんでした。
上記のコード行を追加すると、アプリがバックグラウンドにある場合でも音声が開始されるようになりました。
Info.plistでUIBackgroundModesの1つとして「オーディオ」を設定する必要があります。 Apple has 問題に関するドキュメント 。
この行をバックグラウンド実行用のplistに書き込みます...
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
使用したい場所にこのコードを書く
AVAudioPlayer* audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:self.urlForConevW error:&error];
audioPlayer.delegate = self;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
audioPlayer.numberOfLoops = 1;
[audioPlayer play];
MPMusicPlayerController
を使用している場合は、ここでも重要です:使用する必要があります:
[MPMusicPlayerController iPodMusicPlayer]
そしてない
[MPMusicPlayerController applicationMusicPlayer]
また、アプリにstop music
アプリの起動時に再生していたものは、こちらをご覧ください: AVAudioPlayerはiPodをオフにします-回避策は?
MPMoviePlayerControllerを使用して、ソロのオーディオムービーを再生することもできます。よろしければ、この詳細なApple Library Technical Q&A:
PlistでUIBackgroundModes
の1つとしてオーディオを設定した後でも、バックグラウンドに移行するときにオーディオが停止する場合は、setting
your application's audio session
からmedia playback
。
関連リファレンスは次のとおりです。 https://developer.Apple.com/library/ios/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/Introduction/Introduction.html
コードは次のようになります。
NSError *activationError = nil;
[[AVAudioSession sharedInstance] setActive: YES error: &activationError];
NSError*setCategoryError = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError];
以下のコードを使用します。それは私のために働き、オーディオプレーヤーインスタンスメソッドのボタンクリックで呼び出します。
NSError *error; NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"music" ofType:@"mp3"]];
self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error];
[[AVAudioSession sharedInstance] setActive:YES error: &error];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self.player prepareToPlay];
すべての回答から、ユーザーがデバイスを起動しているときにプレーヤーを制御するためのこのコードが欠落しています。
- (BOOL)canBecomeFirstResponder {
return YES;
}
- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
switch (event.subtype) {
case UIEventSubtypeRemoteControlPlay:
[_audioPlayer play];
break;
case UIEventSubtypeRemoteControlPause:
[_audioPlayer pause];
break;
default:
break;
}
}
そして、これらすべてのオプションがあります:
UIEventSubtypeRemoteControlPlay = 100,
UIEventSubtypeRemoteControlPause = 101,
UIEventSubtypeRemoteControlStop = 102,
UIEventSubtypeRemoteControlTogglePlayPause = 103,
UIEventSubtypeRemoteControlNextTrack = 104,
UIEventSubtypeRemoteControlPreviousTrack = 105,
UIEventSubtypeRemoteControlBeginSeekingBackward = 106,
UIEventSubtypeRemoteControlEndSeekingBackward = 107,
UIEventSubtypeRemoteControlBeginSeekingForward = 108,
UIEventSubtypeRemoteControlEndSeekingForward = 109,
バックグラウンドでオーディオを再生するには
ステップ1:info.plistを追加して配列を作成します
ステップ2 :
- (void)applicationDidEnterBackground:(UIApplication *)application
{
__block UIBackgroundTaskIdentifier task = 0;
task=[application beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"Expiration handler called %f",[application backgroundTimeRemaining]);
[application endBackgroundTask:task];
task=UIBackgroundTaskInvalid;
}];
}
ステップ3:
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"iNamokar" ofType:@"mp3"];
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath];
AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[player prepareToPlay];
[self.player play];
Appleのサンプルコードから:オーディオミキサー(MixerHost)
// If using a nonmixable audio session category, as this app does, you must activate reception of
// remote-control events to allow reactivation of the audio session when running in the background.
// Also, to receive remote-control events, the app must be eligible to become the first responder.
- (void) viewDidAppear: (BOOL) animated {
[super viewDidAppear: animated];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
}
次の場合、リモートコントロールイベントは必要ないと思います。
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers,
sizeof(value), &value);