从Apple Server获取日期和时间

时间:2012-01-31 06:22:08

标签: ios xcode

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

有没有办法从Apple服务器获取当前日期和时间(如果没有),还有其他办法吗?

6 个答案:

答案 0 :(得分:12)

我认为您应该使用Internet时间服务器。他们正在使用名为NTP的标准化协议。 iOS有built-in support for reading NTP server time,但作为应用程序开发人员,您无法访问它。您可以自己实现,也可以使用开源库,如ios-ntpHS 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文件,我使用收据检查订阅状态,我从此文件中获取时间