【Swift4】リリース時にログを出力しない様にする
環境
Swift 4.1
Xcode 9.3.1
下記のコードをどこか適当な.swiftファイルに書いておけば良い。
import Foundation #if !DEBUG func print(_ items: Any..., separator: String = " ", terminator: String = "\n") { // なにもしない } #endif
Edit Schemeから「Build Configuration」を"Debug"から"Release"に変更して実行してみるとログが出力されない事を確認できる。
【Swift4】iOSでスクリーンショットは阻止できない
環境
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]にはNSNotificationのName構造体に定義されている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 } }