Jak mówi pytanie, chciałbym głównie wiedzieć, czy mój kod działa w symulatorze, ale chciałbym również wiedzieć, która konkretna wersja iPhone'a jest uruchomiona lub symulowana.
EDYCJA: Dodałem słowo „programowo” do nazwy pytania. Chodzi mi o to, aby móc dynamicznie dołączać / wykluczać kod w zależności od uruchomionej wersji / symulatora, więc naprawdę szukałbym czegoś w rodzaju dyrektywy przedprocesorowej, która mogłaby dostarczyć mi tych informacji.
ios
objective-c
swift
xcode
ios-simulator
Jeffrey Meyer
źródło
źródło
Odpowiedzi:
Już zadałem, ale z zupełnie innym tytułem.
Co #defines są konfigurowane przez Xcode podczas kompilacji na iPhone'a
Stamtąd powtórzę moją odpowiedź:
Jest w dokumentacji SDK w sekcji „Warunkowe kompilowanie kodu źródłowego”
Odpowiednia definicja to TARGET_OS_SIMULATOR, który jest zdefiniowany w /usr/include/TargetConditionals.h w ramach systemu iOS. We wcześniejszych wersjach zestawu narzędzi trzeba było napisać:
ale nie jest to już konieczne w bieżącym łańcuchu narzędzi (Xcode 6 / iOS8).
Na przykład, jeśli chcesz sprawdzić, czy działasz na urządzeniu, powinieneś to zrobić
w zależności od tego, który jest odpowiedni dla twojego przypadku użycia.
źródło
Zaktualizowany kod:
Podobno działa to oficjalnie.
Oryginalny post (od wycofania)
Ten kod powie ci, czy korzystasz z symulatora.
źródło
Nie była to dyrektywa przedprocesowa, ale tego właśnie szukałam, kiedy doszłam do tego pytania;
źródło
[model compare:iPhoneSimulator] == NSOrderedSame
należy zapisać jako[model isEqualToString:iPhoneSimulator]
[model hasSuffix:@"Simulator"]
jeśli zależy Ci tylko na „symulatorze”, a nie na iPhonie ani iPadzie . Ta odpowiedź nie działa na symulatorze iPada :)name
zamiastmodel
Simulator
słowo w nazwie swojego urządzeniaNajlepszym sposobem na to jest:
i nie
ponieważ zawsze jest zdefiniowany: 0 lub 1
źródło
TERAZ JEST LEPSZY SPOSÓB!
Począwszy od wersji Xcode 9.3 beta 4 można
#if targetEnvironment(simulator)
to sprawdzić.AKTUALIZACJA
Xcode 10 i iOS 12 SDK również to obsługuje.
źródło
W przypadku Swift możemy wprowadzić następujące
Możemy stworzyć strukturę, która pozwala tworzyć dane strukturalne
Następnie, jeśli chcemy wykryć, czy w Swift jest budowana aplikacja na urządzenie lub symulator.
źródło
#if #else #endif
będzie lepiej.Działa dla
Swift 5
iXcode 11.3.1
Użyj tego kodu:
źródło
Wszystkie te odpowiedzi są dobre, ale jakoś wprawia w zakłopotanie początkującego, jak ja, ponieważ nie wyjaśnia kontroli kompilacji i kontroli środowiska uruchomieniowego. Preprocesor jest przed czasem kompilacji, ale powinniśmy to wyjaśnić
W tym artykule na blogu pokazano, jak wykryć symulator iPhone'a? Wyraźnie
Środowisko wykonawcze
Po pierwsze, omówmy krótko. UIDevice zapewnia już informacje o urządzeniu
zwróci Ci „iPhone Simulator” lub „iPhone” w zależności od tego, gdzie aplikacja jest uruchomiona.
Czas kompilacji
Jednak chcesz zdefiniować czas kompilacji. Czemu? Ponieważ twoją aplikację kompilujesz wyłącznie w celu uruchomienia jej w symulatorze lub na urządzeniu. Apple tworzy definicję o nazwie
TARGET_IPHONE_SIMULATOR
. Spójrzmy więc na kod:źródło
[[UIDevice currentDevice] model]
powracaiPhone
również symulator iOS 9iPhone Simulator
. Myślę więc, że to nie jest najlepsze podejście.Poprzednie odpowiedzi są trochę przestarzałe. Odkryłem, że wszystko, co musisz zrobić, to wysłać zapytanie do
TARGET_IPHONE_SIMULATOR
makra ( nie musisz dołączać żadnych innych plików nagłówkowych [zakładając, że kodujesz dla iOS]).Próbowałem,
TARGET_OS_IPHONE
ale zwróciło tę samą wartość (1) podczas działania na rzeczywistym urządzeniu i symulatorze, dlatego zalecam użycieTARGET_IPHONE_SIMULATOR
zamiast tego.źródło
W krótkim:
Od Wykryj, czy aplikacja Swift buduje aplikację na urządzenie lub symulator
źródło
Miałem ten sam problem, jak
TARGET_IPHONE_SIMULATOR
iTARGET_OS_IPHONE
zawsze są zdefiniowane i są ustawione na 1. prac rozwiązań Pete'a, oczywiście, ale jeśli kiedykolwiek zdarzy się budować na czymś innym niż Intel (mało prawdopodobne, ale kto wie), tutaj jest coś, co jest bezpieczne, jak tak długo, jak sprzęt iPhone'a się nie zmieni (więc Twój kod zawsze będzie działał dla obecnie dostępnych telefonów):Umieść to w dogodnym miejscu, a następnie udawaj, że
TARGET_*
stałe zostały poprawnie zdefiniowane.źródło
Czy ktoś rozważał udzieloną tutaj odpowiedź ?
Przypuszczam, że byłby to odpowiednik celu-c
źródło
Dla Swift 4.2 / xCode 10
Utworzyłem rozszerzenie na UIDevice, dzięki czemu mogę łatwo zapytać, czy symulator jest uruchomiony.
Na przykład w aplikacji AppDelegate korzystam z tej metody, aby zdecydować, czy konieczna jest rejestracja w celu zdalnego powiadomienia, co nie jest możliwe w symulatorze.
źródło
Aby uwzględnić wszystkie typy „symulatorów”
źródło
-[NSString containsString]
?Dzięki Swift 4.2 (Xcode 10) możemy to zrobić
źródło
Moja odpowiedź oparta jest na odpowiedzi @Daniel Magnusson i komentarzach @Nuthatch i @ n.Drake. i piszę to, aby zaoszczędzić trochę czasu szybkim użytkownikom pracującym na iOS9 i nowszych.
Oto, co zadziałało dla mnie:
źródło
Simulator
słowo w nazwie swojego urządzeniaUIDevice.current.name
zgłasza nazwę maszyny, na której działa Symulator (zwykle coś takiego jak „MacBook Pro Simona”), więc test stał się niewiarygodny. Nadal szukam czystego sposobu, aby to naprawić./// Zwraca wartość true, jeśli jest to symulator, a nie urządzenie
źródło
Firma Apple dodała obsługę sprawdzania, czy aplikacja jest przeznaczona dla symulatora, w następujący sposób:
źródło
jeśli nic nie działało, spróbuj tego
źródło
Moim zdaniem odpowiedź (przedstawiona powyżej i powtórzona poniżej):
jest najlepszą odpowiedzią, ponieważ jest oczywiście wykonywana w RUNTIME w porównaniu do DYREKTYWY KOMPILACYJNEJ.
źródło
To działało dla mnie najlepiej
źródło
"iPhone"
.