2016-06-21 12 views
11

Jestem ciekaw, jak Timing jest w stanie wiedzieć, ile czasu spędzasz w danym pliku. Rozumiem, że potrzebuje uprawnień dostępu, ale po tym, jak jest w stanie wykryć, co jest aktualnie na ekranie, oraz dostęp do ścieżki do danego pliku. Intrygujące jest na przykład to, że wie, że jestem w Xcode, ale skąd wiadomo, że pracuję nad konkretnym plikiem w Xcode?Jak aplikacja Mac OS X Timing może śledzić pliki

+0

Prawdopodobnie stosując takie same API jak 'lsof' . – Droppy

Odpowiedz

7

Nie pracuję nad synchronizacją czasu, więc mogę tylko zgadnąć, w jaki sposób została wdrożona ich aplikacja.

Informacje dotyczące czasu, aby śledzić trzy główne punkty danych: używane aplikacje, odwiedzane witryny i edytowane dokumenty.

W przypadku aplikacji, czas prawdopodobnie oczekuje na powiadomienie NSWorkspaceDidLaunchApplicationNotification, które zawiera informacje o właśnie uruchomionej aplikacji. Aby sprawdzić aktualnie otwarte aplikacje kiedy Timing jest uruchomiona, to prawdopodobnie sprawdza procesy non-background z systemu zdarzeń, prawdopodobnie tak:

osascript -e 'tell application "System Events" to get name of (processes where background only is false)' 

(Źródło Get list of running Apps on Mac OS X in Bash?)

Dla historii, czas może korzystać z HTML5 Historyczny interfejs API z Safari (nie wiem, jakie przeglądarki chroni przed taktowaniem, aby obsłużyć tę funkcję), lub podejmij takie podejście, jak Charles Proxy i monitoruj wszystkie przychodzące i wychodzące pakiety i żądania. Implementacja może się różnić w zależności od tego, czy czas wymaga uprawnień administratora.

Dla dokumentów, Czas może używać polecenia lsof, jak sugerował Droppy w swoim komentarzu, lub może używać jednego z interfejsów Apple. Pre-El Capitan, Apple podał ostatnie dokumenty w pliku plist na ścieżce ~/Library/Preferences/com.apple.recentitems.plist. W wersji MacOS nowsze niż El Capitan, można użyć komendy mdfind i określić wartość kMDItemContentModificationDate znaleźć pliki zmodyfikowane pomiędzy dwiema datami:

mdfind -onlyin $HOME '((kMDItemContentModificationDate > $time.now(-60m)) && (kMDItemContentModificationDate < $time.now()))' | grep -v /Library/ 

(Źródło Alfred)