2009-09-18 21 views
5

Tôi cần đảm bảo rằng ứng dụng của tôi nhận được thời gian chính xác, không phải thời gian do người dùng đặt trong cài đặt.Làm cách nào để có được thời gian thực trong iPhone chứ không phải thời gian do người dùng đặt trong Cài đặt?

Ví dụ: khi người dùng khởi động ứng dụng, tôi muốn nhận dấu thời gian. Người dùng sẽ thấy thời gian trôi qua trên bộ đếm thời gian trên màn hình được cập nhật mỗi giây. Khi người dùng thoát khỏi ứng dụng và sau một thời gian khởi động lại ứng dụng, bộ hẹn giờ sẽ chỉ nhận được thời gian hiện tại và so sánh nó với dấu thời gian ban đầu được giữ lại. Về cơ bản, giống như đồng hồ bấm giờ trong Clock.App trên iPhone.

Bây giờ vấn đề với clock.app là nếu người dùng đi và tiến bộ thời gian trong Cài đặt một giờ, điều này sẽ ảnh hưởng đến bộ hẹn giờ. Rõ ràng là tôi không muốn điều đó, bởi vì trong ứng dụng của tôi, đó sẽ là gian lận.

Tôi cần có nguồn thời gian đáng tin cậy hơn để so sánh.

Tôi có thể lấy thời gian từ internet. Nhưng vấn đề là tôi cần kết nối internet, vì vậy chỉ hoạt động nếu có kết nối internet. Ứng dụng của tôi cần làm việc ngoại tuyến tốt hơn.

Có loại đồng hồ nội bộ nào tôi có thể truy cập không?

Có cách nào để kiểm tra xem người dùng đã thay đổi ngày trong Cài đặt chưa?

Bất kỳ ý tưởng nào khác?

Cảm ơn

+0

tôi vô tình thời gian thực ... là xấu? –

+0

Bạn có thể nhận thời gian từ GPS không? – Maxm007

+1

Bạn sẽ cần phải có thời gian từ một số nguồn bên ngoài (NIST, GPS, hệ thống điện thoại di động, thậm chí bằng gói sniffing cho lưu lượng truy cập của người khác có dữ liệu phù hợp). OTOH, nếu bạn không tin tưởng người dùng, bạn thậm chí không nên làm điều này trên hệ thống của khách hàng. – BCS

Trả lời

1

Lấy thời gian từ NIST với Nghị định thư ban ngày:

UDP Dựa Daytime Dịch vụ Một máy chủ lắng nghe cho UDP datagrams trên UDP cổng 13. Khi một gói tin được nhận, một datagram được gửi trả lời chứa ngày và thời gian hiện tại dưới dạng chuỗi ký tự ASCII (dữ liệu trong datagram nhận được bị bỏ qua).

NIST Format của phản ứng: 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

Xin chào, không thể sử dụng thời gian internet vì ứng dụng của tôi cần làm việc ngoại tuyến. – Maxm007

1

Giải pháp tốt nhất tôi đã đi lên với đang sử dụng bộ đếm thời gian máy đếm các đơn vị thời gian kể từ lần khởi động iphone cuối cùng.

Công trình này tuyệt vời. Hạn chế duy nhất là người dùng không thể được phép khởi động lại hoặc nó sẽ làm mất hiệu lực thời gian của mình.

Tôi phát hiện khởi động lại bằng cách lưu trữ dấu thời gian ban đầu được kết hợp với bộ hẹn giờ của máy và sau đó kiểm tra mỗi khi ứng dụng khởi động, vì vậy nó không thay đổi. Điều này có tác dụng phụ là nếu người dùng thay đổi iPhone DateTime trong khi anh ta đang được hẹn giờ, điều đó cũng sẽ làm mất hiệu lực điểm số, nhưng điều đó là ok.

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

tôi có thể dễ dàng cảnh báo người dùng của tôi về vấn đề này: khởi động lại hoặc thay đổi thời gian iphone trong khi bạn đang ở trên đồng hồ sẽ làm mất hiệu lực thời gian ghi của bạn.

0

Tôi chỉ đăng sau here:

này hoạt động để có được thời gian GPS:

#import <CoreLocation/CoreLocation.h> 

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

Nó dường như không thể chống tamper mặc dù.

Tôi đã thử mã này trên iPhone 4 ở chế độ trên máy bay (iOS 6.1), và thậm chí sau đó nó cung cấp cho một thời gian tất cả các quyền. Nhưng tiếc là thời gian này dường như thay đổi với đồng hồ hệ thống. Ugh.

Funny điều mà tôi tìm thấy (vẫn còn trong chế độ máy bay) là nếu bạn làm xáo trộn đồng hồ hệ thống (sau khi chuyển sang off Time & ngày của Set Automatically), và sau đó bật Set Automatically trở lại on, máy phục hồi thực (bản gốc) thời gian mà không có một xô. điều này hoạt động ngay cả sau khi đạp xe điện thoại. Vì vậy, có vẻ như có điều gì đó giống như thời gian chống giả mạo mà thiết bị duy trì trong nội bộ. Nhưng làm thế nào để truy cập này?

+0

Phương pháp này sẽ chỉ đặt ngày và giờ từ cài đặt thiết bị –

0

Phương pháp này sẽ tìm ra thời gian thực tế hiện nay, được tìm thấy trong tiêu đề phản ứng google.com của:

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]; 
Các vấn đề liên quan