2012-09-27 39 views

回答

0

如果您要創建應用程序,只需更改應用程序中的日期以進行測試,並在發佈時刪除它。

+2

除了如果你需要在20個不同的測試日期你必須重新編譯20個不同的時間。 (雖然我認爲可以把日期放入plist中)。而且你可能有'[NSDate date]'或者等價於代碼中的幾個地方,或者你不能控制源代碼的模塊。 –

11

看起來像是非常艱難...如何使用xcodebuild來自動構建和運行應用程序,並使用systemsetup -setdate <mm:dd.yy>在不同運行之間更改日期?那麼你不需要改變任何代碼。

+17

沒有任何評論的Downvotes是相當無用的。 – JOM

3

我需要自動測試我的應用程序,這需要更改系統時間。我做了,湯姆建議:快樂的哈克方法攪拌。

爲了說明性的目的,我只更改了[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]; 
} 

到目前爲止,很容易。有趣的來了。 我們從兩個類和交換實現中獲得方法(它在AppDelegate中爲我工作,但不在我的UITests類中)。爲此,您需要導入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

我喜歡你的答案,但不明白如何做到這一點。你能詳細說明一下嗎?在哪裏寫這個自定義+(NSDate *)日期類方法?在類別(擴展)?請提及在源代碼中寫入此方法的位置以及如何使用然後實現此解決方案。這對於和我一樣困惑的其他人也是非常有用的。提前致謝。 –

+0

@NiteshBorad我只是在一個文件中添加所有內容,然後調用它,如果你的應用程序以DEBUG模式啓動(可以在'main.m'或你的AppDelegate中完成)。以下是一個示例實現:https://gist.github.com/Sebastian-Hojas/01a23ccb5b1a0051997715ee5ec4862f –

相關問題