接到一個跨應用錄屏的需求,要求封裝成SDK
給到別的團隊去使用,調研了一波錄屏相關的實現,iOS
目前唯一能實現的怕也只是基於ReplayKit
的Broadcast Upload Extension
了
但是有一定侷限性,在控制中心啓動錄屏,如果手機存在多個應用支持該方式錄屏,長按出現一個可選列表,很容易選錯或者誤操作, 可能蘋果也想到了這一點在iOS12
以上則可以在應用內調用啓動錄屏,就是UI
不易定製,得用蘋果自帶的UI
或者hack
按鈕點擊(hack有一定風險 後續版本如果UI層級改變或者實現方式改變就得跟着改 萬一出現問題容易出現生產事故
)
主要思路
-
宿主需要獲得視頻文件或者視頻流進行業務處理, 這裏就涉及到進程間通信,目前瞭解到的實現方案有
-
如果是錄製視頻文件則可以採用
App Groups
實現文件沙盒共享 -
如果是視頻流數據 可以通過本地
Socket
服務, 建立長鏈接進行通信
-
-
錄屏回調事件轉發,採用底層的通知中心(
CFNotificationCenterGetDarwinNotifyCenter
)從拓展發送給宿主,然後宿主進行轉發處理 -
創建
Broadcast Upload Extension
在SampleHandler
裏處理視頻數據的寫入,轉發回調等邏輯,也可以封裝一個framework專門處理視頻寫入以及進程通信
目前遇到的問題
-
應用切到後臺,點擊左上角紅點結束錄屏,使用
CFNotificationCenterGetDarwinNotifyCenter
通知宿主,控制檯打印沒有及時顯示,而是等應用切到前臺纔有打印, 這裏涉及到停止錄屏的後續操作,跨應用錄屏的話停止錄屏時,宿主應用應該需要知道已經結束錄屏了,然後回到宿主應用內進行下一步的業務邏輯... 這一個問題還需進一步驗證,那就是在拓展裏SampleHandler
結束回調時,嘗試直接打開喚醒宿主應用 -
集成問題也比較複雜,不像普通SDK只需拖拽一個framework就完事了,這個還需項目新建
target
Broadcast Upload Extension 添加錄屏處理的代碼,然後還要新建App Group
進行關聯