CLIEN

본문 바로가기 메뉴 바로가기 보기설정 테마설정
톺아보기 공감글
커뮤니티 커뮤니티전체 C 모두의광장 F 모두의공원 I 사진게시판 Q 아무거나질문 D 정보와자료 N 새로운소식 T 유용한사이트 P 자료실 E 강좌/사용기 L 팁과강좌 U 사용기 · 체험단사용기 W 사고팔고 J 알뜰구매 S 회원중고장터 B 직접홍보 · 보험상담실 H 클리앙홈
소모임 소모임전체 ·굴러간당 ·아이포니앙 ·주식한당 ·MaClien ·일본산당 ·방탄소년당 ·개발한당 ·자전거당 ·AI당 ·이륜차당 ·안드로메당 ·콘솔한당 ·소시당 ·키보드당 ·PC튜닝한당 ·테니스친당 ·갖고다닌당 ·육아당 ·소셜게임한당 ·노젓는당 ·골프당 ·걸그룹당 ·퐁당퐁당 ·위스키당 ·나스당 ·바다건너당 ·클다방 ·IoT당 ·여행을떠난당 ·디아블로당 ·어학당 ·라즈베리파이당 ·달린당 ·3D메이킹 ·X세대당 ·ADHD당 ·AI그림당 ·날아간당 ·사과시계당 ·배드민턴당 ·야구당 ·농구당 ·블랙베리당 ·곰돌이당 ·비어있당 ·FM당구당 ·블록체인당 ·보드게임당 ·활자중독당 ·볼링친당 ·캠핑간당 ·냐옹이당 ·문명하셨당 ·클래시앙 ·요리한당 ·쿠키런당 ·대구당 ·DANGER당 ·뚝딱뚝당 ·개판이당 ·동숲한당 ·날아올랑 ·전기자전거당 ·e북본당 ·이브한당 ·패셔니앙 ·물고기당 ·도시어부당 ·FM한당 ·맛있겠당 ·포뮬러당 ·젬워한당 ·안경쓴당 ·차턴당 ·총쏜당 ·땀흘린당 ·하스스톤한당 ·히어로즈한당 ·인스타한당 ·KARA당 ·꼬들한당 ·덕질한당 ·가죽당 ·레고당 ·리눅서당 ·LOLien ·Mabinogien ·임시소모임 ·미드당 ·밀리터리당 ·땅판당 ·헌팅한당 ·오른당 ·영화본당 ·MTG한당 ·소리당 ·노키앙 ·적는당 ·방송한당 ·찰칵찍당 ·그림그린당 ·소풍간당 ·심는당 ·패스오브엑자일당 ·품앱이당 ·리듬탄당 ·Sea마당 ·SimSim하당 ·심야식당 ·윈태블릿당 ·미끄러진당 ·축구당 ·나혼자산당 ·스타한당 ·스팀한당 ·파도탄당 ·테스트당 ·빨콩이당 ·공대시계당 ·터치패드당 ·트윗당 ·가상화폐당 ·창업한당 ·VR당 ·시계찬당 ·WebOs당 ·와인마신당 ·WOW당 ·윈폰이당
임시소모임
고객지원
  • 게시물 삭제 요청
  • 불법촬영물등 신고
  • 쪽지 신고
  • 닉네임 신고
  • 제보 및 기타 제안
© CLIEN.NET
공지[점검] 잠시후 서비스 점검을 위해 약 30분간 접속이 차단됩니다. (금일 18:15 ~ 18:45)

개발한당

강좌와팁 iOS앱 화면 캡쳐/녹화 막기 10

9
2023-06-20 21:14:36 수정일 : 2023-06-20 21:19:18 14.♡.127.239
리안

안녕하세요. 리안입니다.


제가 만든 앱 중에 얼굴을 이모지로 가리거나 블러/모자이크 처리해주는 앱이 있습니다.

