【问题标题】:How to check iOS11 Screen Recording is On or Off?如何查看 iOS11 录屏功能是否开启?
【发布时间】:2017-09-15 06:02:20
【问题描述】:

为了检测 iOS11 屏幕录制功能 On 或 Off,我使用了 isCaptured 和 UIScreenCapturedDidChange 通知。

当我第一次启动应用程序并在 iOS11 内置屏幕录制功能上时,它会通知选择器方法值为 True,但是当我杀死(终止)我正在运行的应用程序和启动应用程序时再次执行相同的过程,然后我的选择器方法没有被调用。

这是我的代码:

我在 ViewWillAppear() 方法中添加了一个观察者:

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

选择器方法如下:

@objc
func handleNotification(notification:Notification){

    let isCaptured = UIScreen.main.isCaptured

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

在这种情况下,我需要杀死应用程序,清除缓存并再次启动应用程序以获取屏幕录制事件。

请建议我可以在这里做些什么来检测录制事件以保护我的内容不被录制。

【问题讨论】:

  • 你试过UIScreen上的mirrored 属性吗?
  • 谢谢,是的,我试过镜像属性,但我只想获取屏幕录制事件。

标签: ios swift ios11


【解决方案1】:

斯威夫特 4

添加观察者

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

接收更改

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

        print(isCaptured)
    }
}

【讨论】:

  • 嗨,有没有类似的方法可以检测用户何时拍摄 ScrrenShot。我知道“UIApplicationUserDidTakeScreenshot”,但它在用户拍摄 ScreenShot 后触发。
  • @Bhavesh.iosDev 截图成功了吗?
  • @AnkitKumarGupta no bro 仍然没有找到任何解决方案。
  • 但是有 api screenshield 做同样的事情。他们也有 app:confind
  • @AlbertRenshaw no
【解决方案2】:

我猜你总是可以检查这个变量而不考虑通知

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

【讨论】:

  • 感谢您的回复,但我会尝试查找用户开启或关闭屏幕录制时的事件。
  • 我还在“已捕获”属性中添加了 KVO。但它只在第一次工作,但是当我再次杀死应用程序并启动时,没有从 isCaptured 获取事件。是否需要清除缓存内存?
  • 就像我说的那样,您不需要跟踪事件或通知或“何时更改捕获的值”..您可以随时读取该值
  • 嗨,我的项目中的 yasirmturk 我想知道用户何时开始屏幕录制,即我的应用程序正在运行,如果用户在 iOS11 中开始屏幕录制,那么我想知道屏幕录制是否开启并像 Netflix 和 Amazon Prime 一样采取特定措施来防止内容盗版。
  • 这实际上还可以检测您的手机何时使用 AirPlay 或连接到外接显示器...可能不是您想要的效果。
【解决方案3】:

该功能在 iOS11 及以上版本可用。最好把它放在 didFinishLaunchingWithOptions

Objective-C 语法

- (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;
}

【讨论】:

    【解决方案4】:

    @UmeshKumath 这很容易杀死应用程序清除缓存并再次启动应用程序以获取屏幕录制事件,您需要像这样在 viewdidload 中运行代码:

    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
        }
    

    【讨论】:

      【解决方案5】:

      这是检测是否截屏的方法

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

      【讨论】:

        【解决方案6】:

        使用 combine,您可以订阅 UIScreenisCaptured 属性,当用户开始和完成录制时,它将为您提供正在捕获和非捕获状态:

        private var cancellables: [AnyCancellable] = []
        
        UIScreen.main.publisher(for: \.isCaptured)
           .sink { isCaptured in
               // Your code
           }
           .store(in: &cancellables)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-07
          • 1970-01-01
          • 2021-05-29
          • 2019-09-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多