2012-07-10 18 views
24

द्वारा बदला नहीं जा सकता है। मैं एक ऐसी प्रणाली तैयार करने की कोशिश कर रहा हूं जहां वास्तविक समय की घटनाएं होती हैं और मैं उन्हें घड़ी में सिंक्रनाइज़ करना चाहता हूं। [NSDate date] सामान्य रूप से ठीक होगा लेकिन उपयोगकर्ता इसे बदल सकता है और सिस्टम को धोखा दे सकता है। मुझे बस एक घड़ी है कि मैं सापेक्ष समय ले सकता हूं (उदाहरण के लिए 64-बिट काउंटर) - मुझे पूर्ण समय (या दिन का समय आदि) की आवश्यकता नहीं है।क्या आईओएस में एक घड़ी है जिसका प्रयोग किया जा सकता है जिसे उपयोगकर्ता

क्या ऐसी कोई एपीआई मैं उपयोग कर सकता हूं?

संपादित करें: मैं यह भी जोड़ना चाहूंगा कि इस घड़ी को एप्लिकेशन के सत्रों पर लगातार होना चाहिए।

+0

अंगूठे का नियम है: "यदि यह उपयोगकर्ता के उपकरण पर है, वह इसके साथ छेड़छाड़ न कर सके।" यह 100% सच नहीं हो सकता है, लेकिन यह बहुत करीब है। – Almo

+0

फिर भी, एक निम्न-स्तर, लगातार घड़ी होना चाहिए (भले ही सार्वजनिक एपीआई के माध्यम से पहुंच योग्य न हो)। यदि नहीं, डिवाइस चालू होने पर समय को कैसे जानता है? यदि आप उसमें टैप कर सकते हैं, तो आप कम से कम सत्रों के बीच सापेक्ष सेकंड प्राप्त कर सकते हैं। –

+0

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

उत्तर

6

यदि आपको आवश्यकता है तो घटनाओं को मापने के लिए एक घड़ी घड़ी है, आप केवल मौजूदा सिस्टम अपटाइम एला clock_gettime(CLOCK_MONOTONIC) प्राप्त कर सकते हैं। यदि डिवाइस को पुनरारंभ करना एक समस्या है, तो केवल अंतिम मान का उपयोग करें और अगले लॉन्च पर अंतिम सहेजे गए मान को ऑफ़सेट के रूप में उपयोग करें। यहां समस्या यह हो सकती है कि अगर वे वास्तव में डिवाइस बंद कर देते हैं, तो वह उस समय की गणना नहीं करेगा। लेकिन यदि आप उपयोगकर्ता को समय तेज करने के बारे में चिंतित हैं, तो वे ऐसा नहीं कर सकते हैं, केवल इसे धीमा कर दें।

+1

