0

音楽を再生し、現在の曲が終了すると自動的に次の曲に移動する AVAudioPlayer があります。これは、アプリが開いているときは完全に機能しますが、アプリが開いていないときは、次の曲に 1 回しか移動しません。バックグラウンドで1曲を最初から最後まで再生した後、

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag

再び呼び出されることはありません。私は持っている:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

viewdidload で, しかし, 問題はまだ続いています. 何が原因か知っている人はいますか?

4

2 に答える 2

0

編集: バグの少ない別の方法があります: これは、現在の進行状況を 0.5 秒ごとにチェックします (より正確な曲の変更には時間がかかる可能性があります)。次の 2 つのセレクターのいずれかを呼び出すだけです。

- (void)applicationDidEnterBackground:(UIApplication *)application

または他の方法で、それはあなた次第です。

-(void ) sel1 {

[self performSelector:@selector(sel2) withObject:nil afterDelay:0.1];
NSLog(@"%f", ( _audioPlayer.duration -  _audioPlayer.currentTime) );


if (( _audioPlayer.duration - _audioPlayer.currentTime) < 0.5) {

    [self nextSong];
}

}

-(void) sel2 {

 [self performSelector:@selector(sel1) withObject:nil afterDelay:0.4];
}

----- //古い方法// -----

まだこれを解決しようとしている人がいる場合、これが最善の解決策であることがわかりました。

- (void)applicationDidEnterBackground:(UIApplication *)application
{

float remaining = _audioPlayer.duration - _audioPlayer.currentTime;
[self performSelector:@selector(nextSong) withObject:nil afterDelay:remaining];

}

アプリがバックグラウンドに入った後、セレクターを実行するだけです。これにより、現在のサウンドが終了するとすぐに AVAudioPlayer が強制的に曲を変更します。アプリがバックグラウンドに入るたびに新しいセレクターがセットアップされるため、注意が必要です (そのため、セレクターが同時に複数回呼び出されます)。これをカウンターで解決し、常に1に保ちました。次のように:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
if (counter == 0) {
float remaining = _audioPlayer.duration - _audioPlayer.currentTime;
[self performSelector:@selector(nextSong) withObject:nil afterDelay:remaining];
counter ++;
}

}


-(void) nextSong {
counter = 0;

//Next Song Method

}
于 2014-05-04T15:01:45.787 に答える
0

Supporting Files -> YourProject-Info.plist -> 、およびそのキーRequired background modesの項目を確認しましたか? App plays audioバックグラウンドで音楽を再生するには、plist に追加する必要があります。

于 2013-04-16T02:19:08.983 に答える