Установить дату / время iPhone в приложении для тестирования?

У меня есть много функций в моем приложении, которые зависят от даты / времени (например, "если дата равна x, показать y). Я использую [NSDate date], чтобы получить текущую дату / время пользователя. Я могу проверить функциональность вручную изменяя дату / время на моем iPhone, но мне интересно, есть ли способ программно перезаписать текущее время, чтобы я мог тестировать в симуляторе и быстрее.

4 ответа

Решение

Вы можете создавать объекты NSDate с любой желаемой датой / временем. Просто запустите свой код через метод, чтобы получить "текущее" время, и внутри этого метода либо верните реальную дату производства или какую-либо дату по вашему выбору для тестирования.

Другой способ сделать это - предоставить пользовательскую реализацию даты +(NSDate *). Вы можете использовать этот метод класса, используя JRSwizzle. Сделайте небольшую категорию для NSDate:

static NSTimeInterval seconds = 1300000000;

@interface NSDate (Fixed)
   + (NSDate *)fixedDate;
@end

@implementation NSDate (Fixed)
+ (NSDate *)fixedDate
{
  return [NSDate dateWithTimeIntervalSince1970:seconds];
}
@end

Затем в коде, где вы хотите иметь фиксированную дату, сделайте следующее:

NSError *error;
[NSDate jr_swizzleClassMethod:@selector(date) withClassMethod:@selector(fixedDate) error:&error];
NSLog(@"Date:%@", [NSDate date]);

Журнал распечатывает это:

2011-09-01 11:35:27.844 tests[36597:10403] Date:2011-03-13 07:06:40 +0000

Создать категорию на NSDate и переопределить +[NSDate date] метод

+ (instancetype)date
{
  return [NSDate dateWithTimeIntervalSince1970:100000]; // Replace with any date you want
}

dateByAddingTimeInterval:

Возвращает новый объект NSDate, для которого задано указанное количество секунд относительно получателя.

- (id)dateByAddingTimeInterval:(NSTimeInterval)seconds

Параметры секунд Количество секунд, добавляемых к получателю. Используйте отрицательное значение в течение нескольких секунд, чтобы возвращаемый объект указывал дату перед получателем. Возвращаемое значение Новый объект NSDate, для которого заданы секунды-секунды относительно получателя. Возвращенная дата может иметь представление, отличное от получателя.

источник: документация:p

Другие вопросы по тегам