क्या 'clock_gettime (CLOCK_MONOTONIC) 'के लिए कोई दस्तावेज़ हैं? मैंने पाया [यह] (http://www.qnx.com/developers/docs/6.5.0/index.jsp?topic=%2Fcom.qnx.doc.neutrino_lib_ref%2Fc%2Fclock_gettime.html)। मैंने '' को आयात/आयात करने का प्रयास किया, लेकिन एक्सकोड अभी भी 'CLOCK_MONOTONIC' को नहीं पहचानता है और मुझे' clock_gettime() 'की अंतर्निहित परिभाषा का आरोप लगाता है। – JohnK

+0

@EdMarty यह पता लगाने का कोई तरीका है कि डिवाइस को पुनरारंभ किया गया है या नहीं? –

+0

बाहरी स्रोत (और फिर भी, मैन-इन-द-बीच, ब्लाह, ब्लाह, ब्लाह) का उपयोग करके समय का ट्रैक रखने के बिना * बिल्कुल * निश्चित होने का कोई तरीका नहीं है। उस ने कहा, आप ट्रैक कर सकते हैं कि डिवाइस बूट होने के बाद डिवाइस कितनी देर चल रहा है (एक गूढ़ sysctl कॉल का उपयोग कर)। यदि यह कम है, तो आप निश्चित रूप से जानते हैं कि पिछली बार चेक आउट होने के बाद से इसे रीसेट कर दिया गया है। नोट: आप mach_absolute_time() का उपयोग नहीं करना चाहते हैं, क्योंकि डिवाइस सोते समय वास्तव में रुक जाता है। बूट समय प्राप्त करना: http://stackoverflow.com/questions/10331020/get-the-boot-time-in-objective-c –

1

घड़ी का प्राप्त करने के लिए एक एनटीपी सर्वर का उपयोग करने का एकमात्र विचार है, लेकिन नेटवर्क कनेक्टिविटी की आवश्यकता होगी।

+0

हां, मैं इससे बचने की उम्मीद कर रहा था। – Cthutu

+0

और उपयोगकर्ता द्वारा धोखा देने के लिए नकली घड़ी के समय के लिए पर्याप्त निर्धारित उपयोगकर्ता आपके एनटीपी सर्वर को नकली भी बना सकता है। – JeremyP

+3

निश्चित रूप से वे कर सकते हैं, लेकिन यह उपयोगकर्ता नियंत्रण पैनलों में दिनांक/समय सेटिंग्स के साथ गड़बड़ करने पर परिष्कार में एक महत्वपूर्ण छलांग है। मेरे पास ऐसे दोस्त हैं जो कम से कम तकनीकी नहीं हैं, जिन्होंने यह पता लगाया है कि वे इस तरह से गेम धोखा दे सकते हैं (या शायद वे इसके बारे में ऑनलाइन पढ़ सकते हैं), लेकिन यह करना वास्तव में आसान है। इन लोगों को यह नहीं पता होगा कि एनटीपी में सर्वर को खराब करने की प्रेरणा या क्षमता कितनी कम थी, भले ही यह एक अनुभवी हैकर के लिए आसान हो। – Suboptimus

3

मुझे क्या पता है, सही समय पाने के लिए कोई और तरीका नहीं है। मैं एनटीपी का उपयोग करूंगा।

नेटवर्क समय प्रोटोकॉल (NTP) पैकेट स्विचिंग, चर-विलंबता डाटा नेटवर्क पर कंप्यूटर प्रणालियों के घड़ियों सिंक्रनाइज़ करने के लिए एक नेटवर्किंग प्रोटोकॉल है। अधिक: http://en.wikipedia.org/wiki/Network_Time_Protocol

एक परियोजना में मैं का उपयोग करने के लिए जा रहा हूँ एनटीपी (कल मैं quess), लेकिन मैं पहले से ही कुछ शोध किया:

आईओएस पुस्तकालय:https://github.com/jbenet/ios-ntp - लेखक नोट्स: कार्यान्वयन उन आरएफसी में वर्णित एक कठोर नहीं है क्योंकि लक्ष्य एक दूसरे में समय सटीकता में सुधार करना था, मिलीसेकंड के अंशों के लिए नहीं।

पर गैर वाणिज्यिक परियोजना देखने के लिए: www.packages.ubuntu.com/source/lucid/ntp

सी पुस्तकालय: www.hillstone-software.com/hs_ntp_details.htm

प्रलेखन: www.nist.gov/pml/div688/grp40/its.cfm

5

मुझे लगता है कि mach_absolute_time() आप जो चाहते हैं वह हो सकता है। यहां बहुत सारी जानकारी है: http://developer.apple.com/library/mac/#qa/qa1398/_index.html

यह मूल रूप से डिवाइस शुरू होने के बाद से टिकों की संख्या का एक काउंटर है। यह रीबूट पर रीसेट हो जाएगा लेकिन इसके अलावा यह एक monotonically बढ़ती काउंटर है।

आप काउंटर के आखिरी मूल्य को रख सकते हैं और अगर काउंटर में पिछली बार कमी आई है (डिवाइस को पुनरारंभ किया गया है) तो इससे निपटें। इस मामले में आप आखिरी सत्र में अंतिम ज्ञात मान जोड़ सकते हैं ताकि कम समय बीतने के लिए, जो भी आप खो देंगे, वह आखिरी सत्र और डिवाइस बंद होने के बीच का समय होगा, आप बीच का समय रखेंगे रीबूट और अगले सत्र हालांकि।

+0

उन्हें सत्रों में लगातार घड़ी की आवश्यकता होती है, इसलिए यह मदद नहीं करेगा। – Almo

+0

mach_absolute_time() केवल डिवाइस के रीबूट पर रीसेट है। – hypercrypt

+0

काउंटर शायद कम नहीं हो सकता है यदि आप उस परिदृश्य की कल्पना करते हैं जहां उपयोगकर्ता आईफोन रीसेट करता है, गेम खेलता है और उसे 5 मिनट बाद बंद कर देता है, फिर फिर से आईफोन रीसेट करता है और 5 मिनट के बाद गेम चलाता है। लेकिन यह सबसे विश्वसनीय तरीका प्रतीत होता है - मैं बस समय खो देता हूं लेकिन तेज़ नहीं होता। – Cthutu

9

आईफोन पर सबसे अच्छा monotonically बढ़ती संख्या mach_absolute_time() है जो अंतिम रीबूट के बाद से CPU टिक की गिनती है। यदि आप इसे किसी भी कारण से सेकेंड में पसंद करेंगे, तो इसे आसानी से CACurrentMediaTime() के साथ लाया जाता है।

"हमेशा वृद्धि" बनाने के लिए इसका उपयोग करना बहुत आसान है। पहले लॉन्च पर, जहां चाहें मौजूदा मूल्य को स्टोर करें। जब आप बाहर निकलते हैं, और समय-समय पर, ऑफसेट को उस मान से बचाते हैं।जब आप पुनरारंभ करते हैं, तो वर्तमान मान की जांच करें; यदि यह आपके पिछले बेस मान से कम है, तो अपने मूल मूल्य को प्रतिस्थापित करें (रीबूट किया गया है)।

जब तक आप सर्वर पर कुछ स्टोर नहीं करते हैं, तब तक यह सब आपके ऐप को हटाकर साफ़ किया जा सकता है।

ध्यान दें कि इसे एक मजबूत सुरक्षा उपाय के रूप में उपयोग नहीं किया जा सकता है। अधिकृत उपयोगकर्ता को फोर्जिंग अनुरोधों से रोकने का कोई तरीका नहीं है। तो "सिस्टम को धोखा" से आपका क्या मतलब है, इस पर निर्भर करता है कि यह एक हल करने योग्य समस्या नहीं हो सकती है। सबसे अच्छा आप कर सकते हैं हैक की तलाश और उनके साथ काम करने के लिए लगातार परिश्रम है।

+0

बस ध्यान देने के लिए, यह जांचना कि मूल्य कम है या नहीं, निश्चित रूप से कुछ नहीं कहता है कि रीबूट किया गया है या नहीं। उपयोगकर्ता रीबूट हो सकता है तो आखिरी दर्ज की गई टिक से अधिक इंतजार कर सकता था। – Gukki5

6

मैं अपने अनुप्रयोग में इस का उपयोग कर रहा

+ (NSDate *) getAWSDate 
{ 
    NSDate *today = nil; 
    NSString *dateString = nil; 

    NSString *awsURL = @"http://s3.amazonaws.com"; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:awsURL]]; 
    [request setHTTPMethod:@"HEAD"]; 

    NSHTTPURLResponse *response; 
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error: NULL]; 

    if ([response respondsToSelector:@selector(allHeaderFields)]) { 
     dateString = [[response allHeaderFields] objectForKey:@"Date"]; 
     dateString = [dateString stringByReplacingOccurrencesOfString:@"GMT" withString:@"+0000"]; 
     NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
    df.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss z"; 
    df.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]; 
    df.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; 
    today = [df dateFromString:dateString]; 
    [df release];  
    }   
    return today; 
} 
+0

कोड के लिए धन्यवाद। यदि मैं एक समय सर्वर का उपयोग करने का फैसला करता हूं तो मैं इसका उपयोग करूंगा। फिलहाल मैं नेटवर्क कनेक्टिविटी से बचने की कोशिश कर रहा हूं। – Cthutu

+0

अजीब चीज। मुझे इस कोड के साथ आईपैड एयर पर "(शून्य)" मिल रहा है। एक पुराने आईपैड (तीसरा जीन) और सिम्युलेटर के साथ, यह काम करता है! आईओएस 8.0.2 दोनों चल रहे हैं। कोई विचार? – tomDev

+0

एस 3 इस हफ्ते नीचे कैसे चला गया? –

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

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