關(guān)于MPNowPlayingInfoCenter和MPRemoteCommandCenter

目標:

    實現(xiàn)網(wǎng)易云音樂播放音樂時提供給鎖屏的媒體資源信息以及控制中心中對音樂的控制。
    實現(xiàn)過程使用到的工具接口(MediaPlayer)
        1刃永、MPNowPlayingInfoCenter
        2徐许、MPRemoteCommandCenter
Untitled.gif

MPNowPlayingInfoCenter:

是什么:
    一個可用于設(shè)置并顯示APP中當前播放的媒體信息的對象
做什么:
    1、在設(shè)備鎖屏界面和控制中心中(in the multimedia controls in the multitasking UI)顯示媒體信息
    2替裆、通過AirPlay將媒體資源在AppleTV中播放時,播放信息將會出現(xiàn)在電視屏幕上窘问。
    3辆童、當前設(shè)備連接到一個iPod附件上,附件上也會顯示當前正在播放的媒體信息
怎么做:(Demo有更詳細的實現(xiàn))
    1惠赫、直接使用MPNowPlayingInfoCenter提供的單例根據(jù)需求的鍵值配置nowPlayingInfo屬性 把鉴。
    如:
        var info : [String : Any] = Dictionary()
        //作者
        info[MPMediaItemPropertyArtist] = "wizet"
        MPNowPlayingInfoCenter.default().nowPlayingInfo = info
蹩腳英文翻譯系列:(未標注版本的鍵均為iOS8及以下可用)
Name Type meaning
MPMediaItemPropertyAlbumTitle NSString 專輯歌曲數(shù)
MPMediaItemPropertyAlbumTrackCount NSNumber of NSUInteger 專輯歌曲數(shù)
MPMediaItemPropertyAlbumTrackNumber NSNumber of NSUInteger 藝術(shù)家/歌手
MPMediaItemPropertyArtist NSString 藝術(shù)家/歌手
MPMediaItemPropertyArtwork MPMediaItemArtwork 封面圖片 MPMediaItemArtwork類型
MPMediaItemPropertyComposer NSString 作曲
MPMediaItemPropertyDiscCount NSNumber of NSUInteger 專輯數(shù)
MPMediaItemPropertyDiscNumber NSNumber of NSUInteger 專輯編號
MPMediaItemPropertyGenre NSString 類型/流派
MPMediaItemPropertyPersistentID NSNumber of uint64_t 唯一標識符
MPMediaItemPropertyPlaybackDuration NSNumber of NSTimeInterval 歌曲時長 NSNumber類型
MPMediaItemPropertyTitle NSString 歌曲名稱
MPNowPlayingInfoPropertyElapsedPlaybackTime NSNumber (double) 在播資源的時間流逝,s為單位儿咱。流逝時間會從播放時間和播放速率中自動計算庭砍,不合適頻繁得更新
MPNowPlayingInfoPropertyPlaybackRate NSNumber (double) 在播資源的速率(保持與APP內(nèi)播放器的速率一致)
MPNowPlayingInfoPropertyDefaultPlaybackRate NSNumber (double) 在播資源的“默認”播放速率,當你的APP需要播放資源的播放速率默認都是大于1的混埠,那么就應(yīng)該使用這屬性
MPNowPlayingInfoPropertyPlaybackQueueIndex NSNumber (NSUInteger) 應(yīng)用重放隊列中怠缸,當前播放項的索引。注意索引值從0開始
MPNowPlayingInfoPropertyPlaybackQueueCount NSNumber (NSUInteger) 應(yīng)用重放隊列的總資源數(shù)目
MPNowPlayingInfoPropertyChapterNumber NSNumber (NSUInteger) 這在播放的部分岔冀,索引值從0開始
MPNowPlayingInfoPropertyChapterCount NSNumber (NSUInteger) 在播資源的總章節(jié)數(shù)目
MPNowPlayingInfoPropertyIsLiveStream(iOS 10.0) NSNumber (BOOL) 表示當前的資源是不是實時流
MPNowPlayingInfoPropertyAvailableLanguageOptions(iOS 9.0) NSArrayRef of MPNowPlayingInfoLanguageOptionGroup 在播資源的一組可用的語言類型凯旭。在給定組中一次只能播放一種語言類型的資源
MPNowPlayingInfoPropertyCurrentLanguageOptions(iOS 9.0) NSArray of MPNowPlayingInfoLanguageOption 當前播放項目的語言選項列表
MPNowPlayingInfoCollectionIdentifier(iOS 9.3) NSString 表示當前播放資源所歸屬的那個集合的標識符,可指作者使套、專輯罐呼、播放列表等≌旄撸可用于請求重新播放這個集合嫉柴。
MPNowPlayingInfoPropertyExternalContentIdentifier(iOS 10.0) NSString 一個不暴露的唯一標志符,標志當前正在播放的item奉呛,貫穿APP重啟计螺。可使用任何格式瞧壮,僅用于引用這個item和返回到正在播放資源的APP中
MPNowPlayingInfoPropertyExternalUserProfileIdentifier(iOS 10.0) NSString 一個可選型的不暴露的標志登馒,標志當前正在播放的資源的配置文件,貫穿APP重啟咆槽〕陆危可使用任何格式,僅用于返回到這個配置文件對應(yīng)的正在播放視頻的APP
MPNowPlayingInfoPropertyServiceIdentifier(iOS 11.0) NSString 服務(wù)商的唯一標志。如果當前播放的資源屬于一個頻道或者是定于的服務(wù)類型麦射,這個ID可以用于區(qū)分和協(xié)調(diào)特定服務(wù)商的多種資源類型
MPNowPlayingInfoPropertyPlaybackProgress(iOS 10.0) NSNumber (float) 表示當前播放資源的播放進度蛾娶,0.0表示未開始,1.0表示完全瀏覽完潜秋。區(qū)分于ElapsedPlaybackTime贮配,無需更高的精度要求饼煞。如:當字幕開始滾動時,這個電影可能被用戶期望開始播放(由字幕驅(qū)動播放進度)
MPNowPlayingInfoPropertyMediaType NSNumber (MPNowPlayingInfoMediaType) 指定當前媒體類型宠页,用于確定系統(tǒng)顯示的用戶界面類型
MPNowPlayingInfoPropertyAssetURL(iOS 10.3) NSURL 指向當前正播放的視頻或音頻資源的URL夫植≡艹郏可將視頻縮略圖或者音頻的波普圖使用于系統(tǒng)的UI上

遠程控制:

iOS7.1前使用的方法(remote control event)

    處理流程:(不建議使用)
        1系吭、開啟接收遠程控制事件(- (void)beginReceivingRemoteControlEvents)
        2咙鞍、配置相應(yīng)的信息(圖片,進度切距,下一首,上一首惨远,或者自定義處理事件)谜悟,以及對應(yīng)事件的處理
            (- (void)remoteControlReceivedWithEvent:(UIEvent *)event)
        3、結(jié)束接收遠程控制事件(釋放前處理 - (void)endReceivingRemoteControlEvents)

例子:

    在APPDelegate中的didFinishLaunching中調(diào)用  UIApplication.shared.beginReceivingRemoteControlEvents()//開始接收遠程控制
    并且重寫接收遠程控制信息的接口
    override func remoteControlReceived(with event: UIEvent?) {
        if event != nil {
            if event!.subtype == UIEventSubtype.remoteControlPlay {
                WZMusicHub.share.play()
            } else if event!.subtype == UIEventSubtype.remoteControlPause {
                WZMusicHub.share.pause()
            } else if event!.subtype == UIEventSubtype.remoteControlNextTrack {
                WZMusicHub.share.next()
            } else if event!.subtype == UIEventSubtype.remoteControlPreviousTrack {
                WZMusicHub.share.last()
            } else if event!.subtype == UIEventSubtype.remoteControlTogglePlayPause {
                //耳機的播放暫停
            }
          }
      }

iOS7.1后使用MPRemoteCommandCenter

是什么:
    一個可響應(yīng)系統(tǒng)外部附件(耳機等)以及系統(tǒng)控件發(fā)出的遠程控制事件的對象北秽。
