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

143

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

Rahul Vyas
źródło
zmiana czasu i daty systemowej 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ć czas i strefę czasową. Wszystkie inne rzeczy są tylko obejściem. Mam nadzieję, że Apple naprawi to jak najszybciej
Rudi

Odpowiedzi:

214

Domyślam się, że używa strefy czasowej systemu, więc zmiana TZ w Preferencjach systemowych prawdopodobnie załatwi sprawę

Zrzut ekranu do opisu

nduplessis
źródło
1
Hmm ... Nie mam tej opcji w moim symulatorze. Na moim telefonie jest w Ustawieniach -> Ogólne -> Data i czas. W moim symulatorze sekcja Data i godzina nie istnieje.
Vito Andolini
6
Och ... zmień to w preferencjach systemowych swojego komputera, a nie w ustawieniach symulatora. Dobrze. To się udało!
Vito Andolini
2
jeden problem w tym, czas Symulatora jest aktualizowany po 2 minutach zmiany czasu systemowego. dowolna metoda, która jednocześnie zmienia czas symulatora ....
AsifHabib
1
Zmieniłem czas Maca i czas symulatora się nie zmienił, sprawdzałem czy zrobiłem właściwe kroki, zmienił się czas symulatora. Więc doszedłem do wniosku, że czas symulatora jest aktualizowany po 10 do 15 sekundach, ale dla mnie to jest w porządku. @JPK Nie znam problemu z Twoim systemem, najlepiej wydrukować pełne dzienniki czasu i sprawdzić gdzie jest problem.
AsifHabib
2
Zmień czas systemowy Maca, a następnie uruchom ponownie symulator.
John Wong,
41

Uruchom ponownie Symulator po zmianie systemowych preferencji dotyczących daty i czasu, a zmiany zostaną odzwierciedlone. U mnie to zadziałało.

Vishal Shah
źródło
170
Straszne rozwiązanie (ze strony Apple, nie twoja odpowiedź). To jest dokładnie to, co symulator powinien być w stanie zrobić, jako bezpieczną alternatywę dla faktycznej zmiany czasu systemowego i potencjalnego zepsucia rzeczy na komputerze.
devios1
3
@devios jest to bardziej prawdziwe niż kiedykolwiek dzięki  Watch
lewis
@ Lewis42, co masz na myśli?
Iulian Onofrei
2
@lulian tylko, że jest nowe urządzenie do wskazywania czasu, ale nadal musisz się tak bawić, aby przetestować strefy czasowe. to był komentarz do odrzucenia, byłem sfrustrowany! :)
lewis
To prawda, @ Lewis42. Grzebanie w czasie systemowym w telefonie naprawdę psuje takie rzeczy, jak dane o ruchu na zegarku Apple Watch. Sprawia, że ​​testowanie jest problematyczne, jeśli zależy Ci na danych w zegarku.
James White
35

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ę.

LevinsonTechnologies
źródło
Żeby to była lepsza odpowiedź: jak to modyfikujesz? Dodajesz do niego interwał? Czy możesz udostępnić jakiś kod?
Kochanie
Możesz to zrobić teraz, tutaj stackoverflow.com/a/62155632/2025766 dowiesz się, jak to zrobić
Fede Henze
10

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"
tadija
źródło
5
Myślę, że to tylko przesłania pasek stanu (na potrzeby zrzutu ekranu). Ale nie wpłynie to na wynik API czasu / daty.
Roun
7

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ć.

zrzut ekranu czasu iPhone'a

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 !

tłumy
źródło
1
Bardzo fajna możliwość, ale nie pozwala tak naprawdę zmienić strefy czasowej do testowania funkcjonalności aplikacji w innej strefie czasowej. Podczas używania np. Xcrun simctl status_bar "iPad Pro (11-calowy)" override --time '2020-01-12T10: 41: 00-06: 00' konwertuje ten czas na moją aktualną strefę czasową CET i ustawia czas symulatora iOS na 5 : 41pm
randomcontrol
1
Dla wyjaśnienia: chciałbym sprawdzić, jak moja aplikacja reaguje, gdy użycie przenosi się do innej strefy czasowej.
randomcontrol
Masz rację, dotyczy to tylko paska stanu, właśnie zrobiłem test wypisując aktualny czas na ekranie i nie zmieniło to czasu systemowego symulowanego urządzenia tylko wyświetlacz na górze. Zredagowałem swój post, aby to odzwierciedlić. Dzięki
tłumy
5

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.

Lasse
źródło
6
To nie jest odpowiedź, więc powinien to być komentarz. Liczba programistów iOS, którzy nie znają OS X, wynosi ... zero.
phatmann
5

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.

wprowadź opis obrazu tutaj

O mój
źródło
4

Możesz ustawić TZzmienną środowiskową w schemacie Xcode, aby ustawić strefę czasową tylko dla tej aplikacji.

Zarządzaj schematami

Można użyć UTC, PST, ESTjak 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 .

robmathers
źródło
2
Dlaczego to głosowanie w dół? To była jedyna rzecz, która tak naprawdę działała dla mnie.
Jacob Rohde
To naprawdę czyste rozwiązanie. Jest to również świetne, jeśli chcesz przetestować wiele różnych stref czasowych: dodaj ustawienie TZ dla każdej z nich, ale pamiętaj, aby wybierać tylko jedną naraz. Właśnie dodałem Ameryka / Chicago, Europa / Stambuł, Azja / Hong_Kong i Pacyfik / Honolulu, aby uzyskać asortyment, dzięki czemu mogę wyśledzić błąd zależny od strefy czasowej. To NIE zadziała, jeśli musisz robić zrzuty ekranu lub pracować z wieloma aplikacjami, ale jest to bardzo szybki sposób przełączania się między wieloma strefami czasowymi w celu przetestowania jednej aplikacji.
Hal Mueller
2

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);
Sebastian Hojas
źródło
IIRC to nie zadziała do testowania lokalnych powiadomień.
Steve Moser
1

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
odyth
źródło
0

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).

Evgeny Karkan
źródło