Alok Maurya
Alok Maurya

Reputation: 143

How to disable screen Recording in iOS app

Is there any way to disable the screen recording? or is is possible through a configuration profile? or any third party library is available?

Upvotes: 9

Views: 16603

Answers (4)

Midhun
Midhun

Reputation: 2197

Swift 4 and above

You just need to make the following changes in your Appdelegate.swift page.

It will automatically add a blurred view on the top of the app when the user tries to record the screen.

weak var screen : UIView? = nil

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    NotificationCenter.default.addObserver(self, selector: #selector(preventScreenRecording), name: UIScreen.capturedDidChangeNotification, object: nil)
    return true
}

@objc func preventScreenRecording() {
    let isCaptured = UIScreen.main.isCaptured
    print("isCaptured: \(isCaptured)")
    if isCaptured {
        blurScreen()
    }
    else {
        removeBlurScreen()
    }
}

func blurScreen(style: UIBlurEffect.Style = UIBlurEffect.Style.regular) {
    screen = UIScreen.main.snapshotView(afterScreenUpdates: false)
    let blurEffect = UIBlurEffect(style: style)
    let blurBackground = UIVisualEffectView(effect: blurEffect)
    screen?.addSubview(blurBackground)
    blurBackground.frame = (screen?.frame)!
    window?.addSubview(screen!)
}

func removeBlurScreen() {
    screen?.removeFromSuperview()
}

Upvotes: 2

Daniel Sumara
Daniel Sumara

Reputation: 2264

When your app is started you can test UIScreen.isCaptured property and show some splash screen if it's set to true.

You should also observe (subscribe in some place for) capturedDidChangeNotification notification, and do same thing (show splash screen) if UIScreen.isCaptured is set to true.

Upvotes: 4

Pyae Phyoe Shein
Pyae Phyoe Shein

Reputation: 13837

NotificationCenter.default.addObserver(self, selector: #selector(preventScreenRecording), name: NSNotification.Name.UIScreenCapturedDidChange, object: nil)

And create a view inside main view and prevent like that.

(void) preventScreenRecording {
if (@available(iOS 11.0, *)) {
    BOOL isCaptured = [[UIScreen mainScreen] isCaptured];

    if (isCaptured) {
        self.blockView.hidden = false;
    }
    else {
        self.blockView.hidden = true;
    }
}

Upvotes: 12

Manish_Nainwal
Manish_Nainwal

Reputation: 301

sharedRecorder.stopRecording( handler: { previewViewController, error in    
    if let error = error {
        print("\(error.localizedDescription)")
    }
    if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad {
        previewViewController?.modalPresentationStyle = UIModalPresentationStyle.popover
        previewViewController?.popoverPresentationController?.sourceRect = CGRect.zero
        previewViewController?.popoverPresentationController?.sourceView = self.view
    }
    if previewViewController != nil {
        self.previewViewController = previewViewController
        previewViewController?.previewControllerDelegate = self
    }
    self.present(previewViewController!, animated: true, completion: nil)
    })
    return
}



https://developer.apple.com/documentation/replaykit/rpscreenrecorder/1620990-stoprecording

Upvotes: 1

Related Questions