Jak zmienić czas i strefę czasową w symulatorze iPhone'a ?
Jak zmienić czas i strefę czasową w symulatorze iPhone'a ?
Odpowiedzi:
Domyślam się, że używa strefy czasowej systemu, więc zmiana TZ w Preferencjach systemowych prawdopodobnie załatwi sprawę
Uruchom ponownie Symulator po zmianie systemowych preferencji dotyczących daty i czasu, a zmiany zostaną odzwierciedlone. U mnie to zadziałało.
Byłoby użyteczne, gdyby firma Apple udostępniła opcję „Symuluj datę”, ponieważ udostępniła menu „Symuluj lokalizację”. To, co robię, to ustawienie punktu przerwania natychmiast po pobraniu daty (zapisaniu jej w zmiennej), a następnie zmodyfikowanie wartości. Lub po prostu zmodyfikuj miejsce, w którym sprawdzam zmianę daty, i spraw, by zwróciło prawdę.
W celu wykonania zrzutu ekranu Apple wreszcie umożliwiło nadpisanie czasu na pasku stanu symulatora iOS (od Xcode 11 ) za pomocą narzędzia simctl :
xcrun simctl status_bar "iPhone Xs" override --time "21:08"
Oto rozwiązanie dostępne przynajmniej z iOS 13 i Xcode 11. (nie testowano z poprzednimi wersjami)
Domyślnie symulator iOS pokazuje godzinę na komputerze Mac, jednak możesz użyć wiersza poleceń Xcode, aby zastąpić to tym poleceniem w terminalu:
xcrun simctl status_bar "iPhone 11 Pro Max" override --time '9:41'
Zastąp nazwę symulatora urządzeniem, które chcesz zmienić.
W przypadku paska stanu masz następujące nadpisania:
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.
Czas może być dowolnym ciągiem. Ale jeśli chcesz, aby urządzenie wyświetlało datę, użyj formatu ISO . Na przykład prawidłowy ciąg daty ISO to „2007-01-09T10: 41: 00 + 01: 00”
W przeciwnym razie możesz użyć parametru czasu jako ciągu, a wyświetli on wszystko, co w nim przekażesz.
Z podziękowaniami dla oryginalnego posta Paula Hudsona Oto link !
Zmieniając strefę czasową, znalazłem najłatwiejszy sposób, aby to zrobić, klikając zegar na pasku menu. A następnie wybierając „Otwórz preferencje daty i czasu”, a następnie wybierz zakładkę Strefa czasowa.
Alternatywnie Preferencje systemowe -> Data i godzina i wybierz zakładkę Strefa czasowa.
To tylko wskazówka dla każdego, kto nie zna OSX.
To stary wątek, ale najbliższy mojemu pytaniu. Muszę zasymulować strefę czasową dla Europy, ta metoda działa dla mnie. Wybierz „Strefa czasowa” zamiast „Data i godzina”. Odznacz pole „Ustaw strefę czasową automatycznie, używając bieżącej lokalizacji” i przesuń pionowy prostokątny pasek (z niebieską kropką), aby zasymulować czas systemowy.
Możesz ustawić TZ
zmienną środowiskową w schemacie Xcode, aby ustawić strefę czasową tylko dla tej aplikacji.
Można użyć UTC
, PST
, EST
jak również nazwy strefy czasowej miejsce na bazie takich jak America/Los_Angeles
. Nie jest to dobrze udokumentowane, ale podejrzewam, że każda nazwa strefy czasowej powinna działać.
Nie jest dobrze udokumentowany, ale źródłem jest przedstawiciel Apple Developer Support na forach dla programistów .
Zaproponowałem automatyczne rozwiązanie problemu zmiany czasu, które obejmuje hacky swizzling metod: https://stackoverflow.com/a/34793193/829338 . Zakładam, że powinno to również zadziałać przy odpowiedniej zmianie strefy czasowej.
Musiałem automatycznie przetestować moją aplikację, co wymagało zmiany czasu sys. Zrobiłem to, co zasugerował Tom: wesoła, hakerska metoda.
W celach demonstracyjnych zmieniam tylko, [NSDate date]
ale nie [NSDate dateWithTimeIntervalSince1970:]
.
Najpierw musisz utworzyć metodę klasy, która będzie służyć jako nowa [NSDate date]. Zaimplementowałem to, aby po prostu przesunąć czas o stałą różnicę czasu.
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];
}
Jak dotąd całkiem proste. Teraz zaczyna się zabawa. Metody pobieramy z obu klas i implementacji wymiany (u mnie zadziałało w AppDelegate, ale nie w mojej klasie UITests). W tym celu musisz zaimportować 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);
Mój serwer kompilacji to UTC, a niektóre z moich testów jednostkowych wymagały strefy czasowej PST. Korzystając z kategorii w NSTimeZone, możesz zastąpić implementację Apple, aby używać swojego kodu. Działa również w przypadku szybkich projektów.
//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
Po zmianie systemowych preferencji dotyczących daty i czasu musiałem wybrać Hardware
> Reset All Content And Settings
.
Tylko to działało dla mnie w wersji 10.3 (SimulatorApp-880.5 CoreSimulator-681.5.4).