(https://apps.apple.com/app/id1624326541)


이 앱이 얼굴을 가리고 나서 이걸 이미지로 저장하려면 광고를 봐야 저장이 되는 수익 구조를 가지고 있습니다.

(광고 제거 상품 구입을 유도하기 위한 쉐어웨어 같은 개념으로 만든...)


프리뷰 상태에서 얼굴을 가리고... 이걸 캡쳐해서 쓸 수도 있겠다고 생각해서 

통계를 달아놨는데... 역시나 생각보다 적지 않은 비율로 캡쳐를 하고 있더라구요. 

그래서 이번 기회에 화면 캡쳐를 막기 위한 삽질들을 좀 해봤습니다.




1. 화면 녹화 / 화면 캡쳐

- 화면 녹화는 UIScreen.main.isCaptured 으로 현재 녹화 중인지 확인이 가능하고,

 녹화 시작 / 종료 시점은 NotificationCenter 의 UIScreen.capturedDidChangeNotification 메시지를 통해 확인이 가능합니다.


- 화면 캡쳐는 캡쳐 시작 시점은 알 수 없고, 

 NotificationCenter 의 UIApplication.userDidTakeScreenshotNotification 메시지로 캡쳐가 이뤄진 이후에 체크가 가능합니다.

 이걸 이용해 사용자들이 캡쳐를 하고 있던건 로그를 남겨서 확인하고 있었습니다.


 즉, 화면 캡쳐의 경우에 user 'Will' TakeScreenshotNotification 을 보내주지 않기 때문에 막을 수가 없었습니다.

 애플이 다 뜻이 있었겠지만 왜 will 은 제공안하고 did만 제공하는지는 잘 모르겠네요 -_-);



2. 검색...

검색을 해보니 UITextField 의 isSecureTextEntry 필드를 활용한 꼼수가 있더라구요.

(https://developer.apple.com/documentation/uikit/uitextinputtraits/1624427-issecuretextentry)


원래 UITextField의 isSecureTextEntry 속성은...

민감한 개인정보 - 주민등록번호나 전화 번호 같은걸 입력한 상태에서 화면 캡쳐를 할 경우 이 필드는 캡쳐가 되지 않게

시스템적으로 보안 처리하기 위해 만들어진 필드였습니다. (iOS 2.0 부터 있었던것도 놀랍네요;)



암튼... 이걸 활용하면 캡쳐를 막을 수 있더라구요.



3. 원리

UITextField 에 isSecureTextEntry 를 true로 해놓으면 캡쳐가 안되니까...

UITextField 의 하위 layer 에 내가 원하던 컨텐츠 레이어랑 스왑을 하면 됩니다.


내가 보여줄 뷰가 A 라는 뷰라면... A 라는 뷰는 어떤 뷰컨트롤러에 붙어있겠죠?

A라는 뷰를 뷰컨트롤러에서 떼내고, UITextField 를 A 가 붙어있던 뷰컨트롤러에 붙인다음, 

UITextField 하위 레이어에 A 를 다시 붙이면 끝. 


사용자가 캡쳐를 하면 UITextField 가 캡쳐가 안되니까... A도 같이 감춰지는 형태입니다. ㅎㅎ;

추가적으로 사용자가 캡쳐했을 때 경고 같은걸 해준다고 하면 1. 에서 찾아낸 캡쳐/녹화 타이밍에 얼럿 같은걸 띄워주면 되죠.


생각보다 간단했습니다.



4. 구현...

이런 저런 삽질로 Swiftui 에 간단히 구현했네요. (굳이 소스를 남길 필요는 없을거 같... 이유는 아래에)

암튼 다 구현하고 나서 github 검색해봤더니.


짜잔.


https://github.com/igooor-bb/GreedyKit

https://github.com/yoxisem544/ScreenshotPreventing-iOS


누군가 이미 잘 구현해놓은게 있네요.

이걸 왜 이제 봤지 싶었는데 제가 앱 처음 개발할 때가 작년인데, 그 사이에 배포 된 라이브러리더라구요. -_-);

누군가 이 트릭을 찾은게 생각보다 오래되진 않았던거 같기도 하네요.


ㅠ 


iOS 에서 캡쳐 / 녹화를 막고 싶다면 도움이 되셨길 바랍니다.

감사합니다.



끝.!



출처 : 나
리안 님의 게시글 댓글
SIGNATURE
https://likoapps.com
제주 이주 이후 아이폰/아이패드/애플워치 앱 개발하며 먹고 살고 있습니다 :)

https://www.google.com/maps/d/edit?mid=1jNnRriARjliv1Aoj5Z3hYYJrsgAZahtX&usp=sharing
직접 다녀온 제주도 오름 정리 맵
서명 더 보기 서명 가리기
  • 주소복사
  • Facebook
  • X(Twitter)
