有没有什么办法来改变所看到在iOS模拟器(不是改变Mac的设置等)的日期/时间?(Is there

2019-08-01 00:05发布

我需要做一些测试,这包括通过几天向前和向后移动的“手机”。 我想这样做的模拟器。 是否有任何可用的hack允许所看到模拟器上进行更改,而无需更改MAC日期的日期?

Answer 1:

看起来这是非常艰难......如何使用xcodebuild进行自动构建和运行应用程序从一个脚本,并使用systemsetup -setdate <mm:dd.yy>更改日期的不同运行之间? 然后,你就不需要改变任何代码。



Answer 2:

您可以使用方法交叉混合,以取代实施[NSDate date]在运行时来回报您选择的值。

有关方法混写的详细信息,请参阅http://www.icodeblog.com/2012/08/08/using-method-swizzling-to-help-with-test-driven-development/ 。



Answer 3:

我需要自动测试我的应用程序,这需要改变SYS时间。 我做了,有什么建议汤姆:快乐哈克方法交叉混合。

为了便于说明,我只能改变[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);

显然,要确保你使用的这种非在你部署的应用程序。 最后,我只能答案同意之前,这是很值得怀疑,为什么苹果没有为此增加了原生支持。



Answer 4:

如果您正在创建一个应用程序,只需更改日期的应用程序进行测试,当你发布它,你可以将其删除。



文章来源: Is there any way to change the date/time as seen on the iOS simulator (other than changing Mac settings)?