2009-09-18 4 views
5

Ich muss sicherstellen, dass meine App die richtige Zeit erhält, nicht die Zeit, die der Benutzer in den Einstellungen festgelegt hat.Wie kann ich die Echtzeit im iPhone abrufen, nicht die Zeit, die vom Benutzer in den Einstellungen festgelegt wurde?

So, zum Beispiel, sobald der Benutzer die App startet, würde ich einen Zeitstempel erhalten wollen. Der Benutzer würde die verstrichene Zeit eines Timers auf dem Bildschirm sehen, der jede Sekunde aktualisiert wird. Wenn der Benutzer die App beendet und nach einiger Zeit die App neu startet, erhält der Timer nur die aktuelle Uhrzeit und vergleicht sie mit dem ursprünglichen Zeitstempel. Also im Prinzip genau wie die Stoppuhr in der Clock.App auf dem iPhone.

Jetzt ist das Problem mit der Uhr.app ist, dass, wenn der Benutzer geht und die Zeit in den Einstellungen um eine Stunde vorrückt, dies den Timer beeinflussen wird. Natürlich will ich das nicht, denn in meiner App wäre das Betrug.

Ich müsste eine vertrauenswürdigere Zeitquelle zum Vergleichen erhalten.

Ich könnte die Zeit aus dem Internet bekommen. Aber das Problem ist, dass ich eine Internetverbindung brauche, also nur funktioniert, wenn es eine Internetverbindung gibt. Meine App muss vorzugsweise offline arbeiten.

Gibt es irgendeine Art von interner Uhr, auf die ich zugreifen kann?

Gibt es eine Möglichkeit zu überprüfen, ob der Benutzer die Datum Uhrzeit in den Einstellungen geändert hat?

Irgendwelche anderen Ideen?

Dank

+0

ich die Echtzeit zufällig ist ... so schlecht? –

+0

Wäre es möglich, Zeit vom GPS zu bekommen? – Maxm007

+1

Sie müssen die Zeit von einer externen Quelle (NIST, GPS, das Mobiltelefonsystem, vielleicht sogar durch Paketschnüffeln für den Datenverkehr anderer Leute, die die richtigen Daten haben) bekommen, da jede interne Uhr gestört werden kann. OTOH, wenn Sie dem Benutzer nicht vertrauen, sollten Sie dies nicht einmal auf dem Client-System tun. – BCS

Antwort

1

die Zeit vom NIST mit dem Daytime-Protokoll-Adresse:

UDP Based Tagschaltung Ein Server für UDP-Datagramme auf UDP-Port lauscht 13. Wenn ein Datagramm empfangen wird, wird ein Antwortdatagramm gesendet enthält das aktuelle Datum und die Uhrzeit als ASCII-Zeichenfolge (die Daten im empfangenen Datagramm werden ignoriert).

NIST Format der Antwort: JJJJJ YR-MO-DA HH: MM: SS TT LH msADV UTC (NIST) OTM

http://tf.nist.gov/service/its.htm

http://tf.nist.gov/tf-cgi/servers.cgi

+1

Hallo, ich kann keine Internetzeit verwenden, da meine App offline arbeiten muss. – Maxm007

1

Die beste Lösung, die ich habe kommen mit verwendet den Mach-Timer, der Zeiteinheiten seit dem letzten iPhone-Start zählt.

Das funktioniert super. Die einzige Einschränkung ist, dass der Benutzer nicht neu starten darf oder seine Zeit ungültig wird.

Ich erkenne einen Neustart, indem ich zuerst den iPhone-Zeitstempel, der mit dem Mach-Timer verknüpft ist, abspeichere und dann jedes Mal, wenn die App startet, überprüfe, so dass sie sich nicht geändert hat. Dies hat als Nebeneffekt, dass, wenn der Benutzer die iPhone DateTime während seiner Zeit ändert, dies auch die Bewertung ungültig macht, aber das ist in Ordnung.

How can I detect whether the iphone has been rebooted since last time app started

Ich kann meine Nutzer über diese leicht warnen: Neustart oder iphone Zeit ändern, während Sie auf der Uhr sind Ihre erzielte Zeit ungültig.

0

Ich habe gerade gebucht folgende here:

Dies funktioniert die GPS-Zeit zu bekommen:

#import <CoreLocation/CoreLocation.h> 

CLLocation* gps = [[CLLocation alloc] 
         initWithLatitude:(CLLocationDegrees) 0.0 
         longitude:(CLLocationDegrees) 0.0]; 
NSDate* now = gps.timestamp; 

Es ist nicht, obwohl zu sein manipulationssicher scheint.

Ich habe diesen Code auf einem iPhone 4 im Flugzeugmodus (iOS 6.1) versucht, und selbst dann gibt es eine Zeit in Ordnung. Aber leider scheint sich diese Zeit mit der Systemuhr zu ändern. Pfui.

lustige Sache, die ich (noch im Flugzeugmodus) gefunden ist, wenn Sie mit dem Systemtakt manipulieren (nach der off Zeit dreht & Datum der Set Automatically) und dann Set Automatically zurückdrehen zu on, die Maschine des reale (Original wieder her) Zeit ohne Probleme. Dies funktioniert auch nach dem Einschalten des Telefons. So scheint es, dass etwas wie eine manipulationssichere Zeit ist, die das Gerät intern beibehält. Aber wie kann man darauf zugreifen?

+0

Diese Methode stellt Datum und Uhrzeit nur über die Geräteeinstellungen ein –

0

in google.com Antwort-Header dieser Methode wird die tatsächliche aktuelle Zeit finden,:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] 
           initWithURL:[NSURL URLWithString:@"http://google.com"]]; 

[request setHTTPMethod:@"GET"]; 

NSHTTPURLResponse *httpResponse = nil; 
[NSURLConnection sendSynchronousRequest:request returningResponse:&httpResponse error:nil]; 
NSString *dateString = [[httpResponse allHeaderFields] objectForKey:@"Date"]; 
NSDate *currentDate = [NSDate dateWithNaturalLanguageString:dateString locale:NSLocale.currentLocale]; 
Verwandte Themen