en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

1.11.2013

使用 Remote Control 來控制退至背景播放的音樂

 

Remote Control 是在 iOS 4.0 SDK 之後才出現的功能,它會出現在雙擊 Home 按鍵之後左邊的畫面中(往右滑動)。在背景音樂執行的階段,你可以透過 Remote Control 來控制音樂的播放或是聲音的大小等等,下列程式碼將示範如何將應用程式與 Remote Control 做連接與互動。


背景音樂播放
在實作 Remote Control 功能之前,你必須要有一個能具有背景播放音樂功能的應用程式,也就是當退至裝置主畫面時,應用程式裡的音樂仍然可以不間斷的持續播放,你可以參考使用 AVAudioPlayer 來播放音樂一文來製作一個簡單的背景音樂播放器。


啟用與停用 Remote Control 功能
//啟用RemoteControl功能
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

//停用RemoteControl功能
[[UIApplication sharedApplication] endReceivingRemoteControlEvents];

這簡單的一行程式碼,就決定你的應用程式是否能夠使用 Remote Control 所提供的功能,你必須在應用程式尚未進入背景執行前插入「啟用 Remote Control 功能」的程式碼,並且在應用程式從背景返回時插入「停用 Remote Control 功能」的程式碼(視個人需要而定),當啟用 Remote Control 功能之後,你的應用程式圖案就會出現在 Remote Control 上。

ps:啟用 Remote Control 功能必須要在「音樂播放」之前。


Remote Control 按鈕事件
Remote Control 雖然只有三顆按鈕,但是在操作上卻包含「單擊」、「雙擊」與「久按」,一共有 9 種不同的按鈕事件,雖然看起來相當複雜,但是我們可以透過 UIEventSubtype 來簡單的分辨它們。
- (void)remoteControlReceivedWithEvent:(UIEvent *)event {

    //確定是由 RemoteControl 所傳來的事件
    if ([event type] == UIEventTypeRemoteControl) {

        //透過 UIEventSubtype 來分辨每個操作
        switch ([event subtype]) {
            case UIEventSubtypeRemoteControlTogglePlayPause:
                [self doPauseAndPlay]; //自訂播放/暫停的方法函式
                break;

            case UIEventSubtypeRemoteControlPreviousTrack:
                [myPlayer setCurrentTime:0.0]; //跳轉至最前面
                break;

            default:
                break;
        }
    }
}

ps:參考 UIEvent Class Reference 取得其他 UIEventSubtype 的相關資訊。


First Responder
最後,這也是最重要的一點,當程式退至背景執行時就已經失去了操作的 Focus,這點跟 啟用 iOS 上的虛擬鍵盤很像,所以為了能夠讓應用程式在背景也能夠維持正常操作,還需要設定 First Responder 維持操作上的 Focus,否則,Remote Control 是不會對使用的操作有任何的反應。
- (BOOL)canBecomeFirstResponder {
    return YES;
}






沒有留言:

張貼留言