Vì vậy, tôi có một ứng dụng phát một loạt bài hát trong khi người dùng có thể lướt qua một cuốn truyện tranh. Tôi sử dụng AVAudioPlayer và tôi đã thiết lập để phát các bài hát theo thứ tự đã đặt. Vì vậy, khi một bài hát kết thúc, bài hát tiếp theo sẽ phát. Điều này hoạt động hoàn hảo khi ứng dụng được mở. Sự cố xảy ra khi ứng dụng ở chế độ nền. Tôi thiết lập ứng dụng để phát trong nền và hoạt động tốt. Vì vậy, khi người dùng nhấn vào màn hình chính, nhạc sẽ tiếp tục phát. Vấn đề xảy ra khi bài hát kết thúc, giả sử chơi bài hát tiếp theo như khi ứng dụng đang mở. Thay vào đó không có gì xảy ra. Theo báo cáo NSLog của tôi, các phương pháp chính xác đang được gọi nhưng không có gì xảy ra. Đây là mã của tôi:iOS - AVAudioPlayer không tiếp tục bài hát tiếp theo trong khi ở chế độ nền
- (void)audioPlayerDidFinishPlaying: (AVAudioPlayer *)player successfully: (BOOL) flag {
NSLog(@"Song finished");
if ([songSelect isEqualToString: @"01icecapades"]) {
isPlay = @"yes";
songSelect = @"02sugarcube";
imageSelect = @"playbanner02";
[self performSelector:@selector(triggerSong) withObject:nil afterDelay:0];
[self performSelector:@selector(triggerBanner) withObject:nil afterDelay:0];
}
else if ([songSelect isEqualToString: @"02sugarcube"]) {
isPlay = @"yes";
songSelect = @"03bullets";
imageSelect = @"playbanner03";
[self performSelector:@selector(triggerSong) withObject:nil afterDelay:0];
[self performSelector:@selector(triggerBanner) withObject:nil afterDelay:0];
}
else if ([songSelect isEqualToString: @"03bullets"]) {
isPlay = @"yes";
songSelect = @"04satanama";
imageSelect = @"playbanner04";
[self performSelector:@selector(triggerSong) withObject:nil afterDelay:0];
[self performSelector:@selector(triggerBanner) withObject:nil afterDelay:0];
}
else if ([songSelect isEqualToString: @"04satanama"]) {
isPlay = @"yes";
songSelect = @"05uglyjoke";
imageSelect = @"playbanner05";
[self performSelector:@selector(triggerSong) withObject:nil afterDelay:0];
[self performSelector:@selector(triggerBanner) withObject:nil afterDelay:0];
}
else if ([songSelect isEqualToString: @"05uglyjoke"]) {
isPlay = @"yes";
songSelect = @"01icecapades";
imageSelect = @"playbanner01";
[self performSelector:@selector(triggerSong) withObject:nil afterDelay:0];
[self performSelector:@selector(triggerBanner) withObject:nil afterDelay:0];
}}
Trên đây là đoạn code mà nhận ra bài hát nào đang phát, và đặt bài hát chính xác tới. Sau đó, nó kích hoạt một phương pháp khác để thiết lập trình phát.
- (void)triggerSong {
NSLog(@"triggerSong called");
NSString *path;
NSError *error;
// Path the audio file
path = [[NSBundle mainBundle] pathForResource:songSelect ofType:@"mp3"];
// If we can access the file...
if ([[NSFileManager defaultManager] fileExistsAtPath:path])
{
// Setup the player
player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&error];
//player = [initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&error];
[player setDelegate: self];
// Set the volume (range is 0 to 1)
player.volume = 1.0f;
[player prepareToPlay];
[player setNumberOfLoops:0];
[player play];
NSLog(@"player play");
[error release];
player.delegate = self;
// schedules an action every second for countdown
[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateTimeLeft) userInfo:nil repeats:YES];
}}
Bây giờ tôi giả định đây không phải là cách tốt nhất để làm điều này, nhưng nó hoạt động tuyệt vời khi ứng dụng ở trạng thái tiền cảnh. Tôi đã xem qua tài liệu và tôi dường như không thể tìm ra nguyên nhân của vấn đề này. Tôi đã hy vọng ai đó có thể nhìn thấy một lỗi để tiếp cận của tôi. Như tôi đã nói trước đây, hai NSLogs trong phương thức triggerSong đang được gọi nên tôi không thể thấy tại sao AVAudioPlayer (trình phát) không được gọi.
Ngoài ra tôi có các thiết lập đúng trong info.plist của tôi và tôi có điều này trong viewDidLoad của tôi:
//Make sure the system follows our playback status
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
Thanks cho bất kỳ cái nhìn sâu sắc. Nhiều đánh giá cao.
của bạn là tốt nhất! Cảm ơn bạn rất nhiều. Nó hoạt động hoàn hảo. –
Không sao cả! Nhưng điêu tôt đẹp nhât se đên vơi bạn. – Squatch
FYI .. liên kết của bạn sai ... nó phải là https://devforums.apple.com/message/264397 –