2012-01-31 15 views
18

मैं एक ऐप विकसित कर रहा हूं जिसका उपयोग केवल दिन के एक निश्चित समय के दौरान किया जा सकता है। मुझे स्थानीय डिवाइस का समय नहीं मिल रहा है क्योंकि उपयोगकर्ता डिवाइस के समय को आसानी से बदल सकता है जिससे दिन के किसी भी समय एप्लिकेशन तक पहुंच की इजाजत मिलती है।ऐप्पल सर्वर से दिनांक और समय प्राप्त करें

क्या ऐप्पल सर्वर से वर्तमान दिनांक और समय प्राप्त करने का कोई तरीका है (या यदि नहीं,) क्या कोई अन्य तरीका है?

+1

यदि आपने एक या अन्य समाधान का उपयोग किया है, तो कृपया पसंदीदा उत्तर का चयन करें ;-) –

+0

क्या आपने यह तथ्य माना है कि उपयोगकर्ता हवाई जहाज मोड चालू कर सकता है और फिर दिनांक और समय बदल सकता है? – Mahouk

उत्तर

11

मुझे लगता है कि आपको इंटरनेट टाइम सर्वर का उपयोग करना चाहिए। वे NTP नामक मानकीकृत प्रोटोकॉल का उपयोग कर रहे हैं। आईओएस में built-in support for reading NTP server time है, लेकिन यह आपके लिए एप्लिकेशन डेवलपर के रूप में उपलब्ध नहीं है। या तो आप इसे स्वयं लागू करते हैं, या आप शायद ios-ntp या HS NTP जैसे ओपन सोर्स लाइब्रेरी का उपयोग कर सकते हैं। मैंने उनमें से किसी का भी उपयोग नहीं किया है। असली बुलेटप्रूफ समाधान प्राप्त करने के लिए डिवाइस की स्थिति की जांच करना और टाइमज़ोन को समझना शायद एक अच्छा विचार है।

यहां आप सर्वर और सामान के बारे में अधिक पढ़ सकते हैं; NIST Internet Time Service

आदर्श रूप से, आपके पास एप्लिकेशन में सर्वर की एक सूची होनी चाहिए। यदि उनमें से कोई विफल रहता है, तो आप सूची में अगला एनटीपी सर्वर कॉल करते हैं।

+0

लगता है जीडी बहुत धन्यवाद !! – kraitz

+0

@ क्राइट्स मुझे एक ओपन सोर्स कार्यान्वयन मिला जो आप शायद उपयोग कर सकते हैं। जवाब तदनुसार अद्यतन किया जाता है। –

+0

आईओएस-एनटीपी में बहुत अधिक विक्रेता का कोड शामिल है। और कक्षा के नाम परियोजना में शामिल करने के लिए बहुत अच्छे नहीं हैं। – 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 फ़ाइल होस्ट करने के लिए है जो वर्तमान दिनांक समय प्रिंट करता है। उपरोक्त कोड टेक्स्ट पढ़ेगा और एनएसडीएट के रूप में वापस आ जाएगा। यदि मैं ग़लत नहीं हूँ तो। – kraitz

1

आपको लगता है कि खुले स्रोत का उपयोग डिफ़ॉल्ट एनटीपी सर्वर से समय प्राप्त करने के लिए कर सकते हैं, या अपने सर्वर चुनें: https://github.com/huynguyencong/NHNetworkTime

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

और उपयोग:

NSDate *networkDate = [NSDate networkDate]; 
0

करन के जवाब कुछ लेखन-त्रुटियों, और यह भी विफल रहा था सिर्फ "शून्य" के बजाय "0" की प्रतिक्रिया की जांच करने के लिए। (मैंने इसे अपने ऐप में कार्यान्वित किया और मुझे कमजोर कनेक्शन या अनधिकृत नेटवर्क से कई झूठे पॉजिटिव मिले।)

मैंने इसे नीचे अनुकूलित कर लिया है, और उन लोगों के लिए संबंधित सर्वर कोड जोड़ा है जो नहीं जानते कि करण किस बात का जिक्र कर रहे थे सेवा मेरे। यह एक 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
आपके सर्वर 'के रूट फ़ोल्डर में संग्रहीत है

मेरा मानना ​​है कि आपकी आवश्यकता कुछ वेब सेवाओं से मिल सकती है जो जेसन डेटा लौटाती हैं।

उनमें से एक 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 कक्षा का उपयोग कर सकते हैं।

संबंधित मुद्दे