¿Cómo cambio la hora y la zona horaria en el simulador de iPhone ?
¿Cómo cambio la hora y la zona horaria en el simulador de iPhone ?
Respuestas:
Supongo que usa la zona horaria de su sistema, por lo que cambiar la TZ en las Preferencias del Sistema probablemente sería el truco.
Reinicie el simulador después de cambiar las preferencias de fecha y hora del sistema y verá reflejados los cambios. Funcionó para mi.
Sería útil si Apple proporcionara una "Fecha de simulación" ya que proporcionaba un menú de "Simular ubicación". Lo que hago es establecer un punto de interrupción inmediatamente después de obtener la fecha (guardarlo en una variable) y luego modificar el valor. O simplemente modifique el lugar donde verifico un cambio de fecha y haga que regrese verdadero.
Con el fin de tomar una captura de pantalla, Apple finalmente hizo posible anular el tiempo en la barra de estado del simulador de iOS (desde Xcode 11 ) usando la herramienta simctl :
xcrun simctl status_bar "iPhone Xs" override --time "21:08"
Aquí hay una solución disponible de iOS 13 y Xcode 11 al menos. (no probado con versiones anteriores)
De forma predeterminada, el simulador de iOS muestra el tiempo que esté en su Mac, sin embargo, puede usar la línea de comando de Xcode para anular eso con este comando en la terminal:
xcrun simctl status_bar "iPhone 11 Pro Max" override --time '9:41'
Reemplace el nombre del simulador con el dispositivo que desea cambiar.
Para la barra de estado, tiene esta anulación:
You may specify any combination of these flags (at least one is required):
--time <string>
Set the date or time to a fixed value.
If the string is a valid ISO date string it will also set the date on relevant devices.
--dataNetwork <dataNetworkType>
If specified must be one of 'wifi', '3g', '4g', 'lte', 'lte-a', or 'lte+'.
--wifiMode <mode>
If specified must be one of 'searching', 'failed', or 'active'.
--wifiBars <int>
If specified must be 0-3.
--cellularMode <mode>
If specified must be one of 'notSupported', 'searching', 'failed', or 'active'.
--cellularBars <int>
If specified must be 0-4.
--batteryState <state>
If specified must be one of 'charging', 'charged', or 'discharging'.
--batteryLevel <int>
If specified must be 0-100.
El tiempo puede ser cualquier cadena. Pero si desea que el dispositivo muestre la fecha, deberá usar el formato ISO . Por ejemplo, una cadena de fecha ISO válida sería '2007-01-09T10: 41: 00 + 01: 00'
De lo contrario, puede usar el parámetro de tiempo como una cadena y mostrará lo que pase en él.
Gracias a la publicación original de Paul Hudson. ¡Aquí está el enlace !
Puede establecer la TZ
variable de entorno en un Esquema Xcode para establecer la zona horaria solo para esa aplicación.
Se puede utilizar UTC
, PST
, EST
, así como los nombres de zona horaria basados en el lugar, tales como America/Los_Angeles
. No está bien documentado, pero sospecho que cualquier nombre de zona horaria debería funcionar.
No está bien documentado, pero la fuente es un representante de Apple Developer Support en los foros de desarrolladores .
Al cambiar la zona horaria, encontré que la forma más fácil de hacerlo era haciendo clic en el reloj de la barra de menú. Y luego seleccionando "Abrir preferencias de fecha y hora" y luego seleccione la pestaña Zona horaria.
Alternativamente, Preferencias del sistema -> Fecha y hora y seleccione la pestaña Zona horaria.
Solo un puntero para cualquiera que no conozca OSX.
Este es un hilo viejo pero está más cerca de mi pregunta. Necesito simular la zona horaria de Europa, este método funciona para mí. Vaya al toque 'TimeZone' en lugar del toque 'Fecha y hora'. Desmarque la casilla 'Establecer zona horaria automáticamente usando la ubicación actual' y deslice la barra de rectángulo vertical (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 hacky swizzling: https://stackoverflow.com/a/34793193/829338 . Supongo que eso 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.
Con fines demostrativos, solo cambio [NSDate date]
pero no [NSDate dateWithTimeIntervalSince1970:]
.
Primero, necesita crear su método de clase que sirva como la nueva [fecha 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 y la implementación de intercambio (funcionó para mí en AppDelegate, pero no en mi clase UITests). Para esto necesitarás 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. Funciona solo para proyectos rápidos.
//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
Después de cambiar las preferencias de fecha y hora del sistema, tuve que elegir Hardware
> Reset All Content And Settings
.
Solo esto funcionó para mí en la versión 10.3 (SimulatorApp-880.5 CoreSimulator-681.5.4).