SwiftUIでスクリーンショットの撮影時にアラートを表示する

2023.12.18

ユーザーは体重管理アプリの体重グラフや筋トレアプリのワークアウトリスト、ゲーム内のキャラクターステータスなど、様々な場面でスクリーンショットを撮影して友人やSNSに共有する。アプリ開発者としては、これらの情報はスクリーンショットではなく、リッチなシェア機能(装飾豊かな画像の共有機能など)を使って欲しいシーンが少なからずある。

この記事では、SwiftUIを使用したiOSアプリでスクリーンショット撮影を検知し、ユーザーにアラートを表示する方法について解説する。スクリーンショット撮影通知をトリガーにして、ユーザーに特定のメッセージを伝えることができる。

スクリーンショットの撮影時にアラートを表示する

前述の通り、スクリーンショット撮影時に、SNS共有を促進するためのダイアログを表示させたり、ガイドラインを提供したりするのは有効な手法である。たとえばキャンペーン実施中に「この画面をSNSで共有して特典をゲットしよう!」という告知ダイアログを表示させることもできるだろう。

また、著作権やプライバシーに関する注意喚起にも利用できる。ある漫画アプリでは3回までスクリーンショット撮影に対し警告を表示し、4回目にアカウントをロックする措置を取っているというのがSNSで話題になっていた。

iOSではスクリーンショット撮影後に UIApplication.userDidTakeScreenshotNotification 通知を発行する。これを利用することで、アプリは撮影に応じたアクションを起こせる。ただし、この通知は撮影後に受け取るため、撮影の抑止の目的では利用できない。

struct ContentView: View {
    @State private var isPresented = false
    
    var body: some View {
        Text("Hello, world!")
            .alert(isPresented: $isPresented) {
                Alert(
                    title: Text("スクリーンショットが撮影されました"),
                    message: Text("この画面をSNSで共有しましょう!"),
                    dismissButton: .default(Text("OK"))
                )
            }
        .onReceive(NotificationCenter.default.publisher(for: UIApplication.userDidTakeScreenshotNotification)) { _ in
            isPresented = true
        }
    }
}

上記のコードを実際に実行し、スクリーンショット撮影をおこない、それを検知してアラートを表示させた。

まとめ

スクリーンショットの撮影を検知して、リッチなシェア機能へ誘導することは、アプリの機能を効果的に伝える強力なツールとなる。一方で、アラートを頻発させるとユーザー体験を損なってしまうため、実務で使うには使いどころが難しいかもしれない。配慮を忘れないようにしたい。

関連情報