WKWebView 캡쳐 방지

Zion·2024년 1월 16일
0

웹뷰의 콘텐츠를 캡쳐 방지 해야한다..!

크기가 큰 이미지를 나열해서 보여줘야해서 webView를 사용하기로 했다.
(url에서 이미지를 다운로드할 경우 속도가 느렸기 때문이다.)

이미지들은 webView를 사용해서 load한다.(나중에 적어놓겠다.)

그리고...
보여지는 이미지들은 캡쳐가 되면 안된다!

아 캐쉽지 UITextFieldisSecuretextEntry를 사용하면 된다고 익히 들었다.

webView의 contentOffset 을 사용해야하기 때문에 webView는 viewController의 view가 되어야한다.

import WKWebView
//..
var webView = WKWebView()
func viewDidLoad() {
	super.viewDidload()
    /* set webView ... */
	view = webView
}

view.addSubView(webView) 를 할경우엔, webView.scrollView를 가져오지 못했다.

makeSecure()

캡쳐 방지를 위해 사용하는 방법이다.

extension UIView {

    func makeSecure() {
        let field = UITextField()
        let view = UIView(frame: CGRect(x: 0, y: 0, width: field.frame.self.width, height: field.frame.self.height))
        field.isSecureTextEntry = true
        field.isEnabled = false
        field.isSelected = false
        self.addSubview(field)
        self.layer.superlayer?.addSublayer(field.layer)
        field.layer.sublayers?.last!.addSublayer(self.layer)
        field.leftView = view
        field.leftViewMode = .always
    }
}

코드를 봤을때 이해가 안가서 그림을 그려봤다
분홍 : textField
검정 : 캡쳐방지할 view(HideView)

textField의 layer~View 사이에 hideView를 넣는 원리인거같다.

첫번째 시도(결과는 실패)

webView를
webView.makeSecure() 했더니 캡쳐 방지가 안된다^^!

두번째 시도(결과는 실패)

사용할 Viewer(이미지가 보여질) 의 ViewController의 view를 위와 같이 대체하고, view.makeSecure()를 셋팅.

layer 사이클 오류가 발생했다...!

아무래도 viewController의 view의 superLayer

 self.layer.superlayer?.addSublayer(field.layer)
 field.layer.sublayers?.last!.addSublayer(self.layer)

해당 두줄떄문에 나는 오류인것같은데..
viewController view의 superLayer는 자기 자신인가?..

세번째 시도(실패는 아니고 동작이 이상함)

webView를 따로 ViewController로 분리한 후,
사용할 ReaderView에서 ChildViewController로 사용.
해당 webView(Controller)를 바로 viewController view에 add Child해줬다.
그러고 나서
webViewController.view.makeSecure()를 했다.

navigation stack 간 이동을 하는데, 터치가 안되는것이다..!
secure된 Layer가 사라지지 않고 남아있는것이다..!

네번째 시도

ReaderViewController 구조
[ bottom - - - - - - > top ]

viewController view에 contentView라는 뷰를 임의로 추가 해 준 후 여기다가
contentView.makeSecure() 했다!
성공이다.

추가로..

will Dissapear 할때 child를 remove 했다.

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        self.children.forEach { child in
            child.willMove(toParent: nil)
            child.view.removeFromSuperview()
            child.removeFromParent()
        }
    }

🧞‍♂️ 피드백댓글 환영

profile
어제보다만 나아지는

0개의 댓글