가끔 넷플릭스나 웨이브같은 OTT들을 보다가 너무 마음에 드는 장면이 나올 때 캡처를 하거나 화면녹화를 하게 되면 영상이 보이지 않고 검은 화면이 나오는데 왜 이런 것일까?
(실제로 이러진 않음.! 순전히 예를 든 것이다 ..)
이외에도 네이버 웹툰이라던지 저작권/보안정책 때문에 화면 녹화/캡처가 되지 않는 앱들이 여러 존재하는데 어떻게 화면 녹화/캡처를 감지하는 것일까?
알아보러 가봅시다.
화면 녹화나 캡처 기능은 OS 자체에서 제공되기 때문에 개발자가 기능자체를 막을 수는 없습니다. 대신에 녹화/캡처를 감지해서 경고창을 띄운다던가 뷰를 안보이게 만드는 것과 같이 대처 할 수 있게 만드는 것이 이 포스트의 목표입니다.
화면 녹화/캡처를 감지하는 방법은 여러 방법이 있습니다.
가장 흔히 사용하는 방법이 아닐까 생각이 드는데
UIApplication.userDidTakeScreenshotNotification
UIScreen.capturedDidChangeNotification
(iOS 11.0+)간단히 말하자면 NotificationCenter에 요 두 개를 등록해서 이벤트가 생길 때 처리를 해주는 방법이다
NotificationCenter
.default
.addObserver(
self,
selector: #selector(didCapturedScreenshot),
name: UIApplication.userDidTakeScreenshotNotification,
object: nil
)
}
NotificationCenter
.default
.addObserver(
self,
selector: #selector(didCapturedRecording),
name: UIScreen.capturedDidChangeNotification,
object: nil
)
}
이 코드에서 화면 녹화/캡처에 대한 이벤트가 전달됐을 때 didCapturedScreenshot나 didCapturedRecording 여기서 각자 원하는 처리를 해주면 된다.
예시)
✚ 더하자면
녹화 상태를 키고 들어오면 NotificationCenter가 감지를 못해서 계속 녹화가 이루어지는데 이 경우에는
if UIScreen.main.isCaptured { //이벤트 처리 }
요 한 줄을 추가하면 해결할 수 있다!
ScreenSheieldKit은 상용 라이브러리로 알려져있고 꽤나 비싸다고 알려져있다
다 제어가 가능하다고 하네요,, 호덜덜
애플의 스트리밍 서비스인 FairPlay에서는 영상 캡처가 방지되어있다고 합니다. 대부분의 OTT 서비스들에서는 FairPlay에서 적용되는 캡처 방지 기술을 사용하고 있을 것 같네요!
아무래도 NotificationCenter로 해결하는 방법이 간단하게 처리할 수 있을 것 같네요.! 스트리밍 서비스를 개발 중이라면 FairPlay에서 제공 중인 거 그대로 써도 괜찮을 것 같습니다 :)
만약 프로덕트가 보안에 아주아주 민감하다면 ScreenShieldKit 사용도 고려해볼 수도 있을 것 같기도 합니다.(회사-by-회사)