2012-06-04 31 views
9

Dưới đây là một số thông tin cơ bản, nếu không hãy bỏ qua câu hỏi được in đậm. Tôi đang xây dựng một ứng dụng và tôi muốn nó có quyền truy cập vào các sự kiện trên màn hình khóa/điều khiển từ xa. Phần khó khăn là ứng dụng này không phát âm thanh, nó sẽ điều khiển âm thanh của một thiết bị khác gần đó. Giao tiếp giữa các thiết bị không phải là vấn đề khi ứng dụng ở nền trước. Như tôi vừa phát hiện ra, một ứng dụng không cho phép kiểm soát các điều khiển từ xa cho đến khi nó phát âm thanh với một phiên âm thanh phát lại và ứng dụng cuối cùng làm như vậy. Điều này trình bày một vấn đề bởi vì như tôi đã nói, ứng dụng điều khiển âm thanh của thiết bị KHÁC và không cần phải chơi riêng.Nhận các sự kiện điều khiển từ xa không có âm thanh

Độ nghiêng đầu tiên của tôi là để ứng dụng phát clip im lặng mỗi khi được mở để kiểm soát các điều khiển từ xa. Thực tế là tôi phải làm điều này làm cho tôi tự hỏi nếu tôi thậm chí sẽ được phép làm điều đó bởi Apple hoặc nếu có một cách khác để đạt được điều này mà không đánh lừa hệ thống với các clip âm thanh giả.

CÂU HỎI (S): Apple có phê duyệt ứng dụng phát clip âm thanh im lặng để kiểm soát điều khiển từ xa/khóa màn hình nhằm mục đích kiểm soát âm thanh của thiết bị khác không? Có cách nào giả định điều khiển các điều khiển từ xa không có phiên âm thanh không?

P.S. Tôi muốn có chức năng này trên iOS 4.0 trở lên.

P.P.S Tôi đã thấy this similar question và nó đã khiến tôi động não nhưng câu trả lời được cung cấp không cụ thể với những gì tôi cần biết.

Trả lời

25

LƯU Ý: Tính đến iOS 7.1, bạn nên sử dụng MPRemoteCommandCenter thay cho câu trả lời dưới đây.

Bạn tạo các lớp con được hệ thống cung cấp khác nhau MPRemoteCommand và gán chúng cho các thuộc tính của [MPRemoteCommandCenter sharedCommandCenter].

Tôi đang giữ phần còn lại của phần này để tham khảo lịch sử, nhưng những điều sau đây không được đảm bảo để hoạt động trên các phiên bản iOS gần đây. Trong thực tế, nó chỉ có thể không.


Bạn chắc chắn làm cần một âm thanh chơi nhưng không nhất thiết là một rõ ràng phiên để kiểm soát các sự kiện điều khiển từ xa. (AVAudioSession là ẩn đối với bất kỳ ứng dụng nào phát âm thanh.) Tôi đã dành một khoảng thời gian khá hợp lý để chơi trò chơi này để xác nhận điều này.

Tôi đã nhìn thấy rất nhiều sự nhầm lẫn trên internet về nơi thiết lập phương thức removeControlEventRecievedWithEvent: và các cách tiếp cận khác nhau đối với chuỗi phản hồi. Tôi biết phương pháp này hoạt động trên iOS 6 và iOS 7. Các phương pháp khác thì không. Đừng lãng phí thời gian của bạn xử lý các sự kiện điều khiển từ xa trong ứng dụng đại biểu (nơi họ từng làm việc) hoặc trong bộ điều khiển chế độ xem có thể biến mất trong vòng đời của ứng dụng của bạn.

Tôi đã thực hiện a demo project để hiển thị cách thực hiện việc này.

