Wie ändere ich Zeit und Zeitzone im iPhone- Simulator?
Wie ändere ich Zeit und Zeitzone im iPhone- Simulator?
Antworten:
Ich vermute, es verwendet Ihre Systemzeitzone, also würde das Ändern der TZ in den Systemeinstellungen wahrscheinlich den Trick tun
Starten Sie den Simulator neu, nachdem Sie die Einstellungen für Systemdatum und -zeit geändert haben. Die Änderungen werden angezeigt. Es hat bei mir funktioniert.
Es wäre nützlich, wenn Apple ein "Datum simulieren" und ein Menü "Ort simulieren" bereitstellen würde. Ich setze einen Haltepunkt unmittelbar nach dem Abrufen des Datums (Speichern in einer Variablen) und ändere dann den Wert. Oder ändern Sie einfach die Stelle, an der ich nach einer Datumsänderung suche, und lassen Sie sie als wahr zurückgeben.
Um einen Screenshot zu machen, hat Apple es endlich möglich gemacht, die Zeit in der Statusleiste des iOS-Simulators (seit Xcode 11 ) mithilfe des simctl- Tools zu überschreiben :
xcrun simctl status_bar "iPhone Xs" override --time "21:08"
Hier ist eine Lösung, die mindestens für iOS 13 und Xcode 11 verfügbar ist. (nicht mit früheren Versionen getestet)
Standardmäßig zeigt der iOS-Simulator die Uhrzeit auf Ihrem Mac an. Sie können jedoch die Befehlszeile von Xcode verwenden, um dies mit diesem Befehl im Terminal zu überschreiben:
xcrun simctl status_bar "iPhone 11 Pro Max" override --time '9:41'
Ersetzen Sie den Simulatornamen durch das Gerät, das Sie ändern möchten.
Für die Statusleiste haben Sie folgende Überschreibungen:
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.
Die Zeit kann eine beliebige Zeichenfolge sein. Wenn das Gerät jedoch das Datum anzeigen soll, müssen Sie das ISO-Format verwenden . Eine gültige ISO-Datumszeichenfolge wäre beispielsweise "2007-01-09T10: 41: 00 + 01: 00".
Andernfalls können Sie den Parameter time als Zeichenfolge verwenden und es wird angezeigt, was Sie darin übergeben.
Mit Dank an den Originalbeitrag von Paul Hudson Hier ist der Link !
Beim Ändern der Zeitzone fand ich den einfachsten Weg, dies zu tun, indem ich auf die Uhr in der Menüleiste klickte. Wählen Sie dann "Open Date & Time Preferences" und öffnen Sie die Registerkarte Time Zone.
Alternativ Systemeinstellungen -> Datum und Uhrzeit und wählen Sie die Registerkarte Zeitzone.
Nur ein Hinweis für alle, die sich mit OSX nicht auskennen.
Dies ist ein alter Thread, aber er kommt meiner Frage am nächsten. Ich muss die Zeitzone für Europa simulieren, diese Methode funktioniert für mich. Gehen Sie zu "TimeZone" anstelle von "Date & Time". Deaktivieren Sie das Kontrollkästchen "Zeitzone automatisch anhand des aktuellen Standorts festlegen" und schieben Sie die vertikale Rechteckleiste (mit dem blauen Punkt darauf), um Ihre Systemzeit zu simulieren.
Sie können die TZ
Umgebungsvariable in einem Xcode-Schema festlegen, um die Zeitzone nur für diese App festzulegen.
Sie können verwendet werden UTC
, PST
, EST
sowie ortsbezogene Zeitzone Namen wie America/Los_Angeles
. Es ist nicht gut dokumentiert, aber ich vermute, dass jeder Zeitzonenname funktionieren sollte.
Es ist nicht gut dokumentiert, aber die Quelle ist ein Vertreter des Apple Developer Support in den Entwicklerforen .
Ich habe eine automatische Lösung für das Problem der Änderung der Zeit vorgeschlagen, die das Swizzling von Hacky-Methoden umfasst: https://stackoverflow.com/a/34793193/829338 . Ich gehe davon aus, dass dies auch funktionieren sollte, um die Zeitzone entsprechend zu ändern.
Ich musste meine App automatisch testen, was eine Änderung der Systemzeit erforderlich machte. Ich habe getan, was Tom vorgeschlagen hat: Happy Hacky Method Swizzling.
Zu Demonstrationszwecken ändere ich nur, [NSDate date]
aber nicht [NSDate dateWithTimeIntervalSince1970:]
.
Zuerst müssen Sie Ihre Klassenmethode erstellen, die als neues [NSDate-Datum] dient. Ich habe es implementiert, um die Zeit einfach um einen konstanten Zeitunterschied zu verschieben.
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];
}
Bisher ziemlich einfach. Jetzt kommt der lustige Teil. Wir erhalten die Methoden aus beiden Klassen und der Exchange-Implementierung (es hat bei mir im AppDelegate funktioniert, aber nicht in meiner UITests-Klasse). Dazu müssen Sie importieren 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);
Mein Build-Server ist UTC und einige meiner Unit-Tests benötigten die Zeitzone PST. Mithilfe einer Kategorie in NSTimeZone können Sie die Implementierung von Apple überschreiben, um Ihren Code zu verwenden. Funktioniert auch nur für schnelle Projekte.
//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
Nachdem ich die Einstellungen für Systemdatum und -zeit geändert hatte, musste ich Hardware
> wählen Reset All Content And Settings
.
Nur das hat bei mir in Version 10.3 (SimulatorApp-880.5 CoreSimulator-681.5.4) funktioniert.