2009-11-09 14 views
90

Jak zmienić strefę czasową w symulatorze iPhone?Jak zmienić czas i strefę czasową w symulatorze iPhone'a?

+0

Zmiana czasu systemowego i daty nie jest rozwiązaniem. Ma to wpływ na wszystkie aplikacje Mac, w tym znaczniki czasu xcode. Prawidłowe zachowanie polega na tym, że każda zmiana lokalizacji symulatora musi zmienić strefę czasową i czasową. Wszystkie inne rzeczy są tylko obejściem. Mam nadzieję, że Apple to naprawi. – Rudi

Odpowiedz

141

Zgaduję Wykorzystuje swoją strefę czasową systemu, więc zmieniając TZ w preferencjach systemowych prawdopodobnie rade

Screenshot for description

+0

Hmm ... Nie mam tej opcji na moim symulatorze. Na moim telefonie jest to w Ustawienia -> Ogólne -> Data i czas. Na moim symulatorze sekcja Data i czas nie istnieje. –

+5

Oh ...zmień go w preferencjach systemowych urządzenia, a nie ustawienia symulatora. Dobrze. To się udało! –

+2

Jeden problem w tym, czas Symulator jest aktualizowany po 2 mennice zmiany czasu systemowego. dowolna metoda, która jednocześnie zmienia czas symulatora ... – AsifHabib

21

Zrestartuj Simulator po zmianie ustawienia czasu i daty systemowej ujrzycie zmiany odzwierciedlone. To zadziałało dla mnie.

+93

Okropne rozwiązanie (ze strony Apple'a, nie twoja odpowiedź). Jest to dokładnie to, co symulator powinien być w stanie zrobić, jako bezpieczną alternatywę dla faktycznego zmieniania czasu systemowego i potencjalnego niszczenia rzeczy na komputerze. – devios1

+3

@devios to jest prawdziwsze niż kiedykolwiek z  Oglądaj – Lewis42

+0

@ Lewis42, co masz na myśli? –

1

Podczas zmiany strefy czasowej, znalazłem najłatwiejszy sposób, aby to zrobić, klikając zegar na pasku menu. A następnie wybierając "Otwórz datę & Preferencje czasowe", a następnie wybierz zakładkę Strefa czasowa.

Alternatywnie Preferencje systemowe -> Data i czas i wybierz zakładkę Strefa czasowa.

Po prostu wskaźnik dla każdego, kto może nie znać się na OSX.

+3

To nie jest odpowiedź, więc powinien to być komentarz. Liczba programistów iOS, którzy nie znają systemu OS X, wynosi ... zero. – phatmann

18

Przydałoby się, gdyby firma Apple dostarczyła "Simulate date", ponieważ zawierała menu "Simulate Location". To, co robię, to ustawić punkt przerwania natychmiast po uzyskaniu daty (zapisanie jej w zmiennej), a następnie zmodyfikować wartość. Lub po prostu zmodyfikuj miejsce, w którym czekam na zmianę daty i spraw, by zwracała wartość true.

1

To jest stara nitka, ale jest najbliżej mojego pytania. Muszę symulować strefę czasową w Europie, ta metoda działa dla mnie. Przejdź do "Stuknij strefę czasową" zamiast "Data & Czas" dotknij. Odznacz pole "Ustaw strefę czasową automatycznie przy użyciu bieżącej lokalizacji" i przesuń pionowy prostokąt (z niebieską kropką na nim), aby zasymulować czas systemowy.

enter image description here

2

zaproponowałem automatyczne rozwiązanie problemu zmiany czasu, który zawiera metody hacky swizzling: https://stackoverflow.com/a/34793193/829338. Zakładam, że powinno to również działać, aby odpowiednio zmienić strefę czasową.


Potrzebowałem automatycznie przetestować aplikację, która wymagała zmiany czasu systemu. Zrobiłem to, co Tom zasugerował: szczęśliwą, hackowatą metodę, która swizuje.

Do celów poglądowych zmieniam tylko [NSDate date], ale nie [NSDate dateWithTimeIntervalSince1970:].

Najpierw musisz utworzyć metodę klasy, która służy jako nowa [data NSDate]. Zaimplementowałem to, aby po prostu przesunąć czas o stały odstęp czasowy.

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]; 
} 

Do tej pory dość łatwe. Teraz zaczyna się zabawa. Dostajemy metody z obu klas i wymieniamy implementację (działało to dla mnie w AppDelegate, ale nie w mojej klasie UITests). W tym celu należy 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); 
+0

IIRC to nie zadziała dla testowania lokalnych powiadomień. –

Powiązane problemy