2013-09-20 38 views
8

Tôi có ứng dụng iOS7 với trình phát nhạc. Tôi đang sử dụng mã sau để kiểm tra các thay đổi trạng thái phát lại từ MPMusicPlayerController để cập nhật giao diện người dùng. Chính xác hơn, tôi chuyển đổi giao diện của nút phát giữa phát và tạm dừng.iOS7 MPMusicPlayerBộ điều khiển trạng thái không chính xác

[[NSNotificationCenter defaultCenter] addObserver: self 
        selector: @selector (handle_NowPlayingItemChanged:) 
         name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification 
        object: self.musicPlayer]; 

[[NSNotificationCenter defaultCenter] addObserver: self 
        selector: @selector (handle_PlaybackStateChanged:) 
         name: MPMusicPlayerControllerPlaybackStateDidChangeNotification 
        object: self.musicPlayer]; 

[self.musicPlayer beginGeneratingPlaybackNotifications]; 

nếu tôi chạy ứng dụng trên iOS7 trên iPad hoặc iPhone, tôi nhận được chuỗi sau đây thay vì chỉ một callback duy nhất:

-[MyMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 1 
-[MyMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 2 
-[MyMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 1 
-[MyMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 2 

playbackState 2 có nghĩa MPMusicPlaybackStatePaused và gây ra ứng dụng của tôi để hiển thị sai trạng thái trong giao diện người dùng, trong khi bài hát thực sự được phát lại. Nó không có nghĩa là gọi lại được gọi là 4 lần, với giá trị xen kẽ.

Điều này xảy ra khi chỉ thay đổi hàng đợi. Có vẻ như hệ thống không xóa hàng đợi đúng cách.

Bất kỳ ý tưởng nào về cách giải quyết vấn đề này?

Trả lời

4

Tôi đã gặp sự cố tương tự kể từ khi phát hành iOS 7. Đó là một vấn đề với iOS; không chỉ là nó báo cáo tình trạng phát lại không chính xác mà còn vào những dịp không nhận được thông báo thay đổi trạng thái phát lại (MPMusicPlayerControllerPlaybackStateDidChangeNotification)

tôi đã báo cáo lỗi cho Apple và tôi đề nghị bạn làm điều tương tự (Apple Bug Reporter)

+0

Có, tôi đã gửi một lỗi cho Apple nhưng tôi cần một giải pháp để giải quyết ... – swifferina

+1

@ user1763004 Không có cách nào giải quyết vấn đề này. Nếu bạn đôi khi được phát sai trạng thái phát lại, không có cách nào để xác định xem nó có đúng hay sai trong một thời gian nhất định. Tôi đoán lựa chọn duy nhất khác là có cả nút phát và tạm dừng, nhưng tôi đoán đó không phải là thứ bạn muốn. – sooper

+0

Tôi gặp sự cố này trên trình phát nhạc.Không có cách nào để thoát khỏi điều đó cho đến nay. Đây là một vấn đề nghiêm trọng trên iOS7. – loretoparisi

4

Tôi đã từng gặp vấn đề tương tự. Tôi thấy cách giải quyết này, thay vì sử dụng playbackState để kiểm tra xem âm thanh được chơi, tôi đã sử dụng điều kiện này:

if([[AVAudioSession sharedInstance] isOtherAudioPlaying])

3

workaround khác là kiểm tra:

if([[MPMusicPlayerController iPodMusicPlayer] currentPlaybackRate] == 0) 
+1

Tôi thấy việc kiểm tra 'currentPlaybackRate' giải quyết được vấn đề tôi đang gặp phải. Tuy nhiên, bạn không bao giờ nên so sánh một phao bằng cách sử dụng bình đẳng! – matt

1

Cách giải quyết phụ thuộc vào thực hiện lại các cuộc gọi lại. Những gì tôi đã làm là như sau:

(1) Ngăn chặn các cuộc gọi lại trong khi thay đổi hàng đợi. Vì vậy, tôi có một con ngà BOOL doNotNoteNowPlayingItem. Một ví dụ gọi lại bắt đầu như thế này:

if (self.doNotNoteNowPlayingItem) // flag to prevent 
     return; 

Vì vậy, khi tôi sắp thay đổi hàng đợi, tôi giương cờ, thiết Ivar này để YES, và hạ thấp nó một lần nữa khi tôi về để thiết lập nowPlayingItem và đã sẵn sàng cho cuộc gọi lại. Các cuộc gọi lại khác sẽ hoạt động tương tự.

(2) Không sử dụng playbackState làm thử nghiệm xem chúng tôi có đang chơi hay không. Câu trả lời sẽ đúng nếu chúng tôi bị dừng lại, nhưng nếu chúng tôi đang chơi, câu trả lời có thể được báo cáo là bị tạm dừng. Để phân biệt phát từ bị tạm dừng, hãy kiểm tra currentPlaybackRate; nếu nó gần 1 chúng tôi đang chơi, nhưng nếu nó gần 0 chúng tôi bị tạm dừng.

Các vấn đề liên quan