objective c - ¿Cómo cambiar la hora y la zona horaria en el simulador de iPhone?
objective-c xcode (7)
¿Cómo cambio la hora y la zona horaria en el simulador de iPhone ?
Al cambiar la zona horaria, encontré que la forma más fácil de hacerlo era haciendo clic en el reloj en la barra de menú. Y luego seleccionando "Abrir Preferencias de Fecha y Hora" luego selecciona la pestaña Zona Horaria.
Alternativamente, Preferencias del sistema -> Fecha y hora, y seleccione la pestaña Zona horaria.
Solo un puntero para cualquier persona que pueda no conocer su camino en OSX.
Este es un hilo antiguo, pero está más cerca de mi pregunta. Necesito simular la zona horaria para Europa, este método funciona para mí. Ir a ''TimeZone'' toque en lugar de ''Date & Time'' toque. Desmarque la casilla ''Establecer zona horaria automáticamente usando la ubicación actual'' y deslice la barra vertical del rectángulo (con un punto azul) para simular la hora de su sistema.
He propuesto una solución automática al problema de cambiar el tiempo que incluye el método de hacky swizzling: https://.com/a/34793193/829338 . Supongo que también debería funcionar para cambiar la zona horaria en consecuencia.
Necesitaba probar mi aplicación automáticamente, lo que requería cambiar el tiempo del sistema. Lo hice, lo que Tom sugirió: feliz método hacky swizzling.
Para fines demostrativos, solo cambio [NSDate date]
pero no [NSDate dateWithTimeIntervalSince1970:]
.
Primero, debe crear su método de clase que sirva como la nueva [fecha de NSDate]. Lo implementé para simplemente cambiar el tiempo por una diferencia de tiempo constante.
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];
}
Hasta ahora, bastante fácil. Ahora viene la parte divertida. Obtenemos los métodos de ambas clases e implementación de intercambio (funcionó para mí en AppDelegate, pero no en mi clase UITests). Para esto, necesitará importar 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);
Mi servidor de compilación es UTC y algunas de las pruebas de mi unidad necesitaban que la zona horaria fuera PST. Usando una categoría en NSTimeZone, puede anular la implementación de Apple para usar su código. También funciona para proyectos veloces.
//NSTimeZone+DefaultTimeZone.h
#import <Foundation/Foundation.h>
@interface NSTimeZone (DefaultTimeZone)
+(NSTimeZone *)defaultTimeZone;
@end
//NSTimeZone+DefaultTimeZone.m
#import "NSTimeZone+DefaultTimeZone.h"
@implementation NSTimeZone (DefaultTimeZone)
+(NSTimeZone *)defaultTimeZone
{
return [NSTimeZone timeZoneWithName:@"America/Los_Angeles"];
}
@end
Reinicie el simulador después de cambiar las preferencias de fecha y hora del sistema y verá los cambios reflejados. Funcionó para mí
Sería útil si Apple proporcionara una "Fecha de simulación" ya que proporcionaba un menú "Simular ubicación". Lo que hago es establecer un punto de interrupción inmediatamente después de obtener la fecha (guardarla en una variable) y luego modificar el valor. O simplemente modifique el lugar donde verifico el cambio de fecha y haga que sea verdadero.
Supongo que usa la zona horaria de tu sistema, por lo que cambiar el TZ en Preferencias del sistema probablemente sea el truco