Ich suche nach einem zuverlässigen Weg, um die Zeit zu bekommen. Es kann nicht manipuliert werden und es muss offline arbeiten. Also keine Internetzeit, keine Benutzerzeiteinstellung in den Einstellungen und keine BSD-Betriebszeit seit dem letzten Neustart. Ich frage mich seit GPS funktioniert mit Atomuhr, ob ich auf diese Informationen zugreifen könnte.
Danke
Dies funktioniert, um die GPS-Zeit zu erhalten:
%Vor%Es scheint jedoch nicht manipulationssicher zu sein.
Ich habe diesen Code auf einem iPhone 4 im Flugzeugmodus (iOS 6.1) ausprobiert, und selbst dann gibt es eine Zeit in Ordnung. Aber leider scheint sich diese Zeit mit der Systemuhr zu ändern. Ugh.
Was ich (noch im Flugmodus) gefunden habe, ist, dass Sie, wenn Sie die Systemuhr manipulieren (nachdem Sie off
Time & amp; Date Set Automatically
gewählt haben), und Set Automatically
wieder auf on
setzen. stellt die Maschine die reale (ursprüngliche) Zeit ohne Probleme wieder her. Dies funktioniert auch nach dem Einschalten des Telefons. Es scheint also, dass eine manipulationssichere Zeit ist, die das Gerät intern pflegt. Aber wie kann ich darauf zugreifen?
P.S. Eine Diskussion davon aus dem Jahr 2010. Der Autor des vorletzten Kommentars versuchte es dies in einem Fallout Shelter: so ist es klar, das Telefon wird nicht die unberührte Zeit von einer externen Quelle.
Einige weitere Posts gefunden ( hier , hier und hier ) über eine andere Art von Zeitmessung: System-Kernel-Boot-Zeit. Es wird über einen Anruf wie folgt aufgerufen: sysctlbyname("kern.boottime", &boottime, &size, NULL, 0);
. Leider ändert sich auch dies mit den vom Benutzer eingestellten Daten und Zeiten, auch ohne Neustart. Eine weitere Funktion gettimeofday()
ist in ähnlicher Weise abhängig von der benutzerdefinierten Zeit.
NSDate und sein CF-Gegenstück basieren alle auf der vom Benutzer steuerbaren Zeit und sind daher nicht manipulationssicher.
Soweit ich weiß, gibt es keine offene API für entweder die GPS-Zeit oder die Trägerzeit direkt. Sie können jedoch überprüfen, ob mach_absolute_time seit dem letzten Hochfahren keine Zeit verstreichen lässt, und nutzen Sie sie, um zumindest zu wissen, wie viel Zeit seit dem Aufwachen der App verstrichen ist (ohne das Potenzial für diese Zeit manipuliert zu haben) die App läuft).
mach_absolute_time hängt vom Prozessor des Geräts ab. Es gibt Ticks zurück, seit das Gerät zuletzt neu gestartet wurde (auch bekannt als uptime). Um es in einer für Menschen lesbaren Form zu erhalten, müssen Sie es durch das Ergebnis von mach_timebase_info (ein Verhältnis) ändern, das Milliardstel Sekunden (oder Nanosekunden) zurückgibt. Um dies nutzbar zu machen, verwende ich eine Funktion wie die folgende:
%Vor%Auch wenn Sie die GPS-Zeit nutzen können, sollten Sie sich darüber im Klaren sein, dass GPS-Zeit nicht ganz stimmt das gleiche wie UTC. Der GPS-Empfänger im iPhone könnte das jedoch für Sie übernehmen.
Der Goldstandard der Zeitmessung sind die verschiedenen Zeitbeobachtungsstellen der Regierung in den USA und weltweit. Sie liefern Atomzeit. Das wird weltweit verwendet. Apple sollte das verwenden. Wenn mit den Mobilfunkmasten synchronisiert werden soll, sollte eine alternative interne Zeit vorhanden sein. Wenn der Tower oder das GPS-System ausfällt, bleiben alle mit einer falschen Zeit.
Damit erhalten Sie das aktuelle Datum und die Uhrzeit:
%Vor%Dies wird so zuverlässig wie möglich sein. Die interne Uhr auf dem iPhone wird aktualisiert, wenn sie auf einen NTP-Server zugreifen kann. Wenn das Telefon GPS als Zeitsynchronisationsquelle verwendet, wird es auch verwendet, um die gleiche systemweite Uhr zu aktualisieren, die über die obige Methode zugänglich ist.
Das CoreFoundation-Äquivalent ist etwas wie:
%Vor%Gibt das CoreFoundation-Äquivalent des normalen UNIX-Sekunden-seit-Epoche-Zeitstempels zurück.