Benim app iphone simülatörü çalıştıran olup olmadığını nasıl programlı belirleyebilir?

oy
242

Soru devletler gibi, ben esas olarak benim kod simülatörü çalıştıran olup olmadığını bilmek istiyorum, ama aynı zamanda çalışan veya simüle edilen spesifik iphone versiyonunu bilerek ilgi olurdu.

DÜZENLEME: Ben soru isme 'programlı' sözcüğü eklendi. Soruma noktası dinamik dahil edebilmek için / versiyon / simülatörü çalıştığı bağlı kod hariç, bu yüzden gerçekten bana bu bilgi sağlayabilir ön işlemci direktifi gibi bir şey arıyordum olurdu.

Oluştur 19/01/2009 saat 17:55
kaynak kullanıcı
Diğer dillerde...                            


22 cevaplar

oy
333

Zaten istedi, ama çok farklı bir başlıkla.

iPhone için derleme ne # tanımlar Xcode tarafından ayarlanır

Oradan Cevabımı tekrarlayacağız:

Bu "şartlı kaynak kodu derleme" altında SDK dokümanlarında var

İlgili tanımlama IOS çerçevesinde /usr/include/TargetConditionals.h tanımlanan TARGET_OS_SIMULATOR vardır. toolchain önceki sürümlerinde, yazmak zorunda:

#include "TargetConditionals.h"

ancak bu artık gerekli akım (Xcode 6 / iOS8) toolchain üzerindedir.

Eğer cihazda çalışan olup olmadığını kontrol etmek istiyorsanız Yani, örneğin, yapmanız gereken

#if TARGET_OS_SIMULATOR
    // Simulator-specific code
#else
    // Device-specific code
#endif

hangi bağlı olarak kullanım örneği için uygundur.

Cevap 19/01/2009 saat 18:17
kaynak kullanıcı

oy
106

Güncelleme kod:

Bu resmen çalışmaya sözde.

#if TARGET_IPHONE_SIMULATOR
NSString *hello = @"Hello, iPhone simulator!";
#elif TARGET_OS_IPHONE
NSString *hello = @"Hello, device!";
#else
NSString *hello = @"Hello, unknown target!";
#endif

Orijinal Mesaj (kullanımdan kaldırıldı beri)

Bir simülatörde çalıştırıyorsanız bu kod söyleyecektir.

#ifdef __i386__
NSLog(@"Running in the simulator");
#else
NSLog(@"Running on a device");
#endif
Cevap 19/01/2009 saat 18:10
kaynak kullanıcı

oy
61

Değil öncesi işlemci direktifi, ama bu ben bu soruya geldiğinde aradığı şeyi vardı;

NSString *model = [[UIDevice currentDevice] model];
if ([model isEqualToString:@"iPhone Simulator"]) {
    //device is simulator
}
Cevap 18/08/2010 saat 11:35
kaynak kullanıcı

oy
54

Bunu yapmanın en iyi yoludur:

#if TARGET_IPHONE_SIMULATOR

ve yok

#ifdef TARGET_IPHONE_SIMULATOR

onun çünkü her zaman tanımlanmış: 0 veya 1

Cevap 07/03/2011 saat 08:05
kaynak kullanıcı

oy
26

Swift durumunda aşağıdaki uygulayabilir

Size bir yapılandırılmış veri oluşturmak için izin verir yapı oluşturabilir

struct Platform {
    static let isSimulator: Bool = {
        #if arch(i386) || arch(x86_64)
            return true
        #endif
        return false
    }()
}

Sonra uygulama söz konusu ise Swift her cihaz veya simülatör için inşa edilen tespit etme isteseydim.

if Platform.isSimulator {
    // Do one thing
}
else {
    // Do the other
}
Cevap 25/02/2016 saat 04:48
kaynak kullanıcı

oy
8

Tüm bu cevap iyidir, ancak derleme çek ve çalışma zamanı kontrol açıklık olmadığı için bir şekilde benim gibi acemi karıştırır. Preprocessor önce derleme süresi vardır, ama biz daha net yapmalıdır

Bu blog makale gösterir iPhone simülatörü algılamak nasıl? Açıkça

Süre

Her şeyden önce, en kısa süre konuşalım. UIDevice size cihazla ilgili zaten bilgi sağlar

[[UIDevice currentDevice] model]

Uygulamanın çalıştığı yere göre size “iPhone Simülatörü” veya “iPhone” döndürecektir.

Derleme zamanı

Ancak ne istediğini zaman tanımlarınızı derlemek kullanmaktır. Niye ya? Uygulamanızı derlemek Çünkü kesinlikle Simülatörü içinde veya cihazda ya çalıştırılmak üzere. Apple denilen tanımlamak yapar TARGET_IPHONE_SIMULATOR. Yani kodunun bakalım:

#if TARGET_IPHONE_SIMULATOR

NSLog(@"Running in Simulator - no app store or giro");

#endif
Cevap 17/06/2014 saat 03:57
kaynak kullanıcı

oy
7

ŞİMDİ DAHA İYİ BİR YOL VAR!

Xcode 9.3 beta 4 itibariyle kullanabilirsiniz #if targetEnvironment(simulator)kontrol etmek.

#if targetEnvironment(simulator)
//Your simulator code
#endif
Cevap 12/03/2018 saat 13:50
kaynak kullanıcı

oy
6

Swift in:

#if (arch(i386) || arch(x86_64))
...            
#endif

Gönderen uygulama Swift her cihaz veya simülatör için inşa edilen tespit etme

Cevap 16/06/2016 saat 14:10
kaynak kullanıcı

oy
6

Önceki cevaplar biraz tarihli. Ben yapmanız gereken tüm sorgulamak olduğunu tespit TARGET_IPHONE_SIMULATORMakroya ( başka başlık dosyaları dahil gerek [iOS için kodlama varsayarak]).

Ben teşebbüs TARGET_OS_IPHONEancak gerçek bir cihaz ve simülatörde çalıştırırken ben kullanmanızı öneririz neden işte aynı değeri (1) döndürdü TARGET_IPHONE_SIMULATORyerine.

Cevap 21/05/2013 saat 08:10
kaynak kullanıcı

oy
4

Ben aynı problem vardı, hem TARGET_IPHONE_SIMULATORve TARGET_OS_IPHONEher zaman tanımlanır ve tabii 1. Pete'in çözüm eserlerini kolaylıkla ayarlanır, ancak hiç intel dışında bir üzerine inşa başına (muhtemel, ama kim bilir) eğer Burada da güvende olan bir şey uzun iphone donanım değişmez olarak (böylece kod her zaman şu anda orada iPhone'lar için çalışacak):

#if defined __arm__ || defined __thumb__
#undef TARGET_IPHONE_SIMULATOR
#define TARGET_OS_IPHONE
#else
#define TARGET_IPHONE_SIMULATOR 1
#undef TARGET_OS_IPHONE
#endif

Kullanışlı olduğu biryere koy ve daha sonra bu taklit TARGET_*sabitler doğru tanımlandı.

Cevap 16/06/2009 saat 18:48
kaynak kullanıcı

oy
2

/ Xcode 10 Swift 4.2 için

Ben UIDevice bir uzantı yarattı yüzden kolayca simülatörü çalışıyorsa isteyebilirsiniz.

// UIDevice+CheckSimulator.swift

import UIKit

extension UIDevice {

    /// Checks if the current device that runs the app is xCode's simulator
    static func isSimulator() -> Bool {        
        #if targetEnvironment(simulator)
            return true
        #else
            return false
        #endif
    }
}

Benim içinde AppDelegate örneğin ben uzaktan bildirimi için kayıt Hava karar vermek için bu yöntemi kullanmak simülatörü mümkün olmadığı, gereklidir.

// CHECK FOR REAL DEVICE / OR SIMULATOR
if UIDevice.isSimulator() == false {

    // REGISTER FOR SILENT REMOTE NOTIFICATION
    application.registerForRemoteNotifications()
}
Cevap 25/11/2018 saat 13:29
kaynak kullanıcı

oy
1

İçin çalışır Swift 4veXcode 9.4.1

Bu kodu kullanın:

