source

내 앱이 아이폰 시뮬레이터에서 실행 중인지 프로그래밍 방식으로 확인하려면 어떻게 해야 합니까?

lovecheck 2023. 4. 27. 22:31
반응형

내 앱이 아이폰 시뮬레이터에서 실행 중인지 프로그래밍 방식으로 확인하려면 어떻게 해야 합니까?

질문에 나와 있듯이, 저는 주로 시뮬레이터에서 제 코드가 실행되고 있는지 여부를 알고 싶지만, 실행되고 있거나 시뮬레이션되고 있는 특정 아이폰 버전을 알고 싶습니다.

편집: 질문 이름에 '프로그래밍 방식으로'라는 단어를 추가했습니다.제 질문의 요점은 실행 중인 버전/시뮬레이터에 따라 코드를 동적으로 포함/제외할 수 있다는 것입니다. 따라서 저는 이 정보를 제공할 수 있는 사전 프로세서 지침과 같은 것을 정말로 찾고 있습니다.

이미 요청했지만, 제목이 매우 다릅니다.

iPhone용 컴파일 시 Xcode에서 설정하는 #정의 항목

거기서 제 대답을 반복하겠습니다.

SDK 문서의 "조건부 소스 코드 컴파일"에 있습니다.

관련 정의는 TARGET_OS_SIMulator이며, iOS 프레임워크 내의 /usr/include/TargetConditions.h에 정의되어 있습니다.이전 버전의 툴체인에서는 다음을 작성해야 했습니다.

#include "TargetConditionals.h"

그러나 현재(Xcode 6/iOS8) 툴체인에서는 더 이상 필요하지 않습니다.

따라서 예를 들어 장치에서 실행 중인지 확인하려면

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

어떤 것이 사용 사례에 적합한지에 따라 달라집니다.

업데이트된 코드:

이것은 공식적으로 작동한다고 합니다.

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

원래 게시물(사용되지 않음 이후)

이 코드는 당신이 시뮬레이터에서 실행하고 있는지 알려줄 것입니다.

#ifdef __i386__
NSLog(@"Running in the simulator");
#else
NSLog(@"Running on a device");
#endif

사전 프로세서 지침은 아니지만, 제가 이 질문을 받았을 때 이것이 제가 찾고 있던 것이었습니다.

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

스위프트에 더 좋은 방법이 있습니다.

Xcode 9.3 이상 버전에서는 다음을 사용할 수 있습니다.#if targetEnvironment(simulator)확인해야 합니다.

#if targetEnvironment(simulator)
//Your simulator code
#endif

가장 좋은 방법은 다음과 같습니다.

#if TARGET_IPHONE_SIMULATOR

그리고 아닌

#ifdef TARGET_IPHONE_SIMULATOR

항상 정의되므로: 0 또는 1

스위프트의 경우 다음을 구현할 수 있습니다.

구조화된 데이터를 만들 수 있는 구조를 만들 수 있습니다.

struct Platform {
    static var isSimulator: Bool {
        #if targetEnvironment(simulator)
            // We're on the simulator
            return true
        #else
            // We're on a device
             return false
        #endif
    }
}

그렇다면 Swift에서 장치나 시뮬레이터를 위해 앱이 구축되고 있는지 탐지하고 싶었더라면.

if Platform.isSimulator {
    // Do one thing
} else {
    // Do the other
}

Swift 4.1 이상 및 Xcode 9.3 이상에서 작동합니다.

다음 코드 사용:

#if targetEnvironment(simulator)
   // Simulator
#else
   // Device
#endif

그 답들은 다 좋은데 컴파일 체크와 런타임 체크가 명확하지 않아 저 같은 초보자를 헷갈리게 합니다.프리프로세서는 컴파일 시간 이전이지만 더 명확하게 해야 합니다.

이 블로그 기사는 아이폰 시뮬레이터를 감지하는 방법을 보여줍니다.확실히.

런타임

우선, 간단히 논의해 보겠습니다.UID 장치는 장치에 대한 이미 정보를 제공합니다.

