监测iOS截屏(Swift)

原创 2015年11月17日 20:55:03

//

//  ScreenshotManager.swift

//  ImagePicker

//

//  Created by 成杰 on 15/11/17.

//  Copyright © 2015 成杰. All rights reserved.

//


import UIKit

import Foundation

import AssetsLibrary


class ScreenshotManager: NSObject {

    

    private var completion: ((UIImage) -> Void)? = nil

    class func detectScreenshot(completion: ((UIImage) -> Void)?) {

        let shared = self.shared

        shared.completion = completion

        shared.startTimer()

    }

    

    private static var shared: ScreenshotManager {

        dispatch_once(&Inner.token) { () -> Void in

            Inner.instance = ScreenshotManager()

        }

        return Inner.instance!

    }

    

    private struct Inner {

        static var instance: ScreenshotManager?

        static var token: dispatch_once_t = 0

    }

    

    private var timer: NSTimer? = nil

    private func startTimer() {

        timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "checkNewScreenshot", userInfo: nil, repeats: true)

    }

    

    private func stopTimer() {

        if timer != nil {

            timer!.invalidate()

            timer = nil

        }

    }

    

    private var groupCountDic = [String: Int]()

    func checkNewScreenshot() {

        print("ing...")

        let library = ALAssetsLibrary()

        library.enumerateGroupsWithTypes(ALAssetsGroupSavedPhotos, usingBlock: { (group, stop) -> Void in

            if group != nil {

                guard let groupName = group.valueForProperty(ALAssetsGroupPropertyPersistentID) as? String else {

                    return

                }

                group.setAssetsFilter(ALAssetsFilter.allPhotos())

                if self.groupCountDic[groupName] == nil {

                    self.groupCountDic[groupName] = group.numberOfAssets()

                }

                if group.numberOfAssets() > self.groupCountDic[groupName]! {

                    group.enumerateAssetsAtIndexes(NSIndexSet(index: group.numberOfAssets()-1), options: .Concurrent, usingBlock: { (alAsset, index, innerStop) -> Void in

                        if alAsset != nil {

                            let representation = alAsset.defaultRepresentation()

                            let latestPhoto = UIImage(CGImage: representation.fullScreenImage().takeUnretainedValue())

                            if latestPhoto.isScreenshot() {

                                dispatch_async(dispatch_get_main_queue(), { () -> Void in

                                    if self.completion != nil {

                                        self.completion!(latestPhoto)

                                    }

                                })

                            }

                            self.groupCountDic[groupName] = group.numberOfAssets()

                        }

                    })

                }

            }

            }) { (error) -> Void in

                print("error:\(error)")

        }

    }

    

    class func stopDetectingScreenshots() {

        self.shared.stopTimer()

        self.shared.completion = nil

        self.shared.timer = nil

    }

}


extension UIImage {

    func isScreenshot() -> Bool {

        let imageWidth = self.size.width;

        let imageHeight = self.size.height;

        let screenWidth = UIScreen.mainScreen().bounds.size.width

        let screenHeight = UIScreen.mainScreen().bounds.size.height

        return (fmod(imageWidth, screenWidth) == 0 && fmod(imageHeight, screenHeight) == 0) || (fmod(imageWidth, screenHeight) == 0 && fmod(imageHeight, screenWidth) == 0)

    }

}


// 用法

ScreenshotManager.detectScreenshot { (image) -> Void in

    self.imageView.image = image

}


iOS 截屏 swift

// let bg = UIImageView(frame: self.view.frame) // bg.image = UIImage(named: "123") //...
  • u014275966
  • u014275966
  • 2016年05月09日 15:37
  • 399

监听手机截屏事件

今天无意中在百度地图中截屏路线的时候,顶部出现提示我的截屏信息。这细节挺好的,省去我后面需要使用该截屏的繁琐步骤。刚好手头空闲会,我也写个玩玩。哈哈哈~~截屏在iOS7以前是需要使用小技巧来获取用户截...
  • yanghuiliu
  • yanghuiliu
  • 2016年06月29日 10:00
  • 2739

AVPlayer 截屏(swift3.0)

开始做的是一般的vod视频截屏,用AVAssetImageGenerator对象就可以实现,而且可以截取任意时间点的视频图像 片段代码: open func generateThumbnails...
  • cactusz
  • cactusz
  • 2017年07月06日 16:45
  • 357

IOS开发-几种截屏方法

1.         UIGraphicsBeginImageContextWithOptions(pageView.page.bounds.size, YES, zoomScale);     ...
  • super_man_ww
  • super_man_ww
  • 2016年10月09日 15:44
  • 970

iOS开发 获取系统相册最后一张图片 、 截屏广播

0. 截屏广播  UIApplicationUserDidTakeScreenshotNotification 1. iOS9.0以下,获取系统相册最后一张照片 //#impo...
  • qq_21649645
  • qq_21649645
  • 2016年05月03日 12:15
  • 2136

iOS开发-检测用户截屏, 并获取所截图片

在iOS7之前, 如果用户截屏,系统会自动取消屏幕上的所有 touch 事件,(使用 touchesCancelled:withEvent: 这个方法)那么我们就可以检测这个方法的调用,然后加载本地最...
  • Liar0606
  • Liar0606
  • 2015年11月25日 11:58
  • 3359

ios 截屏监控

ios无法禁止截屏功能,但是可以监控到截屏操作。具体方法如下:      [[NSNotificationCenter defaultCenter] addObserverForName:...
  • DARKSang
  • DARKSang
  • 2016年09月02日 14:53
  • 346

iOS开发- OpenGL ES屏幕截图

之前写过一个常规的屏幕截图:http://blog.csdn.net/hitwhylz/article/details/17189351但是发现这个办法对于OpenGL 无用。  获取到的数据为空。所...
  • hitwhylz
  • hitwhylz
  • 2014年05月29日 11:13
  • 6933

截屏获取图片

// 对指定视图进行截图 + (UIImage *)screenShotView:(UIView *)view {     UIImage *imageRet = nil;         ...
  • potato512
  • potato512
  • 2014年05月24日 00:42
  • 345

ios开发之Swift获取视频截图(本地视频、网络视频的缩略图)

有时我们需要在界面上显示视频的缩略图,这样用户不用点开也能大概了解到视频的内容。下面分别演示如何获取本地视频,以及网络在线视频的视频截图。 样例的效果图如下,将获取到的截图(视频开始部分)显示在...
  • qq_29846663
  • qq_29846663
  • 2017年06月27日 15:35
  • 575
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:监测iOS截屏(Swift)
举报原因:
原因补充:

(最多只允许输入30个字)