こんなのあるんだというのを最近知ったので、小ネタとして残します。
- 2016/10/19 追記:Swift3でのコードを追加しました。
- 2017/10/01 追記:Swift4の記述を追加しました。
ユーザーがスクリーンショットを撮ったことを検知する
Swift3, Swift4
Swift3, Swift4 では、NSNotification
のName
構造体にstaticなプロパティとして以下が定義されています。
static let UIApplicationUserDidTakeScreenshot: NSNotification.Name
こちらをnotificationNameとしてNotificationCenterのobserverを仕込むことで、
「ホームボタン+電源ボタンの同時押し」によるスクリーンショットを撮ったことを検知することができます。
import UIKit
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Observerとして登録
NotificationCenter.default.addObserver(self, selector: #selector(MyViewController.userDidTakeScreenshot(_:)), name: .UIApplicationUserDidTakeScreenshot, object: nil)
}
deinit {
NotificationCenter.default.removeObserver(self)
}
// UIApplicationUserDidTakeScreenshot の通知を受けて実行される
func userDidTakeScreenshot(notification: Notification) {
// 何かする
}
}
リファレンスにも書いていますが、通知を受けた際のNotificationのuserInfoには特に何も設定されていないので、上記の例でuserDidTakeScreenshot
メソッド内でnotification.userInfo
としてもnilが返ってきます。
Swift2
let UIApplicationUserDidTakeScreenshotNotification: String
Swift2では上記のようなString型の定数が定義されています。
例
import UIKit
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Observerとして登録
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(MyViewController.userDidTakeScreenshot(_:)), name: UIApplicationUserDidTakeScreenshotNotification, object: nil)
}
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
// UIApplicationUserDidTakeScreenshotNotification の通知を受けて実行される
func userDidTakeScreenshot(notification: NSNotification) {
// 何かする
}
}
応用
この通知を利用して、
スクリーンショットを撮った後にアラートを出したり、ユーザーが撮ったスクリーンショットを取得して、加工したものを新たに保存させるといったことができそうです。
参考:
http://www.toyship.org/archives/1633
また、アプリの内容によってはユーザーがどのくらいスクリーンショットを撮っているかというログを取るのもいいかもしれません。
注意点
- 通知を受けるのはあくまでスクリーンショットを撮った "後"
- 通知にuserInfoが付与されていないので、「スクリーンショットを撮った」ということ以外に情報はない
- 通知を受けた直後にはスクリーンショットの画像はまだカメラロールに保存されていない
- →保存された画像を得るには処理を遅延させるなどの工夫が必要そう
- iOS 7.0 以降で使用可
終わり
以上、使いどころは限られますが、そもそもスクショの検出はできないと思っていたので参考程度に書きました。
知らないことがまだまだたくさんあって面白いですね