UmeshKumath
UmeshKumath

Reputation: 121

How to check iOS11 Screen Recording is On or Off?

For detecting iOS11 screen recording feature On or Off I used isCaptured and UIScreenCapturedDidChange Notification.

When first time I Launch the App and On iOS11 built-in screen recording feature then it notifies the selector method with value True, but when I kill (terminate) my running App and Launch app again do the same procedure again then my selector method is not getting called.

Here is my code:

I add an Observer in ViewWillAppear() method:

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

The selector method is as follows:

@objc
func handleNotification(notification:Notification){

    let isCaptured = UIScreen.main.isCaptured

    print("isCaptured value = \(isCaptured)")
}

In this case, I need to kill the app, clear the cache and again launch the app for getting screen recording event.

Please suggest what I can do here to detect recording event to protect my content from recording.

Upvotes: 10

Views: 9144

Answers (6)

M3nd3z
M3nd3z

Reputation: 316

Using combine, you can subscribe to the isCaptured property of UIScreen and it will give you both the capturing and non-capturing states when the user starts and completes recording:

private var cancellables: [AnyCancellable] = []

UIScreen.main.publisher(for: \.isCaptured)
   .sink { isCaptured in
       // Your code
   }
   .store(in: &cancellables)

Upvotes: 0

Monger
Monger

Reputation: 23

@UmeshKumath this is easy when kill the app clear the cache and again launch the app for getting screen recording event you need to run the code in viewdidload just like so:

override func viewDidLoad() {
    super.viewDidLoad()
UIScreen.main.addObserver(self, forKeyPath: "some key", options: .new, context: nil)
    let isCaptured = UIScreen.main.isCaptured
    if isCaptured == true {
        // do something
    }

Upvotes: 2

Ankit Aman
Ankit Aman

Reputation: 1009

The feature is available on and above iOS11. Better keep it inside didFinishLaunchingWithOptions

Objective-C syntax

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: 
 (NSDictionary *)launchOptions
{
if (@available(iOS 11.0, *)) {
    BOOL isCaptured = [[UIScreen mainScreen] isCaptured];
    if(isCaptured){
       // Do the action for hiding the screen recording
                  } 
   } else{
        // Fallback on earlier versions
         }
 return YES;
}

Upvotes: 2

Roberto Font
Roberto Font

Reputation: 1

this is the way to detect if a screenshot has been taken

func detectScreenShot(action: @escaping () -> ()) {
    let mainQueue = OperationQueue.main
    NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: mainQueue) { notification in
        // executes after screenshot
        action()
    }
}

Upvotes: 0

dimohamdy
dimohamdy

Reputation: 3053

Swift 4

Add Observer

UIScreen.main.addObserver(self, forKeyPath: "captured", options: .new, context: nil)

Receive changes

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
    if (keyPath == "captured") {
        let isCaptured = UIScreen.main.isCaptured

        print(isCaptured)
    }
}

Upvotes: 13

yasirmturk
yasirmturk

Reputation: 1954

I guess you can alway check this variable regardless of the notification

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    let isCaptured = UIScreen.main.isCaptured
    return true
}

Upvotes: 3

Related Questions