ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • flutter 스크린샷 방지 정리
    flutter 2023. 2. 14. 09:38
    반응형

    안녕하세요 이나주니 입니다.
    오늘은 Flutter 에서 보안의 문제로 화면 캡쳐를 막는 기능에 대해서 살펴볼텐데요.

     

    개발 목적

    회사의 기밀 및 보안 관련문서가 외부로 유출됨을 막기 위함

    중소벤처기업부의 발표에 따르면 정보 유출의 주요 수단 가운데 스마트폰 카메라 등 사진자료를 통한 정보 유출이 계속되어 증가하는 추세라고 발표함. 공공기관을 많이 상대하는 저희 입장에서는 필요로 하는 기능


    아시다시피 pub.dev 에 들어가면 많은 라이브 러리를 사용할수 있는게 사실입니다.

    저도 화면 캡쳐 방지 목적을 위해 라이브러리를 찾던중 여러 라이브러리를 찾았는데요.

    소개에 앞서 말하고 싶은 부분은 ios만 개발할것인지 android만 개발할것인지에 따라 다른것같아요.

    작성자의 경우 ios,android 같이 개발을 해야하기 때문에

    screen_protector: ^1.2.0 버전의 라이브러리를 사용했어요.
    1.1.5 버전은 화면 녹화를 컨트롤할수가 없음
    1.2.0 부터 가능**

     

    ※ 헷갈릴수 있어요**
    - flutter_windowmanager 0.2.0
    - secure_application 3.8.0
    - screen_capture_event 1.1.1

     

    위 세가지를 찾아보고 사용해보았는데 결과적으로 안드로이드에서만 사용가능 하거나 또는 화면 녹화에 대해 컨트롤 할수 없음

    (제가 ios에서 사용하는 방법을 못찾은걸수도..)

    위 세가지는
    pub.dev 에 접속해 사용하는 방법에 대해 보시면 쉽게 따라하실수 있을거라 생각되어 자세한 내용은 뺄게요.

    그럼 작성자는 어떻게 했느냐
    screen_protector 1.2.0 로 진행을 하였는데요

    사용하는 방법은 아시는것과 같아

    pubspec.yml 파일에

    사진과 같이 버전을 입력해줍니다.

    ios의 경우 3가지중에 선택

    작성자의 경우 위의 경우 처럼 특정 메소드를 호출해 기능을 키고 끄도록 해봤는데요, 이렇게 까지 작성하시면 안드로이드에서는 기능이 동작 하게 됩니다.

     

    결과

     

    Android

    ※ os에서 device 언어를 가져화 해당언어로 화면 하단에 자동으로 "보안상의 문제로 캡쳐가 되지않는다"라는 이런맥락의 팝업이 깔끔하게 뜬다.

     

    Ios

    AppDelegate.swift 수정필요

    iOS 공식적으로 캡처 방지 API 를 제공하지 않음

    swift의 UITextField 개체를 이용한 방법인데 isSecureTextEntry를 활성화 하면 ios에서 보안으로 캡처, 녹화를 막는다고 함

    Apple Developer Documentation < = 참고 사이트

    isSecureTextEntry

    A Boolean value that indicates whether a text object disables copying, and in some cases, prevents recording/broadcasting and also hides the text.

     

    import UIKit
    import Flutter
    
    @UIApplicationMain
    @objc class AppDelegate: FlutterAppDelegate {
      /*
      ios 자체적 캡쳐 방지 기능 지원X
      스크린샷 방지 목적 UITextField 추가 (화면 캡쳐를 막기 위해 대부분 ios 개발자들 해당 fild 사용)
      */
      private var textField = UITextField()
    
      override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
      ) -> Bool {
          screenCaptureBlock()
          GeneratedPluginRegistrant.register(with: self)
          if #available(iOS 10.0, *) {
              UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
          }
          return super.application(application, didFinishLaunchingWithOptions: launchOptions)
      }
    
     private func screenCaptureBlock() {
            if (!self.window.subviews.contains(textField)) {
                self.window.addSubview(textField) // addSubview 메소드 이용 textField 추가
                textField.centerYAnchor.constraint(equalTo: self.window.centerYAnchor).isActive = true // Y축 중앙에 배치
                textField.centerXAnchor.constraint(equalTo: self.window.centerXAnchor).isActive = true // X축 중앙에 배치
                self.window.layer.superlayer?.addSublayer(textField.layer)
                textField.layer.sublayers?.first?.addSublayer(self.window.layer)
            }
        }
    }

    이렇게 수정해줍니다.

    반응형

    'flutter' 카테고리의 다른 글

    Dart 개인정리  (0) 2023.04.11
    flutter Version 3.7대 오류  (0) 2023.03.14
    flutter 3.7 버전 오류  (0) 2023.03.06
    현지화(Localization)  (0) 2023.02.14
    오준석의 플러터 생존코딩 2.0 정리  (0) 2023.02.14

    댓글

Designed by Tistory.