質問が述べているように、私は主に私のコードがシミュレーターで実行されているかどうかを知りたいですが、実行中またはシミュレートされている特定のiphoneバージョンを知ることにも興味があります。
編集:質問名に「プログラムで」という単語を追加しました。私の質問のポイントは、実行しているバージョン/シミュレーターに応じてコードを動的に含める/除外できるようにすることです。したがって、この情報を提供できるプリプロセッサーディレクティブのようなものを本当に探しています。
質問が述べているように、私は主に私のコードがシミュレーターで実行されているかどうかを知りたいですが、実行中またはシミュレートされている特定のiphoneバージョンを知ることにも興味があります。
編集:質問名に「プログラムで」という単語を追加しました。私の質問のポイントは、実行しているバージョン/シミュレーターに応じてコードを動的に含める/除外できるようにすることです。したがって、この情報を提供できるプリプロセッサーディレクティブのようなものを本当に探しています。
すでに質問されていますが、非常に異なるタイトルです。
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
どちらがユースケースに適しているかによって異なります。
これは公式に機能するとされています。
#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
}
これを行うための最良の方法は次のとおりです。
#if TARGET_IPHONE_SIMULATOR
ではなく
#ifdef TARGET_IPHONE_SIMULATOR
常に定義されているので:0または1
これらの答えはすべて良いですが、コンパイルチェックとランタイムチェックを明確にしないため、私のような初心者を混乱させます。プリプロセッサはコンパイル前ですが、もっと明確にする必要があります
このブログ記事では、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
私は同じ問題を抱えていました。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_*
定数が正しく定義されているふりをします。
すべてのタイプの「シミュレーター」を含めるには
NSString *model = [[UIDevice currentDevice] model];
if([model rangeOfString:@"Simulator" options:NSCaseInsensitiveSearch].location !=NSNotFound)
{
// we are running in a simulator
}
私の回答は、@Daniel Magnusson の回答と、@Nuthatch および @n.Drake のコメントに基づいています。iOS9以降で作業するSwiftユーザーの時間を節約するために書いています。
これは私のために働いたものです:
if UIDevice.currentDevice().name.hasSuffix("Simulator"){
//Code executing on Simulator
} else{
//Code executing on Device
}
これは私にとって最も効果的でした
NSString *name = [[UIDevice currentDevice] name];
if ([name isEqualToString:@"iPhone Simulator"]) {
}