ObjecTips

Swift & Objective-C で iOS とか macOS とか

スクリーンショットを検出する

iPhone のホームボタンとロックボタン同時押しでのスクリーンショットを検出する UIApplicationUserDidTakeScreenshotNotificationiOS 7 で追加されている。
これを使えばスクリーンショットを検出できる。

[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationUserDidTakeScreenshotNotification
                                                  object:nil
                                                   queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
                                                       // user did take screenshot
                                                   }];

この通知はスクリーンショットの撮影後に送られてくるので、これをトリガーにして画面の表示内容を変えたり隠したりしても意味が無い。
また通知の object プロパティは UIApplicationインスタンスuserInfo プロパティは空になっているため、撮影されたスクリーンショットに関する情報は取得できない。
さらに、この通知のタイミングで AssetsLibrary を用いてユーザのカメラロールを取得してもまだスクリーンショットはカメラロールに追加されていない。

もしアプリのスクリーンショットを撮らせないように実装する必要がある場合、この通知をトリガーにしてアプリの動作を止めるといった手法が考えられる。