285

質問が述べているように、私は主に私のコードがシミュレーターで実行されているかどうかを知りたいですが、実行中またはシミュレートされている特定のiphoneバージョンを知ることにも興味があります。

編集:質問名に「プログラムで」という単語を追加しました。私の質問のポイントは、実行しているバージョン/シミュレーターに応じてコードを動的に含める/除外できるようにすることです。したがって、この情報を提供できるプリプロセッサーディレクティブのようなものを本当に探しています。

4

21 に答える 21

364

すでに質問されていますが、非常に異なるタイトルです。

iPhone 用にコンパイルするときに Xcode によって設定される #defines とは

そこから私の答えを繰り返します:

「条件付きでソースコードをコンパイルする」の下のSDKドキュメントにあります

関連する定義は、iOS フレームワーク内の /usr/include/TargetConditionals.h で定義されている TARGET_OS_SIMULATOR です。ツールチェーンの以前のバージョンでは、次のように記述する必要がありました。

#include "TargetConditionals.h"

しかし、これは現在の (Xcode 6/iOS8) ツールチェーンでは不要になりました。

したがって、たとえば、デバイスで実行されていることを確認したい場合は、次のようにする必要があります

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

どちらがユースケースに適しているかによって異なります。

于 2009-01-19T17:17:02.990 に答える
107

更新されたコード:

これは公式に機能するとされています。

#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
于 2009-01-19T17:10:38.010 に答える
61

プリプロセッサ ディレクティブではありませんが、これは私がこの質問に来たときに探していたものです。

NSString *model = [[UIDevice currentDevice] model];
if ([model isEqualToString:@"iPhone Simulator"]) {
    //device is simulator
}
于 2010-08-18T10:35:50.257 に答える
55

これを行うための最良の方法は次のとおりです。

#if TARGET_IPHONE_SIMULATOR

ではなく

#ifdef TARGET_IPHONE_SIMULATOR

常に定義されているので:0または1

于 2011-03-07T07:05:41.863 に答える
9

これらの答えはすべて良いですが、コンパイルチェックとランタイムチェックを明確にしないため、私のような初心者を混乱させます。プリプロセッサはコンパイル前ですが、もっと明確にする必要があります

このブログ記事では、iPhone シミュレーターを検出する方法を示しています。明らかに

ランタイム

まず、簡単に議論しましょう。UIDevice は、デバイスに関する情報を既に提供しています

[[UIDevice currentDevice] model]

アプリが実行されている場所に応じて、「iPhone Simulator」または「iPhone」が返されます。

コンパイル時間

ただし、コンパイル時の定義を使用する必要があります。なんで?シミュレーター内またはデバイス上で実行されるようにアプリを厳密にコンパイルするためです。Apple は と呼ばれる定義を作成します TARGET_IPHONE_SIMULATOR。それでは、コードを見てみましょう:

#if TARGET_IPHONE_SIMULATOR

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

#endif
于 2014-06-17T02:57:18.733 に答える
6

迅速に:

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

アプリが Swift のデバイスまたはシミュレーター用にビルドされているかどうかを検出する

于 2016-06-16T14:10:55.910 に答える
4

私は同じ問題を抱えていました。TARGET_IPHONE_SIMULATORTARGET_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_*定数が正しく定義されているふりをします。

于 2009-06-16T17:48:25.330 に答える
1

すべてのタイプの「シミュレーター」を含めるには

NSString *model = [[UIDevice currentDevice] model];
if([model rangeOfString:@"Simulator" options:NSCaseInsensitiveSearch].location !=NSNotFound)
{
    // we are running in a simulator
}
于 2015-06-12T18:51:44.657 に答える
0

私の回答は、@Daniel Magnusson の回答と、@Nuthatch および @n.Drake のコメントに基づいています。iOS9以降で作業するSwiftユーザーの時間を節約するために書いています。

これは私のために働いたものです:

if UIDevice.currentDevice().name.hasSuffix("Simulator"){
    //Code executing on Simulator
} else{
    //Code executing on Device
}
于 2015-12-23T12:30:56.777 に答える
-4

これは私にとって最も効果的でした

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


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

}
于 2016-05-11T06:40:11.530 に答える