web-dev-qa-db-ja.com

どののiOSバージョンのデバイスが実行されているのかをプログラムで検出するにはどうすればよいですか。

ユーザーが5.0未満のiOSでアプリを実行しているかどうかを確認し、アプリにラベルを表示します。

プログラムでユーザーのデバイスでどのiOSが実行されているかを検出するにはどうすればよいですか?

ありがとうございます。

285
meetpd

最良の現在のバージョン、NSString内で数値検索を処理する必要がないのは、macrosを定義することです(元の回答を参照してください: iPhone iOSバージョン

これらのマクロはgithubに存在します。参照: https://github.com/carlj/CJAMacros/blob/master/CJAMacros/CJAMacros.h

このような:

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

次のように使用します。

if (SYSTEM_VERSION_LESS_THAN(@"5.0")) {
    // code here
}

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")) {
    // code here
}

以下の古いバージョン

oSバージョンを取得するには:

[[UIDevice currentDevice] systemVersion]

を介してint/floatに変換できる文字列を返します

-[NSString floatValue]
-[NSString intValue]

このような

両方の値(floatValue、intValue)はそのタイプのために削除され、5.0.1は5.0または5(floatまたはint)になります。正確に比較するには、ここでINTの配列に分離する必要があります。 iPhone iOSバージョンを確認

NSString *ver = [[UIDevice currentDevice] systemVersion];
int ver_int = [ver intValue];
float ver_float = [ver floatValue];

このように比較します

NSLog(@"System Version is %@",[[UIDevice currentDevice] systemVersion]);
NSString *ver = [[UIDevice currentDevice] systemVersion];
float ver_float = [ver floatValue];
if (ver_float < 5.0) return false;

Swift 4.0構文の場合

以下の例では、デバイスがiOS11以上のバージョンであるかどうかを確認しています。

let systemVersion = UIDevice.current.systemVersion
if systemVersion.cgFloatValue >= 11.0 {
    //"for ios 11"
  }
else{
   //"ios below 11")
  }
672
Marek Sebera

更新

IOS 8から、isOperatingSystemAtLeastVersionに新しいNSProcessInfoメソッドを使用できます。

   NSOperatingSystemVersion ios8_0_1 = (NSOperatingSystemVersion){8, 0, 1};
   if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:ios8_0_1]) {
      // iOS 8.0.1 and above logic
   } else {
      // iOS 8.0.0 and below logic
   }

IOS 8以前にはAPIが存在しなかったため、これがiOS 7でクラッシュすることに注意してください。iOS 7以下をサポートしている場合は、次のコマンドで安全に確認できます。

if ([NSProcessInfo instancesRespondToSelector:@selector(isOperatingSystemAtLeastVersion:)]) {
  // conditionally check for any version >= iOS 8 using 'isOperatingSystemAtLeastVersion'
} else {
  // we're on iOS 7 or below
}

原文の答えiOS <8

完全を期すために、これがApple自身によって iOS 7 UI移行ガイド で提案されたもう一つのアプローチで、Foundation Frameworkのバージョンをチェックすることを含みます。

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
   // Load resources for iOS 6.1 or earlier
} else {
   // Load resources for iOS 7 or later
}
257

この質問に答えるには遅すぎます。私の方法がまだiOSの低いバージョン(<5.0)で動作しているかどうかはわかりません。

NSString *platform = [UIDevice currentDevice].model;

NSLog(@"[UIDevice currentDevice].model: %@",platform);
NSLog(@"[UIDevice currentDevice].description: %@",[UIDevice currentDevice].description);
NSLog(@"[UIDevice currentDevice].localizedModel: %@",[UIDevice currentDevice].localizedModel);
NSLog(@"[UIDevice currentDevice].name: %@",[UIDevice currentDevice].name);
NSLog(@"[UIDevice currentDevice].systemVersion: %@",[UIDevice currentDevice].systemVersion);
NSLog(@"[UIDevice currentDevice].systemName: %@",[UIDevice currentDevice].systemName);

あなたはこれらの結果を得ることができます:

[UIDevice currentDevice].model: iPhone
[UIDevice currentDevice].description: <UIDevice: 0x1cd75c70>
[UIDevice currentDevice].localizedModel: iPhone
[UIDevice currentDevice].name: Someones-iPhone002
[UIDevice currentDevice].systemVersion: 6.1.3
[UIDevice currentDevice].systemName: iPhone OS
22
Yi Jiang
[[UIDevice currentDevice] systemVersion]
15
jbat100

