iOS中錄屏庫ReplayKit的詳盡使用總結
一、ReplayKit庫的介紹:
1.1簡介
在使用應用或者遊戲的過程中錄製回放,一直是iOS開發者絞盡腦汁想要實現的功能。但由於移動裝置效能的限制,這一功能往往較難實現或者效果難以滿足使用者的需要。終於,隨著iOS9的釋出,蘋果提供了ReplayKit框架來幫助開發者實現錄製回放的功能。
在iOS 9中,ReplayKit 是一款全新的框架,它可以讓玩家更便捷地記錄遊戲或者應用的畫面,錄製自己的聲音。ReplayKit為使用者或者玩家提供了一個全功能的互動介面,使用者可用它來編輯或製作自己的視訊剪輯。
ReplayKit不需要太大電量損耗和效能損耗就可以產出高清的視訊記錄。ReplayKit支援使用A7晶片以上,作業系統為iOS 9或更高版本的裝置。
1.2使用
1、匯入標頭檔案#import <ReplayKit/ReplayKit.h>。ReplayKit框架中包含兩個主要類:RPScreenRecorder負責錄製回放視訊,RPPreviewViewController為使用者提供預覽、分享、儲存等功能。
2、檢測裝置是否支援ReplayKit框架。ReplayKit只有在iOS9上才可以使用,所以使用前需要判斷裝置是否支援該項功能,然後通過"[RPScreenRecorder sharedRecorder].available"屬性我們可以判斷RPScreenRecorder
3、開始錄製。
呼叫RPScreenRecorder的- (void)startRecordingWithMicrophoneEnabled:(BOOL)microphoneEnabled handler:(nullable void(^)(NSError * __nullable error))handler
方法開始錄製回放視訊。當該方法呼叫時使用者會收到許可權請求警告,這個警告每次會在開始錄製時出現。然而,一旦使用者選擇了其中一種偏好設定,系統會在接下來的8分鐘記住這個選擇。
4、停止錄製。
通過呼叫RPScreenRecorder 的- (void)stopRecordingWithHandler:(nullable void(^)(RPPreviewViewController * __nullable previewViewController, NSError * __nullable error))handler;方法可以停止錄製回放視訊。在該方法中我們可以獲取到一個RPPreviewViewController物件。預覽和儲存。將得到的RPPreviewViewController物件呈現給使用者,就可以讓使用者預覽已經錄製的視訊,並且自行選擇是否保存錄像。
二、app錄屏功能
2.1背景
1、為了滿足讓使用者或者測試人員在發現問題的時候可以很好的非現場性復現
2、後期可為使用者提供功能指導教學視訊
2.2技術選擇
開始考慮用第三方提供的錄屏sdk進行跨app錄屏,經過調研發現有幾個問題:
1、提供錄屏的sdk太少;
2、有提供的錄屏相關功能的應用但是不能跨app進行錄製;
3、有錄屏功能的demo,但是問題太多,或者實現太複雜,風險太高
由於以上幾個原因,並且點評管家最低支援的版本是8.0,而且dau中8.x的使用者佔比只有1%(900+/10w),故而選擇系統源生提供的錄屏功能庫ReplayKit。
2.3具體實現
1、給app新增一個類似於AssistiveTouch的window來控制錄屏開始和結束,採用單例
2、開啟相關許可權並錄屏,錄屏結束後選擇上傳至騰訊雲,同時將視訊儲存一份至本地相簿
全域性單例實現透視window
控制透視window顯示與否方法:
開始錄屏:
結束錄屏:
上傳至騰訊雲:
2.4實現結果
2.3遇到的問題和如何解決
1、如何獲取錄屏視訊的本地url
由於錄屏結束後的回撥返回的RPPreviewViewController的例項中存放了視訊地址movieUrl,只能在debug狀態下打印出來,卻無法獲取,因為movieUrl沒有爆露在標頭檔案。在網上找了好多資料,也看了官方文件,沒有找到解決辦法,花了好長一段時間一直沒有解決此問題。後來嘗試去給RPPreviewViewController寫category的方式似乎可以獲取。所以最終選擇下面這個方式去獲取:
1、先定義一個category:
2、拿到了movieUrl卻拿不到視訊,無法上傳至騰訊雲
由於ReplayKit這個庫在錄完頻後,先把視訊儲存在replaykit私有下的沙盒裡面,其他應用是無法獲取的,所以想到以下兩種方法去拿真實視訊:
(1)先將movieUrl指定的視訊儲存至指定的沙盒檔案,然後將檔案上傳騰訊雲;
(2)將movieUrl指定的視訊儲存至相簿,然後將檔案上傳至騰訊雲。
由於本身功能裡面需要我們儲存至相簿裡面,所以決定採用第二種方案,並且由於第一種方案上傳的時候缺少一些上傳的必須引數,而且設定起來非常麻煩。
儲存至本地相簿:
3、iOS8.0系統啟動crash問題
dyld: Library not loaded: /System/Library/Frameworks/ReplayKit.framework/ReplayKit
原因:程式碼在編譯階段的時候#import <ReplayKit/ReplayKit.h>了動態連結庫ReplayKit,即使在不執行相關功能程式碼代情況下,由於ReplayKit庫沒有主動新增至Link Binary With Libraries裡status預設是required,所以應用在啟動的時候強制去獲取ReplayKit庫相關程式碼,由於在iOS 8上沒有該庫,所以啟動的時候Load不到就crash了。
修復辦法:將ReplayKit庫在project 下的buildphases下改成optional即可。