做什么:
    獲取到這個單例對象后葡幸,使用共享的MPRemoteCommand對象,用于響應(yīng)各種遠程控制事件配置自己的需求贺氓。
    如:像網(wǎng)易云音樂一樣蔚叨,在鎖屏以及多媒體系統(tǒng)UI界面配置滑動播放進度(seekTime),下一曲辙培,上一曲蔑水,喜歡,不喜歡等配置
怎么做:(Demo有更詳細的實現(xiàn))
    一般的使用流程: 
        1扬蕊、使用MPNowPlayingInfoCenter提供的單例搀别,可獲得若干個command對象
        2、需要使用到的command設(shè)置對應(yīng)isEnable屬性為true尾抑,即開啟了對應(yīng)系統(tǒng)控件的可使用權(quán)
          (部分command之間存在沖突歇父,因為都位于同一位置,沖突的command部分UI最后顯示的是最后開啟的command)
        3再愈、最后是進行command事件回調(diào)處理
    另外有個別的command由于類型的多樣化榜苫,具有獨立特性的(如:MPFeedbackComman等)需要額外配置特定的接口

關(guān)于一些需求和實現(xiàn)過程的問題

    1、鎖屏顯示歌詞的處理:瀏覽了一些想法翎冲,都是繪制歌詞到圖片處
            這個功能個人認為比較雞肋垂睬,畢竟我覺得挺少人會面向鎖屏去看歌詞了,
            而且iOS11的鎖屏UI還改了,圖變得更小了羔飞,那么這個功能估計會被砍掉肺樟。
    2、使用changePlaybackPositionCommand進行seekTime時候逻淌,控制中心的播放進度條停止了下來
        使用帶handler的回調(diào),在回調(diào)處再次對info進行進度條的更新
    3卡儒、布局時UI的位置錯誤
      self.navigationController?.navigationBar.bounds.size.height ?? 0 + UIApplication.shared.statusBarFrame.size.height
      這個寫法系統(tǒng)會把0 + UIApplication.shared.statusBarFrame.size.height歸為一個整體,
      這就告訴了我們括號了重要性了??
       (self.navigationController?.navigationBar.bounds.size.height ?? 0) + UIApplication.shared.statusBarFrame.size.height
    4硬爆、調(diào)節(jié)系統(tǒng)音量時,隱藏系統(tǒng)音量控制界面(系統(tǒng)音量box)
      觸發(fā)條件:add到View上并設(shè)置frame位于視圖層顯示區(qū)域之外擎鸠,想要恢復(fù)顯示只要從圖層中remove就可以了
      ///實現(xiàn)處
      static func getSystemVolumeView() -> MPVolumeView {
        //frame位于視圖之外時實現(xiàn)“隱藏”系統(tǒng)音量控件效果
          let mpView : MPVolumeView = MPVolumeView(frame: CGRect(x: -1000, y: -1000, width: 40, height: 40))
          mpView.isHidden = false
          return mpView
      }
      ///調(diào)用處
      self.volumeView = WZEnsemble.getSystemVolumeView()
      self.addSubview(self.volumeView!)

最后效果:

Demo地址

詳細路徑
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市劣光,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绢涡,老刑警劉巖牲剃,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雄可,居然都是意外死亡凿傅,警方通過查閱死者的電腦和手機数苫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來文判,“玉大人,你說我怎么就攤上這事戏仓。” “怎么了敷待?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長榜揖。 經(jīng)常有香客問我勾哩,道長举哟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任潜叛,我火速辦了婚禮,結(jié)果婚禮上威兜,老公的妹妹穿的比我還像新娘。我一直安慰自己椒舵,他們只是感情好约谈,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棱诱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪军俊。 梳的紋絲不亂的頭發(fā)上捧存,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天粪躬,我揣著相機與錄音,去河邊找鬼昔穴。 笑死镰官,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的吗货。 我是一名探鬼主播泳唠,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼笨腥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脖母?” 一聲冷哼從身側(cè)響起闲孤,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后肥照,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡鲤脏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年亿蒸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片边锁。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖茅坛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情曹鸠,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布彻桃,位于F島的核電站晾蜘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏剔交。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一驯镊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧板惑,春花似錦、人聲如沸洒放。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至他膳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棕孙,已是汗流浹背些膨。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留订雾,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓烫映,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锭沟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361