从Apple服务器获取date和时间

我正在开发一个应用程序,只能在一天中的某个时间使用。 我无法获得本地设备的时间,因为用户可以轻松地更改设备时间,从而允许在一天中的任何时间访问应用程序。

有没有办法从苹果服务器获取当前date和时间(或者如果没有),还有其他方法吗?

我认为你应该使用互联网时间服务器。 他们正在使用称为NTP的标准化协议。 iOS 内置了对读取NTP服务器时间的支持 ,但作为应用程序开发人员无法访问。 你可以自己实现,也可以使用开源库,比如ios-ntp或HS NTP 。 我自己没有使用过任何一个。 检查设备的位置并确定时区可能是一个好主意,以获得真正的防弹解决scheme。

在这里你可以阅读更多关于服务器和东西; NIST互联网时间服务

理想情况下,您应该在应用程序中有一个服务器列表。 如果其中一个失败,则调用列表中的下一个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服务器的时间,或select您的服务器: https : //github.com/huynguyencong/NHNetworkTime

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

并使用:

 NSDate *networkDate = [NSDate networkDate]; 

卡兰的答案有一些错别字,也没有检查“0”而不是“零”的回应。 (我在我的应用程序中实现了这个function,而且我从弱连接或未经授权的networking中获得了几个误报。)

我已经在下面调整了它,并且为那些不知道Karan指的是什么的人添加了相应的服务器代码。 这是作为NSDate扩展中的类别方法实现的,所以你可以使用[NSDate verifiedDate];来调用它[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数据的web服务来满足。

其中之一是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)很容易转换为Date。 然后我们可以使用Calendar类获取当地时间。