2010-02-15 31 views
26

Tôi đang viết một ứng dụng yêu cầu thời gian chính xác. Sau khi yêu cầu this question, tôi đã quyết định điều tra bằng cách sử dụng NTP hoặc có thể là NTP đơn giản.Giao thức thời gian mạng cho iPhone

Có bất kỳ triển khai nguồn mở nào của các giao thức này cho iPhone không? Cho đến nay tôi đã tìm được broken link. Tôi cũng biết rằng NTP có một số C reference implementation, vì vậy tôi đang cố gắng xem nó cần bao nhiêu công sức để làm cho nó hoạt động trên iPhone.

Cập nhật: Tôi nghĩ rằng tôi đã có một liên kết làm việc, nhưng nó là để Wayback Machine, mà chỉ tiết kiệm văn bản, không phải tập tin link that works.

+0

Đừng iPhone sử dụng NTP đã thiết lập đồng hồ của họ tự động? – oefe

+0

@oefe: Tôi không biết họ đặt thời gian của họ như thế nào. Có lẽ từ các tàu sân bay – Casebash

+0

hmm, điều này sẽ không làm việc trong iPod touches ... và có vẻ như tàu sân bay mà không cung cấp thời gian (dumbphone cũ của tôi đặt đồng hồ tự động khi tôi ở Mỹ, nhưng trở lại ở châu Âu, tôi – oefe

Trả lời

18

Có một thư viện iOS nhỏ tên là ios-ntp. Tôi đã sử dụng nó trong một dự án trong quá khứ và nó dường như hoạt động khá tốt.

Kể từ giữa năm 2013 dự án ios-ntp ban đầu có một vài phần thiếu, vì vậy tôi đã nhân đôi kho svn gốc thành github. Bạn có thể kiểm ra một phiên bản làm việc của mã ở đây: https://github.com/jessedc/iOS-ntp

+0

Cảm ơn bạn heaps – Casebash

+0

Trong thử nghiệm rộng rãi của tôi, tôi đã tìm thấy nó hoạt động khá xấu. – Goles

+0

Nó nói "Đây là một công việc đang tiến hành." . Tôi có thể lấy mã từ một nơi khác không? –

5

Tôi có thể bắt đầu bằng cách lấy mã từ OpenNTPD.

2

Nếu bạn cần phải sử dụng NTP, nhưng không muốn tin tưởng vào iPhone (hoặc iPod của) đồng hồ, bạn luôn có thể chỉ cần sử dụng ổ cắm (hoặc suối Cocoa) và truy vấn các máy chủ chính mình. Đây là một trong những giao dịch mạng đơn giản nhất trên mạng.

Cocoa Streams

+2

Hãy coi chừng, độ trễ mạng có thể thay đổi * theo thời gian (tùy thuộc vào tải mạng, chất lượng tín hiệu, EDGE/3G so với WiFi, v.v.). Có lẽ không phải là một mối quan tâm nếu bạn chỉ cần chính xác trong vòng vài giây, nhưng rắc rối hơn nếu bạn quan tâm khoảng mili giây. –

2

Tôi không biết những gì ứng dụng mà bạn đang tạo, nhưng nếu tin tưởng vào đồng hồ là một tính năng quan trọng của an ninh của nó hoặc (trong trường hợp của trò chơi) gian lận phòng ngừa, vv, thì bạn cần phải rất cẩn thận với các giao thức mở như NTP-- một kẻ lừa đảo có thể làm một người trung gian với yêu cầu NTP của bạn và nói cho ứng dụng của bạn biết những gì anh ấy muốn bạn nghe. Nếu điều này có thể là mối quan ngại, bạn sẽ muốn xây dựng nguồn chân lý đáng tin cậy của riêng bạn cho thời gian vào máy chủ của bạn (ví dụ: xây dựng dịch vụ thời gian của riêng bạn và ký trả lời của bạn với mật mã PK) và đặt nội bộ của ứng dụng của bạn đồng hồ cho rằng trong một số skew đồng hồ chấp nhận được.

+0

Bạn cần phải cẩn thận khi tin tưởng đồng hồ. Nhưng đó không phải là lý do để không tin tưởng NTP. Nó có các chế độ mật mã để phân phối thời gian đáng tin cậy, vì vậy bạn có thể không cần phải xây dựng giao thức riêng của mình. –

+1

Tại sao điều này lại bị bỏ phiếu ?! Tôi đang sửa nó. Tôi không thực thi đồng hồ hệ thống ios, bởi vì người dùng có thể dễ dàng sửa đổi và cần phải kiểm tra xem 30 ngày trôi qua kể từ ngày mua hàng hay không. Không bao giờ suy nghĩ, nhưng rất có thể để kết nối với iphone của tôi thông qua wi-fi internet và có một proxy cho các máy chủ NTP và đưa ra một ngày giả cho iphone. Đây là phản hồi hợp lệ, có kinh nghiệm. Xin vui lòng upvote nó! –

2

Vì bạn đang phát triển một ứng dụng thương mại, nếu thất bại, RFC 2030 mô tả giao thức SNTP. Tôi không có thông tin về các thư viện thương mại sẵn có mà không yêu cầu tác vụ nền mà iPhone sẽ không cho phép bạn sử dụng.

0

Bạn có thể sử dụng mã nguồn mở: https://github.com/huynguyencong/NHNetworkTime

[[NHNetworkClock sharedNetworkClock] syncWithComplete:^{ 
     NSLog(@"%s - Time synced %@", __PRETTY_FUNCTION__, [NSDate networkDate]); 
    }]; 

Và sử dụng:

NSDate *networkDate = [NSDate networkDate]; 
Các vấn đề liên quan