概要
おはこんばんにちは!和尚です
iPhone15.1からSharePlayが使えるようになりましたね〜
FaceTimeを全く使うことがないので個人的には関わりが今後もなさそうな機能ではありますが、対応しなければならなそうなアプリがいくつかあって制御方法を調べたので記事にしました
読者想定
- SharePlayで画面共有した時にViewを制御したい人
- SharePlayって何?って人
SharePlayとは
簡単に言うとFaceTimeを使ってテレビ電話している人に画面共有ができる機能です。自分の端末の画面がそのまま相手の画面に共有されるためSharePlayはアプリで特別な実装をする必要はなく、この機能を使うだけでアプリを相手に見せながらテレビ電話で会話することが可能です。
また画面をそのまま相手に共有するだけではなく、音楽や動画は再生・停止・シークなどを相手と同期させることが可能になります。
※DRM動画などの制御されたコンテンツはアプリ側でSharePlayの対応をさせないと相手と共有することは出来ません。
公式サイト:https://developer.apple.com/jp/shareplay/
制御方法
自分の画面がそのまま相手に共有されるSharePlayですが、画面共有時に特定のViewを非表示にしたい場合があると思います。その時の制御方法を見ていきましょう。
制御プロパティ
UIScreenに画面共有中かどうかを示す真偽値があるので、こちらを使って制御していきます。
UIScreen.main.isCaptured
この値はSharePlayの画面共有中だけではなく、ミラーリングやAirPlayでのストリーミング中でも値がTRUEになるので、これらを制御したい場合も同じ値を使って制御することが可能です。
Viewの制御方法
簡単に画面を制御するサンプルコードをSwiftUI書いたので、実装の参考にしてみてください。
※iOS14以上をターゲットとした書き方をしています。iOS13以降をターゲットにしたいかたは@StateObject
の部分を@ObservedObject
に変更してください。
View
import SwiftUI
struct ContentView: View {
@StateObject private var viewModel = ContentViewModel()
var body: some View {
Group {
if viewModel.isChaptured {
Text("シェアプレイ中")
} else {
Text("シェアプレイ中ではありません")
}
}
.onAppear(perform: viewModel.onAppear)
.onDisappear(perform: viewModel.onDisappear)
}
}
ViewModel
import Combine
import UIKit
final class ContentViewModel: ObservableObject {
// TRUE = 画面共有中、 FALSE = 画面共有中ではない
@Published var isChaptured: Bool = false
private var cancellable: AnyCancellable?
// 画面表示時の処理:呼び出したメソッドのコメント参照
func onAppear() {
updateIsCaptured()
subscribeIsCaptured()
}
// 画面非表示時の処理:監視をキャンセルします
func onDisappear() {
cancellable?.cancel()
}
// 画面共有中の状態を更新します
private func updateIsCaptured() {
isChaptured = UIScreen.main.isCaptured
}
// 「UIScreen.capturedDidChangeNotification」は画面共有された時と、
// 共有が停止された時に送信される通知なので、監視します。
private func subscribeIsCaptured() {
cancellable = NotificationCenter.default
.publisher(for: UIScreen.capturedDidChangeNotification)
.sink { [weak self] _ in
self?.updateIsCaptured()
}
}
}
終わりに
いかがでしたでしょうか。
やってること自体はかなりシンプルなので、もしSharePlayで画面共有した時にこの画面は見せたくないといった仕様があった場合は参考にしてみてください!