Dưới đây là một tóm tắt nhanh chóng của những gì đã xảy ra:

  1. Bạn cần phải tạo một lớp con của UIApplication. Khi tài liệu nói UIResponder, nó có nghĩa là UIApplication, vì lớp ứng dụng của bạn là một phân lớp của UIResponder. Trong phân lớp này, bạn sẽ triển khai các phương thức remoteControlReceivedWithEvent:canBecomeFirstResponder. Bạn muốn trả lại YES từ canBecomeFirstResponder. Trong phương pháp điều khiển từ xa, có thể bạn sẽ muốn thông báo cho trình phát âm thanh của mình rằng có gì đó đã thay đổi.

  2. Bạn cần yêu cầu iOS sử dụng lớp tùy chỉnh để chạy ứng dụng, thay vì mặc định UIApplication. Để thực hiện điều main.m như vậy, cởi mở và thay đổi này:

    return UIApplicationMain(argc, argv, nil, NSStringFromClass([RCAppDel`egate class])); 
    

    trông như thế này:

    return UIApplicationMain(argc, argv, NSStringFromClass([RCApplication class]), NSStringFromClass([RCAppDelegate class])); 
    

    Trong trường hợp của tôi RCApplication là tên của lớp tùy chỉnh của tôi. Sử dụng tên của lớp con của bạn để thay thế. Đừng quên #import tiêu đề phù hợp.

  3. TÙY CHỌN: Bạn nên định cấu hình phiên âm thanh. Nó không cần thiết, nhưng nếu bạn không, âm thanh sẽ không phát nếu điện thoại bị tắt tiếng. Tôi làm điều này trong đại biểu của ứng dụng demo, nhưng làm như vậy khi thích hợp.

  4. Phát nội dung nào đó. Cho đến khi bạn thực hiện, các điều khiển từ xa sẽ bỏ qua ứng dụng của bạn. Tôi chỉ lấy một số AVPlayer và đặt cho nó URL của một trang web phát trực tuyến mà tôi mong đợi. Nếu bạn thấy rằng nó không thành công, đặt URL của riêng bạn trong đó và chơi với nó vào nội dung trái tim của bạn.

Ví dụ này có thêm một chút mã trong đó để đăng xuất sự kiện từ xa, nhưng không quá phức tạp. Tôi chỉ xác định và vượt qua một số hằng số chuỗi.

Tôi đặt cược rằng tệp MP3 lặp lại im lặng sẽ giúp làm việc hướng tới mục tiêu của bạn.

+0

Rất tiếc, cảm ơn! Tôi sẽ xem bản demo khi tôi về nhà. Bây giờ bạn nói phương pháp ở đây hoạt động trong iOS 6 & 7; bạn có biết tắt đầu của bạn nếu nó sẽ đi xa như 5,1? – Squatch

+0

Tôi không biết chắc chắn, nhưng tôi nghĩ rằng những thay đổi đột phá giữa iOS 6 và 7, vì vậy tôi sẽ tưởng tượng rằng nó hoạt động trên iOS 5. – Moshe

+1

Tôi vừa sạc iPad của mình chạy iOS 5 và cố gắng chạy bản demo trên nó. Lúc đầu, nó sẽ không hoạt động, nhưng nếu bạn tắt tính năng tự động hoàn thành và tính năng bản địa hóa iOS 6+ (và sao chép ngòi ngách chưa được khai thác vào), nó chủ yếu hoạt động. Tôi nói chủ yếu là vì có gì đó sai với nút phát/tạm dừng. (Tôi nghĩ rằng đó chỉ là một loại sự kiện mà tôi đã không tính một cách chính xác. Chạy nó và bạn sẽ thấy những gì tôi có ý nghĩa.) – Moshe

1

Giải pháp của Moshe rất hữu ích cho tôi! Tuy nhiên, một vấn đề tôi nhận thấy là khi bạn tạm dừng âm thanh, các điều khiển phương tiện sẽ biến mất và bạn sẽ không thể phát lại nó mà không cần quay lại ứng dụng. Nếu bạn đặt Thông tin phương tiện trên màn hình khóa khi phát âm thanh thì điều này sẽ không xảy ra:

NSDictionary *mediaInfo = @{MPMediaItemPropertyTitle: @"My Title", 
           MPMediaItemPropertyAlbumTitle: @"My Album Name", 
           MPMediaItemPropertyPlaybackDuration: [NSNumber numberWithFloat:0.30f]}; 
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:mediaInfo]; 
Các vấn đề liên quan