#if targetEnvironment(simulator)
   // Simulator
#else
   // Device
#endif
Cevap 18/07/2018 saat 19:06
kaynak kullanıcı

oy
1

Swift 4.2 (Xcode 10) ile, bunu yapabiliriz

#if hasTargetEnvironment(simulator)
  //simulator code
#else 
  #warning("Not compiling for simulator")
#endif
Cevap 11/06/2018 saat 08:33
kaynak kullanıcı

oy
1

Herkes sağlanan cevabı kabul etti buraya ?

Objektif-c eşdeğer olacağını varsayalım

+ (BOOL)isSimulator {
    NSOperatingSystemVersion ios9 = {9, 0, 0};
    NSProcessInfo *processInfo = [NSProcessInfo processInfo];
    if ([processInfo isOperatingSystemAtLeastVersion:ios9]) {
        NSDictionary<NSString *, NSString *> *environment = [processInfo environment];
        NSString *simulator = [environment objectForKey:@"SIMULATOR_DEVICE_NAME"];
        return simulator != nil;
    } else {
        UIDevice *currentDevice = [UIDevice currentDevice];
        return ([currentDevice.model rangeOfString:@"Simulator"].location != NSNotFound);
    }
}
Cevap 26/07/2017 saat 13:59
kaynak kullanıcı

oy
1

"Simülatörleri" her türlü dahil etmek

NSString *model = [[UIDevice currentDevice] model];
if([model rangeOfString:@"Simulator" options:NSCaseInsensitiveSearch].location !=NSNotFound)
{
    // we are running in a simulator
}
Cevap 12/06/2015 saat 18:51
kaynak kullanıcı

oy
0

hiçbir şey çalıştı, bu deneyin

public struct Platform {

    public static var isSimulator: Bool {
        return TARGET_OS_SIMULATOR != 0 // Use this line in Xcode 7 or newer
    }

}
Cevap 17/09/2018 saat 13:33
kaynak kullanıcı

oy
0

Elma aşağıdaki simülatörü için hedeflenen uygulamayı denetleme desteği ekledi:

#if targetEnvironment(simulator)
let DEVICE_IS_SIMULATOR = true
#else
let DEVICE_IS_SIMULATOR = false
#endif
Cevap 11/07/2018 saat 22:43
kaynak kullanıcı

oy
0

SWIFT 4 Çözüm

static let isSimulator: Bool = {
    return TARGET_OS_SIMULATOR == 1
}()

TARGET_OS_SIMULATORbulunan Darwin.TargetConditionals.swiftdosyanın.

Cevap 11/04/2018 saat 07:09
kaynak kullanıcı

oy
0

/// doğru döndürür eğer onun simülatörü ve bir cihaz

public static var isSimulator: Bool {
    #if (arch(i386) || arch(x86_64)) && os(iOS)
        return true
    #else
        return false
    #endif
}
Cevap 28/02/2018 saat 13:39
kaynak kullanıcı

oy
0

Benim cevabım @Daniel Magnusson cevap ve @Nuthatch yaptıkları yorumların ve n.Drake @ dayanır. ve bunu itibaren iOS9 ve çalışan hızlı kullanıcılar için bazı zaman kazanmak için yazıyorum.

Bu benim için çalıştı budur:

if UIDevice.currentDevice().name.hasSuffix("Simulator"){
    //Code executing on Simulator
} else{
    //Code executing on Device
}
Cevap 23/12/2015 saat 12:30
kaynak kullanıcı

oy
-3

Bu benim en iyi çalıştı

NSString *name = [[UIDevice currentDevice] name];


if ([name isEqualToString:@"iPhone Simulator"]) {

}
Cevap 11/05/2016 saat 06:40
kaynak kullanıcı

oy
-3

Bence, cevap (yukarıda sunulan ve aşağıda tekrarlanan):

NSString *model = [[UIDevice currentDevice] model];
if ([model isEqualToString:@"iPhone Simulator"]) {
    //device is simulator
}

belli ki bir DERLEME YÖNERGESİ olmanın karşı RUNTIME yürütülür çünkü iyi cevaptır.

Cevap 09/09/2013 saat 15:45
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more