댓글 • [10]
DearMai
IP 220.♡.66.248
06-20 2023-06-20 21:55:11 / 수정일: 2023-06-20 21:56:09
·
모바일 신분증 앱이 이 방법으로 캡쳐 막은거 같더라구요.
수정) 다시 보니 캡쳐를 막은게 아니라 캡쳐시 신분증 정보들이 나오지 않게 처리 했던 거였네요?!
리안
IP 14.♡.127.239
06-20 2023-06-20 22:09:45
·
DearMai님// 네 막는다기보다 캡쳐가 안되게 하는거긴 하죠 ㅎ 막는건 불가해서 (안드는 가능하던데…) 정확히는 특정뷰가 캡쳐 안되게 하는 방법이 맞습니다.
/Vollago
자믄자믄
IP 61.♡.97.197
06-21 2023-06-21 05:54:04
·
"will" 이 없는건 스크린캡쳐 기능을 방해하지 못하도록 의도적으로 제외된 기능일겁니다.
따라서 작성자분의 사례 정도는 괜찮을 것 같긴 한데,, 위 방법도 과하게 사용할 경우 심사 리젝 가능성이 있지 않을까 생각이 드네요
여튼 재밌는 글 잘 봤습니다ㅎㅎㅎ
리안
IP 14.♡.127.239
06-21 2023-06-21 10:01:52
·
@자믄자믄님 Privacy api도 아니라서 리젝하기도 애매해서 그냥 'will'을 만들어주지 않을까 싶기도 하네요. 일단은 큰 무리 없이 서비스 하는 앱들이 있는거 봐서 당분간은 괜찮을거 같습니다. watchos 만들 때 secure textfield 를 처리하는걸 보긴 했는데 이걸 이런식으로 쓸거라고는 생각도 못했는데 창의력 대장인 사람들이 많은거 같습니다.
김짱3
IP 121.♡.105.222
06-21 2023-06-21 06:28:51
·
와 완전 좋은팁 감사합니다
리안
IP 14.♡.127.239
06-21 2023-06-21 10:02:02
·
@김짱3님 도움이 되셨다면 저도 감사합니다 :)
규름
IP 58.♡.27.198
06-21 2023-06-21 11:02:36
·
앗 정보 감사합니다. 회사 플젝트에서 캡쳐 방지 기능이 있어서 봤는데 이글 보니 허점이 많았네요.
정보 감사합니다.
리안
IP 14.♡.127.239
06-21 2023-06-21 17:22:41
·
@규름님 기존엔 어떤식으로 하셨는지 궁금하네요. 동영상은 쉽게 막을 수 있었지만 캡쳐는 막을수가 없던데 ㅠ 도움 되셨다니 감사합니다.
까만거북이
IP 124.♡.118.169
06-21 2023-06-21 21:48:28
·
키야… 캡처를 막지 못하는데, 무슨 수로..?! 했다가 현실 감탄이 나왔네요. ㅎㅎㅎ
기억해두었다가 언젠가 써먹겠습니다. 좋은 후기(?) 공유해주셔서 고맙습니다.
리안
IP 14.♡.127.239
06-21 2023-06-21 21:49:56
·
@까만거북이님 저도 이 꼼수에 감탄했습니다. bard나 chat gpt 는 이런걸 생각할 수 있을지...!
최근에 swiftui 만 하던터라 uiview 하위 layer 에 끼워넣는거 보고 감탄했네요. ㅎㅎ
새로운 댓글이 없습니다.
이미지 최대 업로드 용량 15 MB / 업로드 가능 확장자 jpg,gif,png,jpeg,webp
지나치게 큰 이미지의 크기는 조정될 수 있습니다.
목록으로
글쓰기
글쓰기
목록으로 댓글보기 이전글 다음글
아이디  ·  비밀번호 찾기 회원가입
이용규칙 운영알림판 운영소통 재검토요청 도움말 버그신고
개인정보처리방침 이용약관 책임의 한계와 법적고지 청소년 보호정책
©   •  CLIEN.NET
보안 강화를 위한 이메일 인증
안전한 서비스 이용을 위해 이메일 인증을 완료해 주세요. 현재 회원님은 이메일 인증이 완료되지 않은 상태입니다.
최근 급증하는 해킹 및 도용 시도로부터 계정을 보호하기 위해 인증 절차가 강화되었습니다.

  • 이메일 미인증 시 글쓰기, 댓글 작성 등 게시판 활동이 제한됩니다.
  • 이후 새로운 기기에서 로그인할 때마다 반드시 이메일 인증을 거쳐야 합니다.
  • 2단계 인증 사용 회원도 최초 1회는 반드시 인증하여야 합니다.
  • 개인정보에서도 이메일 인증을 할 수 있습니다.
지금 이메일 인증하기
등록된 이메일 주소를 확인하고 인증번호를 입력하여
인증을 완료해 주세요.