Как программно определить, работает ли мое приложение в симуляторе iphone? - PullRequest
259 голосов
/ 19 января 2009

Как говорится в вопросе, я бы хотел узнать, работает ли мой код в симуляторе, но также хотел бы знать, какая конкретная версия iphone запущена или имитируется.

РЕДАКТИРОВАТЬ: я добавил слово «программно» к названию вопроса. Суть моего вопроса в том, чтобы иметь возможность динамически включать / исключать код в зависимости от того, какая версия / симулятор запущена, поэтому я действительно искал бы что-то вроде директивы препроцессора, которая может предоставить мне эту информацию.

Ответы [ 21 ]

4 голосов
/ 16 июня 2009

У меня была одна и та же проблема, и TARGET_IPHONE_SIMULATOR, и TARGET_OS_IPHONE всегда определены и установлены на 1. Решение Пита, конечно, работает, но если вам когда-нибудь случится использовать что-то отличное от intel (вряд ли кто знает), вот что безопасно, если аппаратное обеспечение iphone не изменится (т. е. ваш код всегда будет работать на iphone, который там есть):

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

Поместите это в удобное место, а затем представьте, что константы TARGET_* определены правильно.

3 голосов
/ 25 ноября 2018

Для Swift 4.2 / xCode 10

Я создал расширение на UIDevice, поэтому я могу легко спросить, работает ли симулятор.

// 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
    }
}

Например, в моем AppDelegate я использую этот метод, чтобы решить, необходима ли регистрация для удаленного уведомления, что невозможно для симулятора.

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

    // REGISTER FOR SILENT REMOTE NOTIFICATION
    application.registerForRemoteNotifications()
}
2 голосов
/ 26 июля 2017

Кто-нибудь считал ответ предоставленным здесь ?

Я полагаю, что эквивалент цели-c будет

+ (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);
    }
}
1 голос
/ 11 июня 2018

С помощью Swift 4.2 (Xcode 10) мы можем сделать это

#if targetEnvironment(simulator)
  //simulator code
#else 
  #warning("Not compiling for simulator")
#endif
1 голос
/ 12 июня 2015

Для включения всех типов "симуляторов"

NSString *model = [[UIDevice currentDevice] model];
if([model rangeOfString:@"Simulator" options:NSCaseInsensitiveSearch].location !=NSNotFound)
{
    // we are running in a simulator
}
0 голосов
/ 17 сентября 2018

если ничего не получилось, попробуйте это

public struct Platform {

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

}
0 голосов
/ 12 июля 2018

Apple добавила поддержку для проверки того, что приложение предназначено для симулятора:

#if targetEnvironment(simulator)
let DEVICE_IS_SIMULATOR = true
#else
let DEVICE_IS_SIMULATOR = false
#endif
0 голосов
/ 28 февраля 2018

/// Возвращает true, если его симулятор, а не устройство

public static var isSimulator: Bool {
    #if (arch(i386) || arch(x86_64)) && os(iOS)
        return true
    #else
        return false
    #endif
}
0 голосов
/ 11 мая 2016

Это сработало для меня лучше всего

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


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

}
0 голосов
/ 23 декабря 2015

Мой ответ основан на ответе @Daniel Magnusson и комментариях @Nuthatch и @ n.Drake. и я пишу это, чтобы сэкономить время для быстрых пользователей, работающих на iOS9 и далее.

Вот что у меня сработало:

if UIDevice.currentDevice().name.hasSuffix("Simulator"){
    //Code executing on Simulator
} else{
    //Code executing on Device
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...