Last active
February 14, 2022 19:49
-
-
Save ts95/300c5a815393087c72cc to your computer and use it in GitHub Desktop.
OS X detect new screenshot event with Swift
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
typealias NewFileCallback = (fileURL: NSURL) -> Void | |
class ScreenshotDetector: NSObject, NSMetadataQueryDelegate { | |
let query = NSMetadataQuery() | |
var newFileCallback: NewFileCallback? | |
override init() { | |
super.init() | |
let center = NSNotificationCenter.defaultCenter() | |
center.addObserver(self, selector: Selector("queryUpdated:"), name: NSMetadataQueryDidStartGatheringNotification, object: query) | |
center.addObserver(self, selector: Selector("queryUpdated:"), name: NSMetadataQueryDidUpdateNotification, object: query) | |
center.addObserver(self, selector: Selector("queryUpdated:"), name: NSMetadataQueryDidFinishGatheringNotification, object: query) | |
query.delegate = self | |
query.predicate = NSPredicate(format: "kMDItemIsScreenCapture = 1") | |
query.startQuery() | |
} | |
deinit { | |
query.stopQuery() | |
} | |
func queryUpdated(notification: NSNotification) { | |
if let userInfo = notification.userInfo { | |
for v in userInfo.values { | |
let items = v as! [NSMetadataItem] | |
if items.count > 0 { | |
let item = items[0] | |
if let filename = item.valueForAttribute("kMDItemFSName") as? String { | |
let filenameWithPath = NSString(string: "~/Desktop/" + filename).stringByExpandingTildeInPath | |
let url = NSURL(fileURLWithPath: filenameWithPath, isDirectory: false) | |
if let cb = self.newFileCallback { | |
cb(fileURL: url) | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
//////////////////////////// | |
// Usage // | |
//////////////////////////// | |
// Because this object is observing events it should stay | |
// in memory for the duration of its usage. | |
// In a view controller for instance it should be allocated | |
// in the class scope. If its reference is stored inside | |
// a method it will be deallocated automatically when the | |
// method returns and consequently stop obsering any events. | |
let detector = ScreenshotDetector() | |
// The actual callback can be assigned anywhere there's | |
// a reference to the instance. | |
detector.newFileCallback = { fileURL in | |
// fileURL is an NSURL instance of the screenshot file. | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Yeah looks like if I remove sandboxing it works. Which is fine for my demo app. There might be an entitlement I can set but for now that's fine. 👍