监测iOS截屏(Swift)

8 篇文章 0 订阅

//

//  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

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值