2013-10-30 51 views
0

我們的應用程序通過成爲遠程控制事件的第一響應者,使用遠程控制(例如,來自iOS7之前的舊式跳板,耳塞)明確阻止用戶表單。但是,在iOS7上,相同的代碼無法繞過控制中心的音樂控制。如何阻止iOS 7控制中心控制音樂應用程序?

從測試中,控制中心似乎已經繞過了所有音樂控制事件,包括UIEventSubtypeRemoteControlPause和UIEventSubtypeRemoteControlPlay和UIEventSubtypeRemoteControlTogglePlayPause。

控制中心是否有自己的遠程控制協議,或者截取遠程控制事件的方式在iOS7中發生了變化嗎?

相同的阻止代碼仍然可以與iOS6設備完美配合。這是我們做什麼:

  1. 加入我們的appDelegate的方法:

    (BOOL)canBecomeFirstResponder { 返回YES; }

  2. 調用此在applicationDidBecomeActive:

    [[UIApplication的sharedApplication] beginReceivingRemoteControlEvents];

    //將自己設置爲第一響應者 [self becomeFirstResponder];

  3. 調用此在applicationWillResignActive

    //關閉遙控事件傳遞 [[UIApplication的sharedApplication] endReceivingRemoteControlEvents];

    //辭去第一響應者 [self resignFirstResponder];

  4. 最後加入

(無效)remoteControlReceivedWithEvent:(的UIEvent *)receivedEvent {

if (receivedEvent.type == UIEventTypeRemoteControl) { 

     switch (receivedEvent.subtype) { 

      case UIEventSubtypeRemoteControlTogglePlayPause: 
       NSLog(@"Received: UIEventSubtypeRemoteControlTogglePlayPause\n"); 
       break; 

      case UIEventSubtypeRemoteControlPreviousTrack: 
       NSLog(@"Received: UIEventSubtypeRemoteControlPreviousTrack\n"); 
       break; 

      case UIEventSubtypeRemoteControlNextTrack: 
       NSLog(@"Received: UIEventSubtypeRemoteControlNextTrack\n"); 
       break; 

      case UIEventSubtypeRemoteControlPlay: 
       NSLog(@"Received: UIEventSubtypeRemoteControlPlay\n"); 
       break; 

      case UIEventSubtypeRemoteControlPause: 
       NSLog(@"Received: UIEventSubtypeRemoteControlPause\n"); 
       break; 

      case UIEventSubtypeRemoteControlStop: 
       NSLog(@"Received: UIEventSubtypeRemoteControlStop\n"); 
       break; 

      default: 
       NSLog(@"Received: Some remove control events\n"); 
       break; 
     } 
    } 
} 

任何指針將被理解的。

+0

爲什麼要投我一票?這是一個現實的問題。 – kakyo

回答

1

你不能阻止音樂應用程序。你的應用程序可以成爲一個雖然(蘋果不會那樣),然後控制中心將控制你的

+0

但是它怎麼來用它工作? – kakyo

+4

@ kakyo遠程控制事件處理是這樣的,你的應用程序可以由控制中心,耳塞,ets控制...它不是讓你的應用程序可以吃所述控件,防止來自所述來源的*其他*應用程序的控制。它只能在iOS6中工作,因爲iOS中存在一個錯誤,現在已經在iOS7中修復了。 – bbum

+0

@bbum,感謝您的澄清。沒想到自從我在官方xcode郵件列表上獲得解決方案後,這是一個錯誤......但如果在任何情況下啓動音樂應用程序都會劫持我的應用程序的音頻,那麼解決方案是什麼?我想這值得另一個問題。 – kakyo

0

我想我對發生了什麼有更好的想法,至少在CoreAudio級別。

當應用程序的音頻會話類別是獨奏環境時,音樂應用程序的播放事件會觸發類似於鬧鐘或電話的音頻會話中斷。此 將觸發應用程序的音頻會話中斷偵聽器回調,並顯示「進入中斷」狀態。

但是,正如人們所期望的那樣,音樂應用程序的暫停事件不會觸發具有「退出中斷」狀態的偵聽器回調。這個缺少的退出呼叫有效地凍結了我們應用的音頻會話。退出控制中心也不會觸發它。同樣的事情適用於物理遙控器,除了可以使用我上一封電子郵件中說的firstResponder技巧阻止物理遙控器。它不適用於控制中心。

除非我錯過了一些明顯的東西,否則我更確信CoreAudio或命令鏈中的其他框架中存在兩個錯誤。

錯誤1:如果首先進行入口呼叫,音頻會話中斷監聽器的退出呼叫不能由音樂遙控器進行。

錯誤2:控制中心的音樂遙控器不符合遠程控制事件機制。

我只是感到驚訝,沒有人報道過這一點。

我想我會提交一個錯誤報告,除非有人提出不同的建議。

UPDATE 錯誤2是虛驚一場。經過幾次重新整理iOS7 SDK的所有內容後,我們發現問題消失了。錯誤1仍然成立。

相關問題