[[UIDevice currentDevice] systemVersion];

またはバージョンを確認する

下記のマクロは から入手できます

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(IOS_VERSION_3_2_0))      
{

        UIImageView *background = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cs_lines_back.png"]] autorelease];
        theTableView.backgroundView = background;

}

お役に立てれば

14
Arunjack
[[[UIDevice currentDevice] systemVersion] floatValue]
9
Bhavesh Nayi

Marek Seberaはたいていの場合素晴らしいですが、私のような人でiOSのバージョンを頻繁にチェックする必要があることがわかった場合は、非常にわずかな速度低下を経験するので常にメモリ内でマクロを実行したくありません特に古いデバイスでは。

代わりに、iOSのバージョンを一度floatとして計算し、それをどこかに保存します。私の場合は、GlobalVariablesシングルトンクラスを使用して、このコードを使用してコード内のiOSのバージョンを確認します。

if ([GlobalVariables sharedVariables].iOSVersion >= 6.0f) {
    // do something if iOS is 6.0 or greater
}

アプリでこの機能を有効にするには、次のコードを使用します(iOS 5以降の場合はARCを使用)。

GlobalVariables.h

@interface GlobalVariables : NSObject

@property (nonatomic) CGFloat iOSVersion;

    + (GlobalVariables *)sharedVariables;

@end

GlobalVariables.m

@implementation GlobalVariables

@synthesize iOSVersion;

+ (GlobalVariables *)sharedVariables {
    // set up the global variables as a static object
    static GlobalVariables *globalVariables = nil;
    // check if global variables exist
    if (globalVariables == nil) {
        // if no, create the global variables class
        globalVariables = [[GlobalVariables alloc] init];
        // get system version
        NSString *systemVersion = [[UIDevice currentDevice] systemVersion];
        // separate system version by periods
        NSArray *systemVersionComponents = [systemVersion componentsSeparatedByString:@"."];
        // set ios version
        globalVariables.iOSVersion = [[NSString stringWithFormat:@"%01d.%02d%02d", \
                                       systemVersionComponents.count < 1 ? 0 : \
                                       [[systemVersionComponents objectAtIndex:0] integerValue], \
                                       systemVersionComponents.count < 2 ? 0 : \
                                       [[systemVersionComponents objectAtIndex:1] integerValue], \
                                       systemVersionComponents.count < 3 ? 0 : \
                                       [[systemVersionComponents objectAtIndex:2] integerValue] \
                                       ] floatValue];
    }
    // return singleton instance
    return globalVariables;
}

@end

これで、マクロを常時実行することなく、iOSのバージョンを簡単に確認できます。特に、[[UIDevice currentDevice] systemVersion] NSStringを、このページですでに指摘した不適切な方法を使用せずに常にアクセス可能なCGFloatに変換する方法に注意してください。私のアプローチはバージョン文字列がn.nn.nn(後のビットがなくなることを可能にする)のフォーマットであり、iOS5 +で動作すると仮定します。テストでは、このアプローチは常にマクロを実行するよりもはるかに速く実行されます。

これが私が抱えていた問題を経験している人に役立つことを願っています!

5
Anton

メジャーバージョンとマイナーバージョンを分けて、より具体的なバージョン番号情報を取得するには、次の手順を実行します。

NSString* versionString = [UIDevice currentDevice].systemVersion;
NSArray* vN = [versionString componentsSeparatedByString:@"."];

配列vNには、メジャーバージョンとマイナーバージョンが文字列として含まれますが、比較を行いたい場合は、バージョン番号を として数値 (整数)として格納する必要があります。このコードを追加して、それらをC配列* versionNumbersに格納することができます。

int versionNumbers[vN.count];
for (int i = 0; i < sizeof(versionNumbers)/sizeof(versionNumbers[0]); i++)
    versionNumbers[i] = [[vN objectAtIndex:i] integerValue];

* C配列は、より簡潔な構文のためにここで使用されています。

2
JohnK

モノタッチで:

メジャーバージョンを入手するには:

UIDevice.CurrentDevice.SystemVersion.Split('.')[0]

マイナーバージョンの場合:

UIDevice.CurrentDevice.SystemVersion.Split('.')[1]
1
callisto

IOSのバージョンが5未満(すべてのバージョン)の簡単なチェック:

if([[[UIDevice currentDevice] systemVersion] integerValue] < 5){
        // do something
};
0
iCode