LoginSignup
2
2

More than 1 year has passed since last update.

SharePlayの画面共有時にViewを制御する

Last updated at Posted at 2021-11-06

概要

おはこんばんにちは!和尚です:sunny:

iPhone15.1からSharePlayが使えるようになりましたね〜:iphone:
FaceTimeを全く使うことがないので個人的には関わりが今後もなさそうな機能ではありますが、対応しなければならなそうなアプリがいくつかあって制御方法を調べたので記事にしました:v:

読者想定  

  • 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

ContentView.swift
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

ContentViewModel.swift

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で画面共有した時にこの画面は見せたくないといった仕様があった場合は参考にしてみてください!

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2