iOS) KakaoQRcode 클론코딩 - 화면캡처 block
내용
- 카카오톡 QR코드 위젯을 통해서 접근하거나 카카오톡에서 쉐이크 모션을 통해 접근할 수 있는 QR코드 뷰의 화면캡처와 기록, 미러링, AirPlay 를 막고있었다. 구현해보자.
먼저 카카오톡 QR코드 뷰가 어떻게 작동하는지 살펴보자.
QR코드 뷰 화면캡처를 시도하자 빈화면이 캡쳐되었다.
그리고 경고메시지가 등장했다. 이것은 화면캡처가 되서 첨부해본다. 물론 기기에서는 경고 메시지 뒤에 QR 코드 뷰가 있다.
목표
- 화면캡쳐 시 alert 창 등장
- 화면캡쳐 결과에 관여해서 빈 화면이 캡쳐되도록하기
시작 전
📸 원리
📌 UIApplication.userDidTakeScreenshotNotification
screenshot 할 때 notification 이 post.
Discussion
notification 에 userInfo dictionary 가 없다. (즉, notification 를 받는 추가 object 가 없다는 뜻.)
notificaation 이 screenshot 을 찍은 후에 post 된다.
📌 UIScreen.capturedDidChangeNotification
캡처된 screen 상태가 변경될 때 sent 되는 notification.
Discussion
화면의 내용을 기록, 미러링, AirPlay 를 통해 전송하거나 다른 곳으로 복제할 수 있다. UIKit 은 이러한 화면 캡쳐 상태가 변경될 때 이 알림을 보낸다.
notification 의 object 는 isCaptured 프로퍼티가(YES 값은 상태가 변경됨을 의미) 변경된 UIScreen object 이다. userInfo dictionary 가 없다.
🤨 흠..
screenshot 과 관련된 프로퍼티를 알아보았다. 찾아보니 아이폰자체에서 스크린샷을 막을 수 없었다. 그리고 이름에서부터 알겠지만 이미 캡쳐가 시작되고 끝날 때 notification 을 보내고 있다.
위의 프로퍼티를 사용해서 screenshot 시 동작을 처리해보자.
시작하기
📸 화면캡쳐 시 alert 창 등장
- MainViewController.swift
class QRCodeViewController: UIViewController {
// ...
// MARK: - View Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
// ...
setNotification()
}
}
extension QRCodeViewController {
// ...
private func setNotification() {
// ✅ UIApplication.userDidTakeScreenshotNotification : 유저가 스크린샷을 찍을 때 notification 이 post 한다.
NotificationCenter.default.addObserver(self, selector: #selector(blockScreenShot), name: UIApplication.userDidTakeScreenshotNotification, object: nil)
// ✅ UIScreen.capturedDidChangeNotification
NotificationCenter.default.addObserver(self, selector: #selector(blockScreenShot), name: UIScreen.capturedDidChangeNotification, object: nil)
}
@objc
func blockScreenShot() {
// ✅ alert 창 생성
let alert = UIAlertController(title: "캡쳐는 안돼요!", message: "보안 정책에 따라 스크린샷을 캡쳐할 수 없습니다.", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "확인", style: .default, handler: nil))
self.present(alert, animated: true, completion: nil)
}
}
- 화면캡처를 시도하거나 레코딩하려는 시도를 하면 alert 창이 뜨도록 하였다.
📸 화면캡쳐 결과에 관여해서 빈 화면이 캡쳐되도록하기
흠.. 좀 더 찾아봐야할 것 같다.
출처 :
깃허브
GitHub - 28th-SOPT-iOS-CloneCoding/MiraClone-KimHyunGyu: 🧚 아요 미라클론코딩 김현규