2012-09-27 8 views
13

मुझे कुछ परीक्षण करने की ज़रूरत है जिसमें कई दिनों के माध्यम से "फोन" पीछे और आगे बढ़ना शामिल है। मैं सिम्युलेटर पर ऐसा करना चाहता हूं। क्या कोई उपलब्ध हैक है जो मैक तिथि को बदलने के बिना, सिम्युलेटर पर बदलने की तारीख को बदलने की अनुमति देता है?क्या आईओएस सिम्युलेटर (मैक सेटिंग्स बदलने के अलावा) पर देखी गई तिथि/समय को बदलने का कोई तरीका है?

+0

मुझे यह सबसे आसान माना गया: http://stackoverflow.com/questions/1699671/how-to-change-time-and-timezone-in-iphone-simulator – Hahnemann

उत्तर

0

यदि आप कोई ऐप बना रहे हैं, तो परीक्षण के लिए ऐप में बस तारीख बदलें और इसे प्रकाशित करते समय आप इसे हटा सकते हैं।

+2

अगर आपको 20 अलग-अलग परीक्षण करने की आवश्यकता है तारीखें आपको 20 अलग-अलग समयों को दोबारा जोड़ना है। (हालांकि मुझे लगता है कि कोई तारीख को एक प्लिस्ट में डाल सकता है।) और आपके पास '[NSDate date]' या आपके कोड में समकक्ष कई स्थानों या एक मॉड्यूल में हो सकता है जिसके लिए आप स्रोत को नियंत्रित नहीं करते हैं। –

11

ऐसा लगता है कि यह बहुत कठिन है ... xcodebuild का उपयोग भवन को स्वचालित करने और स्क्रिप्ट से ऐप चलाने और systemsetup -setdate <mm:dd.yy> का उपयोग करके विभिन्न रनों के बीच दिनांक बदलने के लिए कैसे करें? फिर आपको कोड में कुछ भी बदलने की आवश्यकता नहीं होगी।

+17

बिना किसी टिप्पणी के डाउनवॉट्स बेकार हैं। – JOM

5

आप अपने चयन के मूल्य को वापस करने के लिए रनटाइम पर [NSDate date] के कार्यान्वयन को प्रतिस्थापित करने के लिए विधि swizzling का उपयोग कर सकते हैं।

विधि स्विजलिंग पर अधिक जानकारी के लिए, http://www.icodeblog.com/2012/08/08/using-method-swizzling-to-help-with-test-driven-development/ देखें।

+0

उस विचार के लिए धन्यवाद! मैंने इसे कार्यान्वित किया (नीचे जवाब देखें) –

3

मुझे अपने ऐप को स्वचालित रूप से जांचने की आवश्यकता है, जिसके लिए sys समय बदलना आवश्यक है। मैंने किया, टॉम ने क्या सुझाव दिया: खुश हैकी विधि swizzling।

प्रदर्शन-परक प्रयोजनों के लिए, मैं सिर्फ [NSDate date] नहीं लेकिन [NSDate dateWithTimeIntervalSince1970:] बदल जाते हैं।

अपनी कक्षा विधि बनाने की आपकी आवश्यकता पहले नई [NSDate date] के रूप में कार्य करती है। मैंने इसे लगातार timeDifference द्वारा समय को स्थानांतरित करने के लिए कार्यान्वित किया।

int timeDifference = 60*60*24; //shift by one day 
NSDate* (* original)(Class,SEL) = nil; 

+(NSDate*)date{ 
    NSDate* date = original([NSDate class], @selector(date)); 
    return [date dateByAddingTimeInterval:timeDifference]; 
} 

अभी तक, बहुत आसान है। अब मज़े वाला हिस्सा आया। हमें दोनों वर्गों और विनिमय कार्यान्वयन के तरीके मिलते हैं (यह मेरे लिए ऐपडिलेगेट में काम करता है, लेकिन मेरे यूआईटीएस्ट क्लास में नहीं)। इसके लिए आपको objc/runtime.h आयात करने की आवश्यकता होगी।

Method originalMethod = class_getClassMethod([NSDate class], @selector(date)); 
Method newMethod = class_getClassMethod([self class], @selector(date)); 

//save the implementation of NSDate to use it later 
original = (NSDate* (*)(Class,SEL)) [NSDate methodForSelector:@selector(date)]; 

//happy swapping 
method_exchangeImplementations(originalMethod, newMethod); 

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

+0

मुझे आपका जवाब पसंद आया लेकिन यह समझ में नहीं आया कि यह कैसे करें। क्या आप इसे विस्तार से विस्तारित कर सकते हैं? इस कस्टम + (एनएसडीएटी *) डेट क्लास विधि को कहां लिखना है? श्रेणी (विस्तार) में? कृपया इस विधि को स्रोत कोड में कहां लिखना है और इस समाधान को कार्यान्वित करने के तरीके का उपयोग करें। यह दूसरों के लिए भी काफी उपयोगी होगा जो मेरे जैसा भ्रम है। अग्रिम में धन्यवाद। –

+0

@NiteshBorad मैं बस एक फ़ाइल में सब कुछ जोड़ता हूं और फिर इसे कॉल करता हूं, यदि आपका एप्लिकेशन DEBUG मोड में लॉन्च किया गया है ('main.m' या आपके AppDelegate में किया जा सकता है)। यहां एक उदाहरण कार्यान्वयन है: https://gist.github.com/Sebastian-Hojas/01a23ccb5b1a0051997715ee5ec4862f –

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

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