iOS ReplayKitを調べた内容を纏めてみました。
環境
- macOS Big Sur 11.0 Beta
- Xcode 11.6
- 実機 iOS 13.6
機能概要
ReplayKitの主な流れ
- ReplayKitはiOS9から追加
- iOS11からアーキテクチャが変更され、RepalyKit2に
- iOS11からコントロールセンターの画面収録機能が追加
ReplayKitには、主に2つの機能がある
1. 画面録画
1.1. Screen Recording(iOS9〜)
1.2. In-App Screen Capture(iOS11〜)
2. Live Broadcasting
2.1. In-App Broadcast(iOS10〜)
- 実行中アプリの映像と音声を配信
2.2. Broadcast Pairing(iOS11〜)
2.3. iOS System Broadcast(iOS11〜)
2.4. System Broadcast Picker(iOS12〜)
実装方法
Screen Recording
RPScreenRecorder
と RPPreviewViewController
を使用する
ネットに情報が多いので割愛
In-App Screen Capture
RPScreenRecorder
を使用する
ネットに情報が多いので割愛
In-App Broadcast
RPBroadcastActivityViewController
を使用する
いまいち使い方はよくわからず
Broadcast Pairing
RPBroadcastActivityViewController
を使用する
preferredExtension に Broadcast Setup UI Extension
のBundle IDを設定するとリストにSetup UIが表示されるが、いまいち使い方はよくわからず
iOS System Broadcast
- File → new → Target から
Broadcast Upload Extension
を追加する - コントロールセンター → 画面収録 を長押しすると一覧に追加したExtensionが表示され、ブロードキャストを開始ができる
- ブロードキャストを開始すると
Broadcasst Upload Extension
の processSampleBuffer() で Video / Audio Sample を受信する
System Broadcast Picker
- 自アプリから画面収録画面を表示するには
RPSystemBroadcastPickerView
を使用する
let broadcastPicker = RPSystemBroadcastPickerView(frame: CGRect(x: 10, y: 50, width: 100, height: 100))
// 追加したBroadcast Upload ExtensionのBundleIDを設定
broadcastPicker.preferredExtension = kUploadExtension
// マイクのオン/オフ表示を設定
broadcastPicker.showsMicrophoneButton = true
// デフォルト表示の二重丸アイコンを文字列に変更
for subview in broadcastPicker.subviews {
let b = subview as! UIButton
b.setImage(nil, for: .normal)
b.setTitle("画面共有", for: .normal)
b.setTitleColor(.black, for: .normal)
}
self.view.addSubview(broadcastPicker)
対応ソース
https://github.com/shima-0215/ReplayKitSample
ReplayKit対応アプリの動作
Zoom
ZoomはReplayKitを使用し、画面の共有をおこなう機能を有している
-
コントロールセンターの画面収録を長押しし、
zoom
を選択しブロードキャストを開始する
をタップするとiOS画面を共有できる(iOS11〜) -
ミーティング中画面の
共有
から画面
をタップすると画面収録画面が表示され、zoom
を選択しブロードキャストを開始する
をタップするとiOS画面を共有できる(iOS12〜)- iOS11の場合、
共有
から画面
をタップすると、コントロールセンターからのセットアップ方法の画面が表示される
https://support.zoom.us/hc/ja/articles/115005890803-iOS-Screen-Sharing
- iOS11の場合、
-
ミーティング中以外にコントロールセンターからブロードキャストを開始するとエラーとなる
-
画面の共有中に、他の端末でブロードキャストを開始されると、共有中の端末はエラーとなり終了する(後勝ちで動作)
その他
- Skype, Teams, LINE, LINE LIVE も対応してそうだが、動作は未確認。
今後、調べたいこと
-
アプリ本体側で iOS System Broadcast の開始と終了の通知を受け取りたい
-
Broadcast Upload Extension からアプリ本体側へ録画データを渡したい
- App Groups(UserDefaults)経由で渡せばよい?
- https://github.com/webex/spark-ios-sdk/wiki/Implementation-broadcast-upload-extension