Thripthi Haridas
Thripthi Haridas

Reputation: 363

Programmatically disabling screenshot in App

I want to prevent taking screenshot of a page in app. how to do it programmatically so that screenshots cannot be taken.

Found code to detect screenshot. Can it be deleted as soon as a screenshot is taken?

let mainQueue = NSOperationQueue.mainQueue()
NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationUserDidTakeScreenshotNotification,
    object: nil,
    queue: mainQueue) { notification in
        // executes after screenshot
}

Upvotes: 10

Views: 49643

Answers (4)

Akash Neeli
Akash Neeli

Reputation: 407

You cannot prevent user from taking screenshot, however, you can hide the content while a screenshot is taken, Use this code to do so..

   extension UIView {
    func hideContentOnScreenCapture() {
        DispatchQueue.main.async {
            let field = UITextField()
            field.isSecureTextEntry = true
            self.addSubview(field)
            field.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
            field.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
            self.layer.superlayer?.addSublayer(field.layer)
            field.layer.sublayers?.first?.addSublayer(self.layer)
        }
    }
}

Usage:

yourView.hideContentOnScreenCapture()

Upvotes: 1

Pushkar Raj Yadav
Pushkar Raj Yadav

Reputation: 109

There is no way to prevent ScreenShots but you can prevent Screen Recording through this code.

func detectScreenRecording(action: @escaping () -> ()) {
    let mainQueue = OperationQueue.main
    NotificationCenter.default.addObserver(forName: UIScreen.capturedDidChangeNotification, object: nil, queue: mainQueue) { notification in
        // executes after screenshot
        action()
    }
}
        
        
        
//Call in vewWillApper 
detectScreenRecording {
    print(UIScreen.main.isCaptured)
    if UIScreen.main.isCaptured {
        //your vier hide code
        print("self.toHide()")
    } else {
        // self.sceneDeleg(ate?.window?.isHidden = false
        //your view show code
        print("self.toShow()")
    }
}

Upvotes: 10

Jacob King
Jacob King

Reputation: 6157

Technically that is possible, via the Photos framework, the docs for which can be found here.

Example code can be found here.

However, this will ask the user's permission first, and then again to confirm deletion; so possibly not the ideal solution. Unfortunately this is as good as it gets as Apple has the Camera Roll fairly locked down.

Upvotes: 0

Mr. Xcoder
Mr. Xcoder

Reputation: 4795

There is absolutely no way to completely prevent user from taking screenshot during the app process, and that's because you do not have access to delete photos in the photo gallery of the user. It would totally be a security issue if you could access your user's photos.


However, there are ways to partially prevent screenshots, as described here: Prevent screen capture in an iOS app

Upvotes: 3

Related Questions