2012-01-31 3 views
18

하루 중 특정 시간에만 사용할 수있는 앱을 개발 중입니다. 사용자가 장치 시간을 쉽게 변경하여 하루 중 언제라도 응용 프로그램에 액세스 할 수 있으므로 로컬 장치 시간을 가져올 수 없습니다.Apple 서버에서 날짜 및 시간 받기

Apple 서버에서 현재 날짜 및 시간을 가져 오는 방법이 있습니까? 그렇지 않은 경우 다른 방법이 있습니까?

+1

하나 또는 다른 해결책을 사용한 경우 선호 답변을 선택하십시오 ;-) –

+0

사용자가 비행기 모드를 켠 다음 날짜와 시간을 변경할 수 있다고 생각 했습니까? – Mahouk

답변

11

인터넷 시간 서버를 사용해야한다고 생각합니다. 그들은 NTP이라는 표준화 된 프로토콜을 사용하고 있습니다. iOS는 built-in support for reading NTP server time이지만 응용 프로그램 개발자로서 귀하에게 액세스 할 수는 없습니다. 직접 구현하거나 ios-ntp 또는 HS NTP과 같은 오픈 소스 라이브러리를 사용할 수 있습니다. 나는 그들 중 누구도 직접 사용하지 않았다. 장치의 위치를 ​​확인하고 시간대를 파악하여 실제 방탄 솔루션을 얻는 것이 좋습니다.

여기에서는 서버 및 내용에 대해 자세히 읽을 수 있습니다. NIST Internet Time Service

이상적으로 응용 프로그램에 서버 목록이 있어야합니다. 그 중 하나가 실패하면 목록에서 다음 NTP 서버를 호출합니다.

+0

gd 감사합니다. – kraitz

+0

@kraitz 아마도 당신이 사용할 수있는 오픈 소스 구현을 발견했습니다. 대답은 그에 따라 업데이트됩니다. –

+0

ios-ntp에는 많은 공급 업체 코드가 포함되어 있습니다. 그리고 클래스 이름은 프로젝트에 포함하지 않는 것이 좋습니다. – kelin

5
- (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]; 
    } 
} 
+0

감사합니다. 시도해 볼 것입니다. – kraitz

+0

여기에 어떤 종류의 서버가 있습니까? 자체 서버를 구현해야합니까? –

+0

내가 언급 한 샤는 현재 날짜 시간을 인쇄하는 서버에 PHP 파일을 호스트하는 것입니다 생각합니다. 위의 코드는 텍스트를 읽고 NSDate로 반환합니다. 내가 틀리지 않으면. – kraitz

1

당신은 기본 NTP 서버로부터 시간을 얻기 위해 그 오픈 소스를 사용하거나 서버를 선택할 수 있습니다 https://github.com/huynguyencong/NHNetworkTime

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

및 사용 :

NSDate *networkDate = [NSDate networkDate]; 
0

카란의 대답은 약간의 오타, 또한 실패했다을 "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()); 
?> 
0
으로 서버의 루트 폴더에 저장되어있는 서버 코드의

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 클래스를 사용하여 현지 시간을 가져올 수 있습니다.