這個MPMoviePlayerViewController的事要從何提及呢,嗯……其實主要仍是因爲在播放視頻時按Home鍵切出引起的問題:php
先是測試發現遊戲在播放開場視頻時按Home鍵切換到後臺後會觸發libGPUSupportMercury.dylib: gpus_ReturnNotPermittedKillClient致使crash,關於這個異常大蘋果的Technical Q&A QA1766(http://developer.apple.com/library/ios/#qa/qa1766/_index.html)已經交待得很清楚了,簡單來講就是應用在處於後臺狀態時是不容許執行任何OpenGL命令的,包括前臺時提交但還沒有實際執行的緩衝指令!不過文檔中提到的幾個關鍵點我也都按規矩作了處理,稍做跟蹤後發現,致使這個異常的緣由是在應用播放視頻時切到後臺以後,MPMoviePlayerPlaybackDidFinishNotification通知被莫名其妙的觸發了,致使後續邏輯按照開場視頻播放結束開始執行,進而去加載OpenGL貼圖,初始化狀態等,因而天然被OS認爲是違規調用了OpenGL命令,所以被kill掉了!html
隨後,經過對MPMoviePlayerController的MPMoviePlayerPlaybackStateDidChangeNotification通知消息進行跟蹤後發現,當app切換到後臺以後,MoviePlayer並無按照我以前所想的那樣,對還沒有播放完成的視頻作了暫停操做(MPMoviePlaybackStatePaused狀態),而是直接切換到了MPMoviePlaybackStateStopped狀態,隨後發出了視頻播放結束的通知!ios
既然如此,我就按照實際發生的狀況,在AppDelegate的applicationWillResignActive:和applicationDidBecomeActive:消息中做了一下狀態處理,忽略掉應用後臺時收到的視頻播放完成通知,這樣修改以後,後臺調用GL命令的狀況就沒再出現了。可是,隨之而來的又發現了另外一個問題,就是視頻播放過程當中切出再切回來時視頻應該以繼續的方式接着播放,而因爲以前測試發現的stop狀態,致使每次應用切回來後都是從頭開始播放!搜索一番後發現能夠用MPMoviePlayerController的setInitialPlaybackTime:方法設置視頻初始播放時間,也就是說須要手動記錄視頻播放中斷時的時間,這個好辦,用一個NSTimeInterval保存MPMoviePlaybackStatePaused或應用切出時的currentPlaybackTime便可。app
滿心歡喜的改完後,卻發生了悲劇的事情:真機測試時,發現這種實現方式在iOS5設備上沒有問題,雖然切回來時不必定能準肯定位到中斷時的時間,但也會是在附近繼續播放,算是實現了預期的效果,但是在iOS6設備上測試時,發現setInitialPlaybackTime:徹底沒有起到做用,視頻依然是從頭播放!這個問題後來在cnrainbird的博客中找到了一絲線索:http://blog.cnrainbird.com/index.php/2012/11/02/jiu_gong_cheng_shi_pei_ios6_he_iphone5_xu_zhi_mpmovieplayercontroller/,但我按照此篇博文裏的方式修改了一下後測試發現依然沒有效果!無論怎麼說,用MPMoviePlayerViewController時的setInitialPlaybackTime在iOS6上不起做用這已是個不爭的事實了,也許是bug!iphone
搜索各類論壇,翻各類博客後,無心間發現了大蘋果官方的MoviePlayer示例程序:http://developer.apple.com/library/ios/#samplecode/MoviePlayer_iPhone/Introduction/Intro.html,載下來替換成本身的視頻試了一下切出和切入,發現徹底沒有問題,暫停和繼續的時間都和我如今的方法在iOS5設備上看到的同樣,細看了一下代碼實現後,發現這個例子並無用MPMoviePlayerViewController而是本身實現了一個繼承自UIViewController的封裝了MPMoviePlayerController的自定義視圖控制器,隨後斷點跟蹤了一下例子裏的代碼執行邏輯,發現程序切出後,通知回調並無像我以前的作法那樣收到MPMoviePlaybackStateStopped狀態通知(同時也沒有播放完成的通知!),而就是所想的MPMoviePlaybackStatePaused狀態,固然,這些都是在iOS6設備上測試的。繼續看代碼後發現,示例程序也沒有對applicationWillResignActive:和applicationDidBecomeActive:或相似消息作什麼特殊處理。所以判定:iOS6下慎用MPMoviePlayerViewController!測試
替換掉了原來的MoviePlayer視頻播放邏輯實現方式,改成和大蘋果例子同樣的自定義視圖控制器封裝MPMoviePlayerController的作法後,以前的問題獲得了比較完美的解決!code