하루 중 특정 시간에만 사용할 수있는 앱을 개발 중입니다. 사용자가 장치 시간을 쉽게 변경하여 하루 중 언제라도 응용 프로그램에 액세스 할 수 있으므로 로컬 장치 시간을 가져올 수 없습니다.Apple 서버에서 날짜 및 시간 받기
Apple 서버에서 현재 날짜 및 시간을 가져 오는 방법이 있습니까? 그렇지 않은 경우 다른 방법이 있습니까?
하루 중 특정 시간에만 사용할 수있는 앱을 개발 중입니다. 사용자가 장치 시간을 쉽게 변경하여 하루 중 언제라도 응용 프로그램에 액세스 할 수 있으므로 로컬 장치 시간을 가져올 수 없습니다.Apple 서버에서 날짜 및 시간 받기
Apple 서버에서 현재 날짜 및 시간을 가져 오는 방법이 있습니까? 그렇지 않은 경우 다른 방법이 있습니까?
인터넷 시간 서버를 사용해야한다고 생각합니다. 그들은 NTP이라는 표준화 된 프로토콜을 사용하고 있습니다. iOS는 built-in support for reading NTP server time이지만 응용 프로그램 개발자로서 귀하에게 액세스 할 수는 없습니다. 직접 구현하거나 ios-ntp 또는 HS NTP과 같은 오픈 소스 라이브러리를 사용할 수 있습니다. 나는 그들 중 누구도 직접 사용하지 않았다. 장치의 위치를 확인하고 시간대를 파악하여 실제 방탄 솔루션을 얻는 것이 좋습니다.
여기에서는 서버 및 내용에 대해 자세히 읽을 수 있습니다. NIST Internet Time Service
이상적으로 응용 프로그램에 서버 목록이 있어야합니다. 그 중 하나가 실패하면 목록에서 다음 NTP 서버를 호출합니다.
- (NSDate *) CurrentDate
{
if ([self hasInternetConnectivity]) // this tests Internet connectivity based off Apple's Reachability sample code
{
NSSURL * scriptUrl = [NSURL URLWithString: @"http:// <yoursite>. Com/<the 2 line php script>. Php"];
NSData * data = [NSData dataWithContentsOfURL: scriptUrl];
if (data! = nil) {
NSString * tempString = [NSString stringWithUTF8String: [data bytes]];
NSDate * currDate = [NSDate dateWithTimeIntervalSince1970: [tempString doubleValue]];
NSLog (@ "String returned from the site is:% @ and date is:% @", tempString, [currDate description]);
return currDate;
}
else {
NSLog (@ "nsdata download failed");
return [NSDate date];
}
}
else {
NSLog (@ "InternetConnectivity failed");
return [NSDate date];
}
}
당신은 기본 NTP 서버로부터 시간을 얻기 위해 그 오픈 소스를 사용하거나 서버를 선택할 수 있습니다 https://github.com/huynguyencong/NHNetworkTime
[[NHNetworkClock sharedNetworkClock] syncWithComplete:^{
NSLog(@"%s - Time synced %@", __PRETTY_FUNCTION__, [NSDate networkDate]);
}];
및 사용 :
이NSDate *networkDate = [NSDate networkDate];
카란의 대답은 약간의 오타, 또한 실패했다을 "nil"대신 "0"의 응답을 확인하십시오. (앱에 구현했는데 취약한 연결이나 인증되지 않은 네트워크로부터 몇 가지 가양 성이있었습니다.)
나는이를 다음과 같이 수정하고 Karan이 무엇을 언급했는지 모르는 사람들을 위해 해당 서버 코드를 추가했습니다. 에. 이가있는 NSDate 확장의 분류 방법으로 구현됩니다, 그래서 당신이 여기 [NSDate verifiedDate];
+(NSDate*)verifiedDate {
if([self hasInternetConnectivity]) {
NSURL *scriptUrl = [NSURL URLWithString:@"http://[yourwebsite].com/timestamp.php"];
NSData *data = [NSData dataWithContentsOfURL: scriptUrl];
if(data != nil) {
NSString *tempString = [NSString stringWithUTF8String:[data bytes]];
if([tempString doubleValue] > 946684800) { // Date is at least later than 2000 AD, or else something went wrong
NSDate *currDate = [NSDate dateWithTimeIntervalSince1970:[tempString doubleValue]];
NSLog(@"verifiedDate: String returned from the site is: %@ and date is: %@", tempString, [currDate description]);
return currDate;
} else {
NSLog(@"verifiedDate: Server returned false timestamp (%@)", tempString);
return [NSDate date];
}
} else {
NSLog(@"verifiedDate: NSData download failed");
return [NSDate date];
}
} else {
NSLog(@"verifiedDate: InternetConnectivity failed");
return [NSDate date];
}
}
를 사용하여 전화를 수있는 것은 "timestamp.php"
<?php
echo(time());
?>
json 데이터를 반환하는 일부 웹 서비스에서 요구 사항을 충족시킬 수 있다고 생각합니다.
그들 중 하나는 jsontest.com : http://date.jsontest.com입니다. 여기가 반환하는 것입니다 :
이{
"time": "02:11:29 AM",
"milliseconds_since_epoch": 1513563089492,
"date": "12-18-2017"
}
은 "milliseconds_since_epoch는"1970 년 이후 밀리 초를 나타냅니다, 그래서 Date.init(timeIntervalSince1970: milliseconds_since_epoch/1000)
를 사용하여 날짜로 변환하기 쉽습니다. 그런 다음 Calendar
클래스를 사용하여 현지 시간을 가져올 수 있습니다.
하나 또는 다른 해결책을 사용한 경우 선호 답변을 선택하십시오 ;-) –
사용자가 비행기 모드를 켠 다음 날짜와 시간을 변경할 수 있다고 생각 했습니까? – Mahouk