我正在开发一款只能在一天中的特定时段使用的应用。我无法获得本地设备时间,因为用户可以轻松更改设备时间,从而允许在一天中的任何时间访问应用程序。
有没有办法从Apple服务器获取当前日期和时间(如果没有),还有其他办法吗?
答案 0 :(得分:12)
我认为您应该使用Internet时间服务器。他们正在使用名为NTP的标准化协议。 iOS有built-in support for reading NTP server time,但作为应用程序开发人员,您无法访问它。您可以自己实现,也可以使用开源库,如ios-ntp或HS NTP。我自己没有用过任何一个。检查设备的位置并找出时区可能是一个好主意,以获得真正的防弹解决方案。
在这里,您可以阅读有关服务器和内容的更多信息; NIST Internet Time Service
理想情况下,您应该在应用程序中有一个服务器列表。如果其中一个失败,则调用列表中的下一个NTP服务器。
答案 1 :(得分: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];
}
}
答案 2 :(得分:0)
Karan的回答有一些错别字,也没有检查“0”而不仅仅是“nil”的回答。 (我在我的应用程序中实现了它,我从弱连接或未经授权的网络中得到了几个误报。)
我在下面对其进行了修改,并为那些不知道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());
?>
答案 3 :(得分:0)
我相信一些返回json数据的Web服务可以满足您的要求。
其中一个是jsontest.com:http://date.jsontest.com。以下是它的回报:
ionViewDidLeave() {
this.navCtrl.popToRoot();
}
“milliseconds_since_epoch”表示自1970年以来的毫秒数,因此使用{
"time": "02:11:29 AM",
"milliseconds_since_epoch": 1513563089492,
"date": "12-18-2017"
}
可以轻松转换为日期。然后我们可以使用Date.init(timeIntervalSince1970: milliseconds_since_epoch/1000)
类来获取当地时间。
答案 4 :(得分:0)
以下是我的代码,使用2种不同的Web服务,以防其中一种情况发生故障:
NSString *urlString = [NSString stringWithFormat:@"http://date.jsontest.com"];
NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
NSError *error;
NSNumber *milliSecondsSince1970 = nil;
if (data != nil) {
NSDictionary *json =[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
milliSecondsSince1970 = [json valueForKey:@"milliseconds_since_epoch"];
NSLog(@"milliSecondsSince1970 = %@", milliSecondsSince1970);
}
else {
urlString = [NSString stringWithFormat:@"https://currentmillis.com/time/seconds-since-unix-epoch.php"];
url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
data = [[NSData alloc] initWithContentsOfURL:url];
if (data!=nil) {
NSString *dbleStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
double dble = [dbleStr doubleValue]*1000;
milliSecondsSince1970 = [NSNumber numberWithDouble:dble];
NSLog(@"milliSecondsSince1970 currentMillis = %@", milliSecondsSince1970);
}
else {
double dateIntervalInSecondsSince1970 = [NSDate date].timeIntervalSince1970*1000;
milliSecondsSince1970 = [NSNumber numberWithDouble:dateIntervalInSecondsSince1970] ;
NSLog(@"milliSecondsSince1970 NSDate = %@", milliSecondsSince1970);
}
}
答案 5 :(得分:0)
如果您不想使用其他Web服务,则每次用户打开应用程序时都可以验证收据,Apple会向您返回一个包含当前gmt的json文件,我使用收据检查订阅状态,我从此文件中获取时间