2011-02-08 40 views
10

Tôi có một ứng dụng, sẽ theo dõi mọi thứ người dùng thực hiện trong ứng dụng iPod. Để làm điều này, tôi đã thêm vài người quan sát vào NSNotificationCenter, như MPMusicPlayerControllerNowPlayingItemDidChangeNotification. Nhưng vấn đề của tôi là, tôi chỉ nhận được các thông báo đó khi ứng dụng của tôi ở nền trước, nếu ở chế độ nền, hệ thống sẽ thêm thông báo vào hàng đợi và sau đó ứng dụng của tôi sẽ hoạt động, nó sẽ gửi cho tôi. Tôi không quan tâm đến hàng đợi này vì tôi muốn nhận thông báo thời gian thực.Nhận thông báo với ứng dụng ở chế độ nền

Có cách nào để tôi nhận các thông báo đó ngay cả khi ứng dụng của tôi ở trạng thái bị tạm ngưng không? Tôi muốn chạy chỉ 3 dòng mã mỗi khi tôi nhận được thông báo NowPlayingItemDidChange này ví dụ.

Đây là nơi tôi thêm người quan sát.

MPMusicPlayerController *iPodMediaPlayer = [MPMusicPlayerController iPodMusicPlayer]; 



NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 

    [notificationCenter addObserver: self selector: @selector(handle_NowPlayingItemChanged:) name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification 

            object:iPodMediaPlayer]; 


[iPodMediaPlayer beginGeneratingPlaybackNotifications]; 

Ngoài ra, nếu tôi thêm một loại đối tượng khác vào người quan sát thay vì iPodMediaPlayer, người quan sát sẽ không gọi phương thức.

Thanks a lot, các ứng dụng

Abras

Trả lời

6

iOS bị đình chỉ khi họ không ở mặt trước. Có ba ngoại lệ đối với quy tắc này. Bạn có thể chạy mã trong nền nếu ứng dụng của bạn là

a) Phát âm thanh. Điều này có nghĩa là bản thân ứng dụng thực sự tạo ra âm thanh. Sự hiểu biết của tôi là đối tượng MPMediaPlayerController iPodMusicPlayer chỉ điều khiển quá trình phát lại của iPod bên ngoài, thay vì phát âm thanh từ chính ứng dụng đó. Có lẽ bạn có thể có một số thành công nếu bạn gọi applicationMusicPlayer thay vì iPodMusicPlayer và đặt cờ nền phù hợp trong ứng dụng của bạn Info.plist. Điều này có vẻ giống như cách hợp pháp nhất để ứng dụng của bạn hoạt động, nhưng bạn sẽ không thể điều khiển phát lại iPod từ ứng dụng iPod, chỉ ứng dụng của bạn và các điều khiển âm thanh của hệ thống.

b) Tải ứng dụng của bạn để theo dõi vị trí. Nếu ứng dụng đang sử dụng GPS, ứng dụng có thể tiếp tục chạy ở chế độ nền. Nhược điểm với điều này là GPS sẽ tiêu hao pin và người dùng có thể bị xáo trộn khi bạn đang yêu cầu vị trí của họ.

c) Yêu cầu UIApplication thêm thời gian. Nếu bạn sử dụng phương thức startBackgroundTask của UIApplication, ứng dụng của bạn sẽ tiếp tục chạy trong một khoảng thời gian hữu hạn trong nền. Nếu người dùng của bạn sẽ tham gia ứng dụng của bạn sau mỗi mười phút hoặc lâu hơn, điều này cũng có thể hoạt động.

Hy vọng điều đó sẽ hữu ích.

+0

Vâng, tôi biết chỉ có ba tùy chọn này. Nhưng tôi nghĩ có thể có một cách để đăng ký thông báo trong hệ thống, sau đó ứng dụng của bạn sẽ vào chế độ nền bình thường. Nếu người dùng làm điều gì đó kích hoạt thông báo thì Trung tâm thông báo sẽ đánh thức ứng dụng của bạn chỉ để ứng dụng có thể trả lời thông báo. Sau khi trả lời, nó sẽ trở lại chế độ nền như bình thường. – Abras

+0

@Abras: Bạn có tìm hiểu cách thực hiện việc này không? Tôi có một ứng dụng âm thanh. Và tôi muốn nó nhận được thông báo (khi các ứng dụng âm thanh khác xuất hiện) khi nó ở chế độ nền. Tôi phải làm nó như thế nào? – Namratha

+0

@Abras Bạn đã bao giờ tìm ra điều này chưa? – WMios

0

Tính năng đa nhiệm trong iOS hiện bị hạn chế. Bạn có thể bắt đầu một tác vụ nền bằng cách sử dụng phương thức beginBackgroundTaskWithExpirationHandler: (của một đối tượng UIApplication), nhưng nó được thiết kế để hoàn thành một tác vụ có độ dài hữu hạn trước khi bị treo. Tất cả các tác vụ nền có thể hết hạn (và bị chấm dứt) trước khi hoàn thành công việc của mình. Bạn có thể kiểm tra xem ứng dụng của mình có thể chạy được bao lâu nữa bằng cách kiểm tra thuộc tính backgroundTimeRemaining của đối tượng ứng dụng.

+0

Có, nhưng đó không phải những gì tôi muốn. Tôi muốn ứng dụng của tôi được gọi mỗi lần người dùng kích hoạt thông báo. – Abras

+0

Chính xác. Tôi nói rằng không có cách nào để làm điều đó, tốt, theo như tôi có thể nói. – MHC

+0

Vâng, cảm ơn lời khuyên. Tôi nghĩ rằng tùy chọn của tôi sẽ được thực hiện iPod của riêng tôi và xây dựng nó vào ứng dụng của tôi. Nó sẽ không thân thiện với người dùng, nhưng ít nhất tôi có thể đạt được những gì tôi muốn. – Abras

0

Như tôi đã giải thích ở đây iOS receive Media Player Notifications when app is in background, dường như không có cách nào để nhận thông báo từ iPodMusicPlayer.

Giới thiệu về Omar Raul Qazi trả lời:

a) tôi đã thử và không thành công. Âm nhạc tiếp tục giảm khi nhấn nút home. Tôi nghĩ cờ nền này chỉ hoạt động với AudioSessions bình thường chứ không phải cho MPMusicPlayer ...

b) Tôi không chắc chắn điều này sẽ làm việc và tôi không nghĩ rằng Apple sẽ thích nó khi tìm kiếm chính

c) Bạn có thể chạy ở chế độ nền chỉ nhiệm vụ đồng bộ. Bạn không thể đợi ở đó để nhận thông báo. Liệu tôi có sai?

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