[[UIDevice currentDevice] model]

앱이 실행 중인 위치에 따라 "iPhone Simulator" 또는 "iPhone"을 반환합니다.

컴파일 시간

하지만 당신이 원하는 것은 컴파일 시간 정의를 사용하는 것입니다. 왜죠?왜냐하면 당신은 시뮬레이터 내부나 장치에서 실행되도록 앱을 엄격하게 컴파일하기 때문입니다.Apple은 다음과 같은 정의를 내립니다.TARGET_IPHONE_SIMULATOR이제 코드를 살펴보겠습니다.

#if TARGET_IPHONE_SIMULATOR

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

#endif

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()
}

이전 답변들은 약간 구식입니다.저는 당신이 해야 할 일은 단지 질문하는 것뿐이라는 것을 발견했습니다.TARGET_IPHONE_SIMULATOR매크로([iOS용으로 코딩한다고 가정할 때] 다른 헤더 파일을 포함할 필요가 없습니다).

시도했습니다TARGET_OS_IPHONE하지만 실제 장치와 시뮬레이터에서 실행할 때 동일한 값(1)을 반환했기 때문에 사용할 것을 권장합니다.TARGET_IPHONE_SIMULATOR대신.

신속하게:

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

Detect에서 Swift에서 장치 또는 시뮬레이터용으로 앱이 빌드되고 있는지 여부

여기서 제공되는 답을 고려해 본 사람이 있습니까?

내 생각에 목표-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);
    }
}

저도 같은 문제가 있었어요, 둘 다요.TARGET_IPHONE_SIMULATOR그리고.TARGET_OS_IPHONE는 항상 정의되며 1로 설정됩니다.물론 Pete의 솔루션은 작동하지만, 만약 당신이 인텔이 아닌 다른 것을 구축한다면(가능성은 낮지만, 누가 알겠는가), 여기 아이폰 하드웨어가 바뀌지 않는 한 안전한 것이 있습니다(따라서 당신의 코드는 항상 현재 아이폰에서 작동할 것입니다).

#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_*상수가 올바르게 정의되었습니다.

모든 유형의 "시뮬레이터" 포함

NSString *model = [[UIDevice currentDevice] model];
if([model rangeOfString:@"Simulator" options:NSCaseInsensitiveSearch].location !=NSNotFound)
{
    // we are running in a simulator
}

Swift 4.2(Xcode 10)를 사용하면 다음을 수행할 수 있습니다.

#if targetEnvironment(simulator)
  //simulator code
#else 
  #warning("Not compiling for simulator")
#endif

제 답변은 @Daniel Magnusson 답변과 @Nuthatch 및 @n의 코멘트를 기반으로 합니다.Drake. 그리고 iOS9 이상에서 작업하는 빠른 사용자들을 위해 시간을 절약하기 위해 작성합니다.

이것이 저에게 도움이 되었습니다.

if UIDevice.currentDevice().name.hasSuffix("Simulator"){
    //Code executing on Simulator
} else{
    //Code executing on Device
}

장치가 아닌 시뮬레이터의 경우 true를 반환합니다.

public static var isSimulator: Bool {
    #if (arch(i386) || arch(x86_64)) && os(iOS)
        return true
    #else
        return false
    #endif
}

Apple은 앱이 시뮬레이터 대상인지 확인하기 위한 지원을 다음과 같이 추가했습니다.

#if targetEnvironment(simulator)
let DEVICE_IS_SIMULATOR = true
#else
let DEVICE_IS_SIMULATOR = false
#endif

아무 것도 효과가 없다면, 이것을 시도해 보세요.

public struct Platform {

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

}

이것은 나에게 가장 효과적이었습니다.

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


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

}

제 생각에 답은 다음과 같습니다(위에 제시되고 아래에 반복됨).

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

COMPLE DIRECTIRECT와 비교하여 런타임에 실행되므로 가장 좋은 답변입니다.

언급URL : https://stackoverflow.com/questions/458304/how-can-i-programmatically-determine-if-my-app-is-running-in-the-iphone-simulato

반응형