Sebagai pertanyaan menyatakan, saya terutama ingin tahu apakah kode saya berjalan di simulator, tetapi juga tertarik untuk mengetahui versi iphone spesifik yang sedang berjalan atau sedang disimulasikan.
EDIT: Saya menambahkan kata 'secara terprogram' ke nama pertanyaan. Inti dari pertanyaan saya adalah untuk dapat secara dinamis memasukkan / mengecualikan kode tergantung pada versi / simulator yang sedang berjalan, jadi saya benar-benar akan mencari sesuatu seperti arahan pra-prosesor yang dapat memberikan saya info ini.
ios
objective-c
swift
xcode
ios-simulator
Jeffrey Meyer
sumber
sumber
Jawaban:
Sudah ditanya, tetapi dengan judul yang sangat berbeda.
Apa definisi yang diatur oleh Xcode saat mengkompilasi untuk iPhone
Saya akan mengulangi jawaban saya dari sana:
Ada dalam dokumen SDK di bawah "Kompilasi kode sumber secara kondisional"
Definisi yang relevan adalah TARGET_OS_SIMULATOR, yang didefinisikan dalam /usr/include/TargetConditionals.h dalam kerangka iOS. Pada versi sebelumnya dari toolchain, Anda harus menulis:
tetapi ini tidak lagi diperlukan pada rantai alat saat ini (Xcode 6 / iOS8).
Jadi, misalnya, jika Anda ingin memeriksa apakah Anda menjalankan perangkat, Anda harus melakukannya
tergantung mana yang sesuai untuk kasus penggunaan Anda.
sumber
Kode yang diperbarui:
Ini dimaksudkan untuk bekerja secara resmi.
Pos asli (sejak usang)
Kode ini akan memberi tahu Anda jika Anda menjalankan simulator.
sumber
Bukan arahan pra-prosesor, tapi ini yang saya cari ketika saya sampai pada pertanyaan ini;
sumber
[model compare:iPhoneSimulator] == NSOrderedSame
harus ditulis sebagai[model isEqualToString:iPhoneSimulator]
[model hasSuffix:@"Simulator"]
jika Anda hanya peduli tentang "simulator" secara umum, bukan iPhone atau iPad pada khususnya. Jawaban ini tidak akan berfungsi untuk simulator iPad :)name
alih-alihmodel
Simulator
kata dalam nama perangkatnyaCara terbaik untuk melakukan ini adalah:
dan tidak
karena selalu didefinisikan: 0 atau 1
sumber
ADA CARA YANG LEBIH BAIK SEKARANG!
Pada Xcode 9.3 beta 4 Anda dapat menggunakannya
#if targetEnvironment(simulator)
untuk memeriksa.UPDATE
Xcode 10 dan iOS 12 SDK juga mendukung ini.
sumber
Dalam kasus Swift kita dapat menerapkan yang berikut
Kami dapat membuat struct yang memungkinkan Anda untuk membuat data terstruktur
Kemudian Jika kita ingin Mendeteksi apakah aplikasi sedang dibangun untuk perangkat atau simulator di Swift, maka.
sumber
#if #else #endif
akan lebih baik.Bekerja untuk
Swift 5
danXcode 11.3.1
Gunakan kode ini:
sumber
Semua jawaban itu baik, tetapi entah bagaimana membingungkan pemula seperti saya karena tidak mengklarifikasi pemeriksaan kompilasi dan pengecekan runtime. Preprosesor ada sebelum waktu kompilasi, tetapi kita harus membuatnya lebih jelas
Artikel blog ini menunjukkan Cara mendeteksi simulator iPhone?jelas
Runtime
Pertama-tama, mari kita bahas sebentar lagi. UIDevice memberi Anda informasi yang sudah ada tentang perangkat
akan mengembalikan "Simulator iPhone" atau "iPhone" kepada Anda sesuai dengan tempat aplikasi berjalan.
Waktu kompilasi
Namun yang Anda inginkan adalah menggunakan definisi waktu kompilasi. Mengapa? Karena Anda mengkompilasi aplikasi secara ketat untuk dijalankan di dalam Simulator atau di perangkat. Apple membuat mendefinisikan disebut
TARGET_IPHONE_SIMULATOR
. Jadi mari kita lihat kodenya:sumber
[[UIDevice currentDevice] model]
kembaliiPhone
juga bukaniPhone Simulator
. Jadi, saya pikir ini bukan pendekatan terbaik.Jawaban sebelumnya sedikit tertanggal. Saya menemukan bahwa semua yang perlu Anda lakukan adalah kueri
TARGET_IPHONE_SIMULATOR
makro ( tidak perlu menyertakan file header lainnya [dengan asumsi Anda mengkode untuk iOS]).Saya mencoba
TARGET_OS_IPHONE
tetapi mengembalikan nilai yang sama (1) ketika berjalan pada perangkat dan simulator yang sebenarnya, itu sebabnya saya sarankan menggunakanTARGET_IPHONE_SIMULATOR
sebagai gantinya.sumber
Dengan cepat:
Dari Deteksi jika aplikasi sedang dibangun untuk perangkat atau simulator di Swift
sumber
Saya memiliki masalah yang sama, keduanya
TARGET_IPHONE_SIMULATOR
danTARGET_OS_IPHONE
selalu didefinisikan, dan ditetapkan ke 1. Solusi Pete bekerja, tentu saja, tetapi jika Anda pernah membangun sesuatu selain intel (tidak mungkin, tetapi siapa yang tahu), inilah sesuatu yang aman seperti selama perangkat keras iphone tidak berubah (jadi kode Anda akan selalu berfungsi untuk iPhone yang saat ini ada di sana):Letakkan itu di tempat yang nyaman, dan kemudian berpura-pura bahwa
TARGET_*
konstanta didefinisikan dengan benar.sumber
Adakah yang mempertimbangkan jawaban yang diberikan di sini ?
Saya kira persamaan objektif-c akan menjadi
sumber
Untuk Swift 4.2 / xCode 10
Saya membuat ekstensi di UIDevice, jadi saya dapat dengan mudah menanyakan apakah simulator berjalan.
Di AppDelegate saya misalnya saya menggunakan metode ini untuk memutuskan apakah mendaftar untuk notifikasi jarak jauh diperlukan, yang tidak mungkin untuk simulator.
sumber
Untuk memasukkan semua jenis "simulator"
sumber
-[NSString containsString]
?Dengan Swift 4.2 (Xcode 10), kita dapat melakukan ini
sumber
Jawaban saya didasarkan pada jawaban @Daniel Magnusson dan komentar @Nuthatch dan @ n. Rem. dan saya menulisnya untuk menghemat waktu bagi pengguna cepat yang menggunakan iOS9 dan seterusnya.
Inilah yang bekerja untuk saya:
sumber
Simulator
kata dalam nama perangkatnyaUIDevice.current.name
melaporkan nama mesin yang dijalankan oleh Simulator (biasanya sekitar "Simon's MacBook Pro" sekarang) sehingga pengujian menjadi tidak dapat diandalkan. Saya masih mencari cara yang bersih untuk memperbaikinya./// Mengembalikan nilai true jika simulator dan bukan perangkat
sumber
Apple telah menambahkan dukungan untuk memeriksa aplikasi yang ditargetkan untuk simulator dengan yang berikut:
sumber
jika tidak ada yang berhasil, coba ini
sumber
Menurut pendapat saya, jawabannya (disajikan di atas dan diulang di bawah):
adalah jawaban terbaik karena itu jelas dieksekusi pada RUNTIME dibandingkan menjadi SEGERA DIRECTIVE.
sumber
Ini yang terbaik untuk saya
sumber
"iPhone"
.