【问题标题】:To know date and time settings in device from an iPhone application从 iPhone 应用程序了解设备中的日期和时间设置
【发布时间】:2013-04-27 22:04:56
【问题描述】:

我想知道用户是否将他们的设备设置为在 iPhone 的 Settings.app 中自动设置日期和时间。我需要这些信息,因为我想让用户仅在一天内访问应用程序中的某些信息,而他只能在第二天再次访问这些信息。但是聪明的用户可以更改日期并访问信息。所以我想检查他们是否为设备自动设置日期/时间。

有没有办法做到这一点。如果存在,请建议任何其他替代方式。 提前致谢。

【问题讨论】:

    标签: ios objective-c date datetime settings


    【解决方案1】:

    这是一个替代建议,我在开发的会议应用程序中遇到了类似的问题。我只想在会议的第二天向用户展示一些数据。

    在与我们的团队讨论从设备获取日期选项之后。我们决定不使用这种方法,因为正如您所说,一些用户可能会更改日期设置,而且一些用户可能会不情愿地将他们的设备设置为其他国家的时间和日期区域,这些时间和日期区域可能会给用户带来日期冲突问题。

    最后我们决定创建一个简单的网页并获取http 200http 404 请求该信息。您不必将数据或其他任何内容放到服务器上,我们只是想从 web 获取响应代码。

    假设您有一个网页 http://xxxxxxxxxxxxxx.pdf.html 我们不会将任何 pdf 文件放到服务器上,因此用户总是会得到 http 404 response 在这种情况下我们禁用或隐藏相关的数据/按钮/行。在会议的第二天,我们放置了一个虚拟页面,因此现在用户可以获得http 200 response,因此我们启用按钮/行/数据。

    如果您决定使用这种方法从here 下载 nsurlconnection 块

    然后使用以下代码:

    NSURL *theFileURL=[NSURL URLWithString:@"yoururl"];
     NSURLRequest *request = [NSURLRequest requestWithURL:theFileURL];
    
        [URLConnection asyncConnectionWithRequest:request
                                  completionBlock:^(NSData *data, NSURLResponse *response) {
                                      //get data and response
                                      if ([response isKindOfClass:[NSHTTPURLResponse class]])
                                      {
                                          NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *) response;
                                          //NSString *fileMIMEType = [[httpResponse MIMEType] lowercaseString];
                                          NSLog(@"httpResponse.statusCode %i",httpResponse.statusCode);
                                          if (httpResponse.statusCode==200) {
                                              //correct respond show data
    
                                          }
                                          else if (httpResponse.statusCode==404)
                                          {
                                              //no file this
                                              NSLog(@"no file at the server");
    
                                          }
    
                                      }
                                      //[HUD removeFromSuperview];
    
    
                                  } errorBlock:^(NSError *error) {
                                      //get error
    
                                      NSLog(@"error %@",error);
                                  } uploadPorgressBlock:^(float progress) {
                                      //Upload progress (0..1)
                                  } downloadProgressBlock:^(float progress) {
                                      //Download progress (0.1)
                                      //progress += 0.01;
                                      //HUD.progress = progress;
                                  }];
    

    【讨论】:

    • 谢谢,我们可以为此目的使用他们的任何 URL。我已经搜索过了,我认为我们必须为此创建一个 Web 服务。
    【解决方案2】:

    我认为没有办法检测用户对日期时间设置自动更新的偏好。要确定从给定点开始的时间长度,您有几个选项都不是绝对的或没有任何错误。

    1. 使用 NSDate,您已经知道可以通过手动更改设备上的日期来规避它。
    2. 使用时间服务器。通过查询时间服务器,您可以获得独立的日期时间值。存储该值并与之比较以确定是否经过了正确的时间。当然,缺点是这需要 Internet 连接才能访问功能属性。
    3. 使用系统时钟值或一系列值来粗略计算经过的时间。像 CACurrentMediaTimemach_absolute_time() 这样的函数可以提供一个计数来比较。您可以获取这些值并递增它们,直到达到指定的持续时间以重置标志以进行第二天检查。

    单独的选项都不能提供理想的解决方案,但通过组合这些方法,您可能会获得可接受的保证水平,即用户仅在允许的时间内访问信息。

    【讨论】:

    • 谢谢,是的,我也在考虑这样做。如果可能的话,我会为此创建一个 Web 服务,并从它获取本地时间的 JSOn 响应。
    • @Ashu,另一种选择可能是注册 NSSystemClockDidChangeNotification 通知。我没有对此进行测试,但如果系统时钟时间已更改,您可能会收到通知。如果是这样,您可以相应地调整您的计数器。
    猜你喜欢
    • 2012-07-15
    • 1970-01-01
    • 2011-05-10
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多