タグ:iPhone

環境


Swift 4.0.2
iOS 11.1.2
Xcode 9.1




アプリ側でスクリーンショットは阻止できない


残念ながら、現状ではアプリ側でスクリーンショットを阻止する事はできない様です。
Androidだと出来る様ですが、iOSの場合スクリーンショットを撮った後の通知しか取得できない為、スクリーンショットの直前に画面を黒くする等の実装もできません。
何故なんだろう...


スクリーンショット撮影後の通知は受け取れる


下記の様にすればスクリーンショットが撮影された直後の通知が受け取れます。
正直使い道が分かりませんが...。
スクリーンショットを元に画像を加工したい時とかに使うんですかね。
 
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Observerとして登録
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(self.didScreenshot),
                                               name: .UIApplicationUserDidTakeScreenshot,
                                               object: nil)
    }
    
    @objc func didScreenshot()
    {
        //スクリーンショットが取られた後に行いたい処理
    }

Observerとして登録する際の引数[name]にはNSNotificationName構造体に定義されているUIApplicationUserDidTakeScreenshotを指定しています。
Didとある様にスクリーンショットが取られた後の通知になります。
残念な事にUIApplicationUserWillTakeScreenshotなんてものはありません。

 
DRMで保護されたコンテンツはスクリーンショットを防げる



Hulu等の有料ストリーミング動画などを再生中にスクリーンショットで撮影しようとすると動画部分が真っ黒になります。
私はこれを見て、「なんだスクリーンショット防げるんじゃん!」と思って期待したのですが、これはDRMで保護されたストリーミング動画をOS側で上手い事処理しているだけでアプリ側で何かしらの対処をしている訳ではない様です。


動画キャプチャは防げる  

iOS11から動画キャプチャの機能が実装されました。
設定>コントロールセンター>コントロールをカスタマイズの中に「画面収録」というのがあるのでそれをコントロールセンターに追加すると、コントロールセンターから動画キャプチャを行える様になります。

アプリ側では「現在録画されているのか」という情報と「録画状態の切り替わり」の検知が行えます。
なので、「録画中は画面を黒くする」といった対応が可能です。
スクリーンショットと違い、しっかり録画前に画面更新等が行える様になっています。

下記のコードでは動画キャプチャ中だけ画面が赤くなる様にしています。
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if #available(iOS 11.0, *)
        {
            if UIScreen.main.isCaptured{//録画中なら画面を赤くする
                self.view.backgroundColor = UIColor.red
            }
            //Observerに登録
            NotificationCenter.default.addObserver(self,
                                                   selector: #selector(self.captureStatusDidChange),
                                                   name: .UIScreenCapturedDidChange,
                                                   object: nil)
        }
    }
    
    @objc func captureStatusDidChange()
    {
        if UIScreen.main.isCaptured{//録画中なら画面を赤くする
            self.view.backgroundColor = UIColor.red
        }
        else{
            self.view.backgroundColor = UIColor.white
        }
    }

環境


Swift 4.0.2
iOS 11.1.2
Xcode 9.1



スプラッシュ画面の設定

TARGETS>GeneralタブのStatus Bar StyleをLightにする
 13


画面ごとに設定する

文字色を白色にしたいViewControllerで以下のコードを追加  
override var preferredStatusBarStyle: UIStatusBarStyle {
        // ステータスバーの文字色を白で指定
        return UIStatusBarStyle.lightContent
    }
なお、Info.plistに「View controller-based status bar appearance」追加して値をNOとしている場合、上記のコードを追加しても文字色が変わりませんので、この方法を使う場合「View controller-based status bar appearance」は削除する必要があります。

ちなみに横画面にした時もステータスバーを表示したい場合には下記のコードも追加してください。  
override var prefersStatusBarHidden: Bool { return false }

Info.plistで一括設定

全画面でまとめて設定したい場合に便利です。
ただしこの方法の場合、横画面にした時にステータスバーを表示させる事ができない様です。

まずスプラッシュ画面のステータスバーの色を変更した時と同様に、TARGETS>GeneralタブのStatus Bar StyleをLightにします。
次にInfo.plistに「View controller-based status bar appearance」追加して値をNOで設定します。
49



 

環境


Swift 4.0.2
iOS 11.1.2
Xcode 9.1



ステータスバーはデフォルトだと横画面では表示されない様です。

横画面でも表示させたい場合は、ステータスバーを表示したいViewControllerで下記の様にオーバーライドすればOK
override var prefersStatusBarHidden: Bool { return false }

↑このページのトップヘ