【发布时间】:2016-10-22 13:58:34
【问题描述】:
我很好奇Timing 是如何知道您在特定文件中花费的时间的。我知道它需要辅助功能权限,但在那之后,它如何能够检测屏幕上当前的内容,以及访问给定文件的路径。例如,我觉得很有趣,它知道我在 Xcode 上,但它怎么知道我在 Xcode 内处理特定文件?
【问题讨论】:
-
可能使用与
lsof相同的API。
标签: objective-c swift macos applescript
我很好奇Timing 是如何知道您在特定文件中花费的时间的。我知道它需要辅助功能权限,但在那之后,它如何能够检测屏幕上当前的内容,以及访问给定文件的路径。例如,我觉得很有趣,它知道我在 Xcode 上,但它怎么知道我在 Xcode 内处理特定文件?
【问题讨论】:
lsof相同的API。
标签: objective-c swift macos applescript
我不从事 Timing 方面的工作,所以我只能对他们的应用是如何实现的做出有根据的猜测。
Timing 声称跟踪三个主要数据点:您使用的应用程序、您访问的网站以及您编辑的文档。
对于应用程序,Timing 可能会监听NSWorkspaceDidLaunchApplicationNotification 通知,其中包含有关刚刚启动的应用程序的信息。要在 Timing 启动时检查当前打开的应用程序,它可能会从系统事件中检查非后台进程,可能是这样的:
osascript -e 'tell application "System Events" to get name of (processes where background only is false)'
(来源Get list of running Apps on Mac OS X in Bash?)
对于历史,Timing 可能会在 Safari 中使用 HTML5 History API(我不知道 Timing 声称支持哪些浏览器具有此功能),或者采用类似 Charles Proxy 的方法并监控任何传入和传出的数据包和请求。实现可能会有所不同,具体取决于 Timing 是否需要管理员权限。
对于文档,Timing 可能会使用 Droppy 在他们的评论中建议的 lsof 命令,或者它可能使用 Apple 接口之一。 Pre-El Capitan,Apple 在路径 ~/Library/Preferences/com.apple.recentitems.plist 的 plist 文件中列出了最近的文档。在比 El Capitan 更新的 macOS 版本中,您可以使用 mdfind 命令并指定 kMDItemContentModificationDate 值来查找在两个日期之间修改的文件:
mdfind -onlyin $HOME '((kMDItemContentModificationDate > $time.now(-60m)) && (kMDItemContentModificationDate < $time.now()))' | grep -v /Library/
(来源Alfred)
【讨论】: