2013-07-08 39 views
6

Khi applicationDidEnterBackground: trigger, tôi tạm dừng các âm thanh được chơi bằng AVAudioPlayer:âm thanh tạm dừng bắt đầu chơi tự động trên applicationWillEnterForeground:

[self.avPlayer pause]; 

Bây giờ, khi applicationWillEnterForeground: cò súng, âm thanh bắt đầu chơi tự động! Vì tôi không khởi động âm thanh, giao diện người dùng không được cập nhật và nó cho thấy âm thanh vẫn ở trạng thái tạm dừng.

Điều gì đang xảy ra? Điều này đang xảy ra trong iOS 6.x, trên iPad 2. Vấn đề này không tái tạo trên iPad cũ hơn chạy iOS 5.x.

Đây là cách tôi thiết lập các AVAudioSession:

// Setup the audio session 
BOOL succeeded = NO; 
NSError *sessionError = nil; 
AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setDelegate:self]; 

if ([session respondsToSelector:@selector(setPreferredSampleRate:error:)]) { 
    succeeded = [session setPreferredSampleRate:128000.0f error:&sessionError]; 

} else { 
    succeeded = [session setPreferredHardwareSampleRate:128000.0f error:&sessionError]; 
} 

succeeded = [session setCategory:AVAudioSessionCategorySoloAmbient error:&sessionError]; 
succeeded = [session setActive:YES error:&sessionError]; 
+0

Tại sao bạn không thực hiện [self.avPlayer pause]; một lần nữa trong applicationWillEnterForeground:? – soryngod

+0

nơi bạn đang sử dụng mã này chính xác? –

+0

Đó là một giải pháp hit-n-trial tồi tệ (theo ý kiến ​​của tôi). Có nói rằng, :) Tôi thực sự DID thử điều đó và nó không hoạt động! Tôi không biết loại ma thuật nào đang được chơi ở đây. – Mustafa

Trả lời

1

Trong một trong những ứng dụng gần đây của tôi, tôi thấy một vấn đề tương tự mà phát lại âm thanh tạm dừng tự động và sơ yếu lý lịch sau khi bạn bị gián đoạn bởi một cuộc gọi và giao diện không được làm mới trong ứng dụng của tôi. Tôi đã cố định vấn đề này bằng cách sử dụng các phương pháp sau đây:

Đăng ký này trong lớp học nơi bạn xử lý mã máy nghe nhạc

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

Và sử dụng phương pháp AVAudioSession 's audioPlayerEndInterruption đại biểu để có được kiểm soát sau khi ứng dụng được khởi động lại. Trong chức năng này, bạn có thể tiếp tục phát lại và cập nhật giao diện người dùng cho phù hợp.

- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags 

Hy vọng điều này sẽ hữu ích.

0

Giải pháp của HRM không hiệu quả đối với tôi. Cách duy nhất tôi có để tránh tiếp tục phát tự động là sử dụng dừng: [self.avPlayer stop]

1

Tôi đã tìm thấy một số UX lạ và khi chuyển qua lại từ nền và dựa trên một loạt bài đăng, tôi ' d kế hoạch cho một chút cười khúc khích của tay cầm. Tôi đã làm điều gì đó khá đơn giản - hãy kiểm tra xem nhạc khác có đang phát khi ứng dụng đi vào nền trước:

func applicationWillEnterForeground(application: UIApplication) { 
     if AVAudioSession.sharedInstance().otherAudioPlaying{     
NSNotificationCenter.defaultCenter().postNotificationName(Notifications.ForegroundEnteredWithOtherAudioPlaying, object: nil) 
     } 
    } 

Nếu có, bạn có thể tạm dừng trình phát khi nhận được thông báo đó. Bạn đã đề cập rằng đã không làm việc nhưng không nhìn thấy phần còn lại của mã của bạn, thật khó để biết tại sao.

Một điều khác tôi phải làm là xóa người quan sát đến cờ status từ mục trình phát vì tôi nghe điều đó với giá trị ReadyToPlay nơi tôi yêu cầu AvPlayer thực sự phát. Điều đó được kích hoạt khi ứng dụng đi vào nền trước và có một phiên âm thanh hoạt động. Vì vậy, bằng cách loại bỏ người quan sát đó về tạm dừng và thiết lập nó mỗi khi chơi, (điều đó không điên vì tôi cho rằng đó là một ràng buộc OK để nói rằng tôi chỉ quan tâm sau khi tôi nhấn play), tôi có thể kiểm soát rất nhiều sự kỳ quặc.

Tôi cũng đã viết một loạt các trường hợp kiểm tra mà tôi sẽ chia sẻ ở đây để đảm bảo trải nghiệm của bạn ở dạng khá tốt. Nó không toàn diện nhưng nó cũng khá kỹ lưỡng.

// 1. Play, leave app, don't open anything else, come back 
    // 2. Play, leave app, open an app that plays music, come back 
    // 3. Play, leave app, open an app that plays music, play music, come back 
    // 4. Play, let audio go for 5 seconds, pause, open an app that plays music, come back 
    // 5. Play, let audio go for 5 seconds, pause, open an app that plays music, play music, come back 
    // 6. Press play, leave app before playback starts, open an app that plays music, come back 
    // 7. Crazy s$*t like play, leave app, open an app that plays music, play music, come back, tap a different song 
0

Tôi cũng gặp phải vấn đề tương tự. Vì vậy, tôi đã đăng ký lớp học của mình cho UIApplicationWillResignActive và tôi đã tạm dừng âm thanh khi tôi nhận được thông báo.