iOS
バージョンのデバイスが3.1.3
よりも大きいかどうかをチェックしたいのですが。
[[UIDevice currentDevice].systemVersion floatValue]
しかし、それはうまくいきません。
if (version > 3.1.3) { }
どうすればこれを達成できますか?
Swift 2.0では、if
またはguard
で#available
を使用して、特定のシステムでのみ実行されるべきコードを保護できます。
if #available(iOS 9, *) {}
Objective-Cでは、システムのバージョンを確認して比較する必要があります。
iOS 8以降の[[NSProcessInfo processInfo] operatingSystemVersion]
。
Xcode 9以降:
if (@available(iOS 9, *)) {}
Objective-Cでは、まれにSwiftでは、デバイスまたはOSの機能を示すものとしてオペレーティングシステムのバージョンに依存しないようにすることをお勧めします。通常、特定の機能またはクラスが利用可能かどうかを確認するためのより信頼性の高い方法があります。
APIの存在を確認する:
たとえば、UIPopoverController
が現在のデバイスで利用可能かどうかをNSClassFromString
を使用して確認できます。
if (NSClassFromString(@"UIPopoverController")) {
// Do something
}
弱くリンクされたクラスの場合は、直接クラスにメッセージを送るのが安全です。特に、これは "必須"として明示的にリンクされていないフレームワークに対して機能します。欠落クラスの場合、式はnilと評価され、条件が満たされません。
if ([LAContext class]) {
// Do something
}
CLLocationManager
やUIDevice
のようないくつかのクラスは、デバイスの機能をチェックするメソッドを提供します。
if ([CLLocationManager headingAvailable]) {
// Do something
}
シンボルの存在を確認する:
ごくまれに、定数の存在を確認する必要があります。これはiOS 8でUIApplicationOpenSettingsURLString
の導入により思いつきました。これは-openURL:
経由でSettingsアプリをロードするために使用されていました。値はiOS 8以前には存在しませんでした。このAPIにnilを渡すとクラッシュするので、最初に定数の存在を確認するように注意しなければなりません。
if (&UIApplicationOpenSettingsURLString != NULL) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
オペレーティングシステムのバージョンとの比較:
オペレーティングシステムのバージョンを確認する必要が比較的まれにあるという問題に直面しているとしましょう。 iOS 8以降を対象としたプロジェクトの場合、NSProcessInfo
にはエラーの可能性を少なくしてバージョン比較を実行するためのメソッドが含まれています。
- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version
古いシステムをターゲットにしているプロジェクトはsystemVersion
でUIDevice
を使うことができます。 Appleは彼らの GLSprite サンプルコードでそれを使っています。
// A system version of 3.1 or greater is required to use CADisplayLink. The NSTimer
// class is used as fallback when it isn't available.
NSString *reqSysVer = @"3.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) {
displayLinkSupported = TRUE;
}
何らかの理由でsystemVersion
があなたが望むものであると判断した場合、それを文字列として扱うことを忘れないでください。そうでないと、パッチのリビジョン番号を切り捨てる危険があります(例3.1.2 - > 3.1)。
/*
* System Versioning Preprocessor Macros
*/
#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)
/*
* Usage
*/
if (SYSTEM_VERSION_LESS_THAN(@"4.0")) {
...
}
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"3.1.1")) {
...
}
公式Appleドキュメント :によって示唆されているように、あなたはNSObjCRuntime.h
ヘッダファイルから NSFoundationVersionNumber
を使うことができます。
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
// here you go with iOS 7
}
Objective-C のXcode 9以降
if (@available(iOS 11, *)) {
// iOS 11 (or newer) ObjC code
} else {
// iOS 10 or older code
}
Xcode 7以降では、 Swift になります。
if #available(iOS 11, *) {
// iOS 11 (or newer) Swift code
} else {
// iOS 10 or older code
}
バージョンについては、MAJOR、MINORまたはPATCHを指定できます(定義については http://semver.org/ を参照)。例:
iOS 11
とiOS 11.0
は同じ最小バージョンですiOS 10
、iOS 10.3
、iOS 10.3.1
は異なる最小バージョンですこれらのシステムのいずれにも値を入力できます。
iOS
name__、macOS
name__、watchOS
name__、tvOS
name__if #available(iOS 10.0, tvOS 10.0, *) {
// iOS 10+ and tvOS 10+ Swift code
} else {
// iOS 9 and tvOS 9 older code
}
これはXcodeで互換性のあるSDKのバージョンを確認するために使用されます。これは、Xcodeのバージョンが異なる大規模なチームや、同じコードを共有する異なるSDKをサポートする複数のプロジェクトがある場合です。
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
//programming in iOS 8+ SDK here
#else
//programming in lower than iOS 8 here
#endif
あなたが本当に欲しいのは、デバイス上のiOSのバージョンを確認することです。あなたはこれでそれをすることができます:
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) {
//older than iOS 8 code here
} else {
//iOS 8 specific code here
}
迅速なバージョン:
if let version = Float(UIDevice.current.systemVersion), version < 9.3 {
//add lower than 9.3 code here
} else {
//add 9.3 and above code here
}
現在のSwiftのバージョンはこれを使っているはずです:
if #available(iOS 12, *) {
//iOS 12 specific code here
} else {
//older than iOS 12 code here
}
試してください:
NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare: @"3.1.3" options: NSNumericSearch];
if (order == NSOrderedSame || order == NSOrderedDescending) {
// OS version >= 3.1.3
} else {
// OS version < 3.1.3
}
Swift 2.0では、Appleははるかに便利な構文を使った可用性チェックを追加しました(続きを読む ここ )。これで、よりクリーンな構文でOSのバージョンを確認できます。
if #available(iOS 9, *) {
// Then we are on iOS 9
} else {
// iOS 8 or earlier
}
これはrespondsToSelector
etc( Swiftの新機能 )をチェックするよりも好ましい方法です。コードを適切に保護していないと、コンパイラは常に警告を表示します。
IOS 8で新しく追加されたNSProcessInfo
は、より良いセマンティックバージョニングチェックを可能にします。
iOS 8.0 以上の最小デプロイメントターゲットの場合は、
NSProcessInfo
operatingSystemVersion
またはisOperatingSystemAtLeastVersion
を使用します。
これにより、次のようになります。
let minimumVersion = NSOperatingSystemVersion(majorVersion: 8, minorVersion: 1, patchVersion: 2)
if NSProcessInfo().isOperatingSystemAtLeastVersion(minimumVersion) {
//current version is >= (8.1.2)
} else {
//current version is < (8.1.2)
}
iOS 7.1 以下の最小デプロイメントターゲットの場合は、
NSStringCompareOptions.NumericSearch
でUIDevice systemVersion
と比較してください。
これは次のようになります。
let minimumVersionString = "3.1.3"
let versionComparison = UIDevice.currentDevice().systemVersion.compare(minimumVersionString, options: .NumericSearch)
switch versionComparison {
case .OrderedSame, .OrderedDescending:
//current version is >= (3.1.3)
break
case .OrderedAscending:
//current version is < (3.1.3)
fallthrough
default:
break;
}
NSHipster でもっと読む。
私はお勧め:
if ([[[UIDevice currentDevice] systemVersion] floatValue] > 3.13) {
; // ...
}
クレジット: 特定のiPhoneのバージョンをターゲットにする方法?
私は常にConstants.hファイルにそれらを保存しています。
#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES)
#define IS_OS_5_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 5.0)
#define IS_OS_6_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0)
#define IS_OS_7_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
#define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
+(BOOL)doesSystemVersionMeetRequirement:(NSString *)minRequirement{
// eg NSString *reqSysVer = @"4.0";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:minRequirement options:NSNumericSearch] != NSOrderedAscending)
{
return YES;
}else{
return NO;
}
}
nv-ios-version project(Apache License、Version 2.0)に含まれる Version classを使用すると、iOSのバージョンを簡単に取得および比較できます。以下のコード例はiOSのバージョンをダンプし、バージョンが6.0以上であるかどうかを確認します。
// Get the system version of iOS at runtime.
NSString *versionString = [[UIDevice currentDevice] systemVersion];
// Convert the version string to a Version instance.
Version *version = [Version versionWithString:versionString];
// Dump the major, minor and micro version numbers.
NSLog(@"version = [%d, %d, %d]",
version.major, version.minor, version.micro);
// Check whether the version is greater than or equal to 6.0.
if ([version isGreaterThanOrEqualToMajor:6 minor:0])
{
// The iOS version is greater than or equal to 6.0.
}
// Another way to check whether iOS version is
// greater than or equal to 6.0.
if (6 <= version.major)
{
// The iOS version is greater than or equal to 6.0.
}
プロジェクトページ: nv-ios-version
川崎貴彦/ nv-ios-version
ブログ: Versionクラスで実行時にiOSのバージョンを取得して比較する
実行時にiOSのバージョンを取得し、Versionクラスと比較する
Swift Forget [[UIDevice currentDevice] systemVersion]とNSFoundationVersionNumberを使ってシステムのバージョンをチェックする新しい方法。
NSProcessInfo -isOperatingSystemAtLeastVersionを使用できます。
import Foundation
let yosemite = NSOperatingSystemVersion(majorVersion: 10, minorVersion: 10, patchVersion: 0)
NSProcessInfo().isOperatingSystemAtLeastVersion(yosemite) // false
UIDevice + IOSVersion.h
@interface UIDevice (IOSVersion)
+ (BOOL)isCurrentIOSVersionEqualToVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionGreaterThanVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionGreaterThanOrEqualToVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionLessThanVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionLessThanOrEqualToVersion:(NSString *)iOSVersion
@end
UIDevice + IOSVersion.m
#import "UIDevice+IOSVersion.h"
@implementation UIDevice (IOSVersion)
+ (BOOL)isCurrentIOSVersionEqualToVersion:(NSString *)iOSVersion
{
return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] == NSOrderedSame;
}
+ (BOOL)isCurrentIOSVersionGreaterThanVersion:(NSString *)iOSVersion
{
return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] == NSOrderedDescending;
}
+ (BOOL)isCurrentIOSVersionGreaterThanOrEqualToVersion:(NSString *)iOSVersion
{
return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] != NSOrderedAscending;
}
+ (BOOL)isCurrentIOSVersionLessThanVersion:(NSString *)iOSVersion
{
return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] == NSOrderedAscending;
}
+ (BOOL)isCurrentIOSVersionLessThanOrEqualToVersion:(NSString *)iOSVersion
{
return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] != NSOrderedDescending;
}
@end
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
// Your code here
}
もちろん、NSFoundationVersionNumber_iOS_6_1
は、確認したいiOSのバージョンに応じて適切なものに変更する必要があります。私が今書いたものは、おそらくデバイスがiOS7かそれ以前のバージョンを実行しているかどうかをテストするときによく使われるでしょう。
パーティーには少し時間がかかりますが、iOS 8.0を考慮すると、これは関連性があるかもしれません。
あなたが使用を避けることができるならば
[[UIDevice currentDevice] systemVersion]
代わりに、メソッド/クラス/その他の存在を確認してください。
if ([self.yourClassInstance respondsToSelector:@selector(<yourMethod>)])
{
//do stuff
}
私はそれが私がiOS 8.0のためにrequestWhenInUseAuthorizationを呼ばなければならない位置マネージャにとって有用であるとわかりました、しかし、メソッドはiOS <8のために利用できません
一般に、バージョン番号をチェックして存在する必要があるかどうかを判断するよりも、オブジェクトが特定のセレクターを実行できるかどうかを確認する方が適切です。
これがオプションではない場合、[@"5.0" compare:@"5" options:NSNumericSearch]
はNSOrderedDescending
を返すため、ここでは少し注意する必要があります。ここにNSOrderedSame
が期待できます。これは少なくとも理論的な懸念であり、私の意見では防御する価値があります。
また、合理的に比較することができない悪いバージョン入力の可能性も考慮する価値があります。 Appleは、3つの定義済み定数NSOrderedAscending
、NSOrderedSame
、およびNSOrderedDescending
を提供しますが、NSOrderedUnordered
と呼ばれるものの使用を考えられる2つのことを比較せず、これを示す値を返します。
さらに、Appleが3つの定義済み定数をいつか拡張してさまざまな戻り値を許可し、!= NSOrderedAscending
を比較するのは賢明ではありません。
これで、次のコードを検討してください。
typedef enum {kSKOrderedNotOrdered = -2, kSKOrderedAscending = -1, kSKOrderedSame = 0, kSKOrderedDescending = 1} SKComparisonResult;
@interface SKComparator : NSObject
+ (SKComparisonResult)comparePointSeparatedVersionNumber:(NSString *)vOne withPointSeparatedVersionNumber:(NSString *)vTwo;
@end
@implementation SKComparator
+ (SKComparisonResult)comparePointSeparatedVersionNumber:(NSString *)vOne withPointSeparatedVersionNumber:(NSString *)vTwo {
if (!vOne || !vTwo || [vOne length] < 1 || [vTwo length] < 1 || [vOne rangeOfString:@".."].location != NSNotFound ||
[vTwo rangeOfString:@".."].location != NSNotFound) {
return SKOrderedNotOrdered;
}
NSCharacterSet *numericalCharSet = [NSCharacterSet characterSetWithCharactersInString:@".0123456789"];
NSString *vOneTrimmed = [vOne stringByTrimmingCharactersInSet:numericalCharSet];
NSString *vTwoTrimmed = [vTwo stringByTrimmingCharactersInSet:numericalCharSet];
if ([vOneTrimmed length] > 0 || [vTwoTrimmed length] > 0) {
return SKOrderedNotOrdered;
}
NSArray *vOneArray = [vOne componentsSeparatedByString:@"."];
NSArray *vTwoArray = [vTwo componentsSeparatedByString:@"."];
for (NSUInteger i = 0; i < MIN([vOneArray count], [vTwoArray count]); i++) {
NSInteger vOneInt = [[vOneArray objectAtIndex:i] intValue];
NSInteger vTwoInt = [[vTwoArray objectAtIndex:i] intValue];
if (vOneInt > vTwoInt) {
return kSKOrderedDescending;
} else if (vOneInt < vTwoInt) {
return kSKOrderedAscending;
}
}
if ([vOneArray count] > [vTwoArray count]) {
for (NSUInteger i = [vTwoArray count]; i < [vOneArray count]; i++) {
if ([[vOneArray objectAtIndex:i] intValue] > 0) {
return kSKOrderedDescending;
}
}
} else if ([vOneArray count] < [vTwoArray count]) {
for (NSUInteger i = [vOneArray count]; i < [vTwoArray count]; i++) {
if ([[vTwoArray objectAtIndex:i] intValue] > 0) {
return kSKOrderedAscending;
}
}
}
return kSKOrderedSame;
}
@end
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
その後、次のようにif条件を追加してください -
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"10.0")) {
//Your code
}
#define _kisiOS7 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
if (_kisiOS7) {
NSLog(@"iOS7 or greater")
}
else {
NSLog(@"Less than iOS7");
}
以下のコードを試してください。
NSString *versionString = [[UIDevice currentDevice] systemVersion];
7.0や6.0.3のようなバージョンがあるので、比較するために単純にバージョンを数値に変換することができます。 versionが7.0のようなものであれば、単にそれに別の ".0"を追加してからその数値を取ります。
int version;
NSString* iosVersion=[[UIDevice currentDevice] systemVersion];
NSArray* components=[iosVersion componentsSeparatedByString:@"."];
if ([components count]==2) {
iosVersion=[NSString stringWithFormat:@"%@.0",iosVersion];
}
iosVersion=[iosVersion stringByReplacingOccurrencesOfString:@"." withString:@""];
version=[iosVersion integerValue];
6.0.0の場合
if (version==600) {
// Do something
}
7.0の場合
if (version==700) {
// Do something
}
OSのバージョン文字列値を取得するためだけに:
[[UIDevice currentDevice] systemVersion]
#define IsIOS8 (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1)
私はこれが古い質問であることを知っていますが、誰かがAvailability.h
の中のコンパイル時マクロに言及するべきでした。ここにある他のすべてのメソッドはランタイムソリューションであり、ヘッダーファイル、クラスカテゴリ、またはivar定義では機能しません。
このような場合は、
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_6_0
// iOS 6+ code here
#else
// Pre iOS 6 code here
#endif
h/t これ 答え
参照されている推奨される方法を使用して...ヘッダファイルに定義がない場合は、いつでも希望のIOSversiónのデバイスを使ってコンソールに表示することができます。
- (BOOL) isIOS8OrAbove{
float version802 = 1140.109985;
float version8= 1139.100000; // there is no def like NSFoundationVersionNumber_iOS_7_1 for ios 8 yet?
NSLog(@"la version actual es [%f]", NSFoundationVersionNumber);
if (NSFoundationVersionNumber >= version8){
return true;
}
return false;
}
Yasimturksソリューションのバリエーションとして、5つのマクロの代わりに1つの関数といくつかのenum値を定義しました。私はそれがよりエレガントだと思いますが、それは好みの問題です。
使用法:
if (systemVersion(LessThan, @"5.0")) ...
.hファイル:
typedef enum {
LessThan,
LessOrEqual,
Equal,
GreaterOrEqual,
GreaterThan,
NotEqual
} Comparison;
BOOL systemVersion(Comparison test, NSString* version);
.mファイル:
BOOL systemVersion(Comparison test, NSString* version) {
NSComparisonResult result = [[[UIDevice currentDevice] systemVersion] compare: version options: NSNumericSearch];
switch (test) {
case LessThan: return result == NSOrderedAscending;
case LessOrEqual: return result != NSOrderedDescending;
case Equal: return result == NSOrderedSame;
case GreaterOrEqual: return result != NSOrderedAscending;
case GreaterThan: return result == NSOrderedDescending;
case NotEqual: return result != NSOrderedSame;
}
}
アプリのプレフィックスを名前、特にComparison
型に追加する必要があります。
SwiftでiOSのバージョンを確認するための解決策
switch (UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch)) {
case .OrderedAscending:
println("iOS < 8.0")
case .OrderedSame, .OrderedDescending:
println("iOS >= 8.0")
}
この解決策の長所:どちらの方法を使っても、OSのバージョン番号をチェックすることは単なる悪い習慣です。依存関係をこのようにハードコードすることは絶対に避け、機能、機能、またはクラスの存在を常に確認してください。このことを考慮; Appleは、下位互換性のあるクラスのバージョンをリリースするかもしれません。その場合、あなたのロジックはクラスの存在ではなくOSのバージョン番号を探すので、あなたが提案するコードは決してそれを使いません。
( この情報の出所 )
Swiftでクラスの存在を確認するための解決策
if (objc_getClass("UIAlertController") == nil) {
// iOS 7
} else {
// iOS 8+
}
if (NSClassFromString("UIAlertController") == nil)
はiOS 7.1および8.2を使用するiOSシミュレータ上では正常に機能するため使用しないでください。ただし、iOS 7.1を使用する実際のデバイスでテストすると、残念ながらコードスニペットのelse部分を通過しないことに気付きます。
これを試して
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
// do some work
}
float deviceOSVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
float versionToBeCompared = 3.1.3; //(For Example in your case)
if(deviceOSVersion < versionToBeCompared)
//Do whatever you need to do. Device version is lesser than 3.1.3(in your case)
else
//Device version should be either equal to the version you specified or above
Obj-C++ 11のより一般的なバージョン(おそらく、これらのうちのいくつかをNSString/C関数で置き換えることができますが、これはより冗長な方法です。あなたはただメジャーバージョン(例えばswitch([self splitSystemVersion][0]) {case 4: break; case 5: break; }
)をオンにしたいだけです。
#include <boost/lexical_cast.hpp>
- (std::vector<int>) splitSystemVersion {
std::string version = [[[UIDevice currentDevice] systemVersion] UTF8String];
std::vector<int> versions;
auto i = version.begin();
while (i != version.end()) {
auto nextIllegalChar = std::find_if(i, version.end(), [] (char c) -> bool { return !isdigit(c); } );
std::string versionPart(i, nextIllegalChar);
i = std::find_if(nextIllegalChar, version.end(), isdigit);
versions.Push_back(boost::lexical_cast<int>(versionPart));
}
return versions;
}
/** Losslessly parse system version into a number
* @return <0>: the version as a number,
* @return <1>: how many numeric parts went into the composed number. e.g.
* X.Y.Z = 3. You need this to know how to compare again <0>
*/
- (std::Tuple<int, int>) parseSystemVersion {
std::string version = [[[UIDevice currentDevice] systemVersion] UTF8String];
int versionAsNumber = 0;
int nParts = 0;
auto i = version.begin();
while (i != version.end()) {
auto nextIllegalChar = std::find_if(i, version.end(), [] (char c) -> bool { return !isdigit(c); } );
std::string versionPart(i, nextIllegalChar);
i = std::find_if(nextIllegalChar, version.end(), isdigit);
int part = (boost::lexical_cast<int>(versionPart));
versionAsNumber = versionAsNumber * 100 + part;
nParts ++;
}
return {versionAsNumber, nParts};
}
/** Assume that the system version will not go beyond X.Y.Z.W format.
* @return The version string.
*/
- (int) parseSystemVersionAlt {
std::string version = [[[UIDevice currentDevice] systemVersion] UTF8String];
int versionAsNumber = 0;
int nParts = 0;
auto i = version.begin();
while (i != version.end() && nParts < 4) {
auto nextIllegalChar = std::find_if(i, version.end(), [] (char c) -> bool { return !isdigit(c); } );
std::string versionPart(i, nextIllegalChar);
i = std::find_if(nextIllegalChar, version.end(), isdigit);
int part = (boost::lexical_cast<int>(versionPart));
versionAsNumber = versionAsNumber * 100 + part;
nParts ++;
}
// don't forget to pad as systemVersion may have less parts (i.e. X.Y).
for (; nParts < 4; nParts++) {
versionAsNumber *= 100;
}
return versionAsNumber;
}
これはSwiftバージョンです。
struct iOSVersion {
static let SYS_VERSION_FLOAT = (UIDevice.currentDevice().systemVersion as NSString).floatValue
static let iOS7 = (Version.SYS_VERSION_FLOAT < 8.0 && Version.SYS_VERSION_FLOAT >= 7.0)
static let iOS8 = (Version.SYS_VERSION_FLOAT >= 8.0 && Version.SYS_VERSION_FLOAT < 9.0)
static let iOS9 = (Version.SYS_VERSION_FLOAT >= 9.0 && Version.SYS_VERSION_FLOAT < 10.0)
}
使用法:
if iOSVersion.iOS8 {
//Do iOS8 code here
}
実際に動作する簡単な例:
switch UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch) {
case .OrderedSame, .OrderedDescending:
println("iOS >= 8.0")
case .OrderedAscending:
println("iOS < 8.0")
}
NSProcessInfoは8.0では動作しないので使用しないでください。2016年まではほとんど役に立ちません。
以下のSwiftコードをプロジェクトに追加して、iOSのバージョンやデバイスなどの情報に簡単にアクセスします。
class DeviceInfo: NSObject {
struct ScreenSize
{
static let SCREEN_WIDTH = UIScreen.main.bounds.size.width
static let SCREEN_HEIGHT = UIScreen.main.bounds.size.height
static let SCREEN_MAX_LENGTH = max(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
static let SCREEN_MIN_LENGTH = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
}
struct DeviceType
{
static let IS_IPHONE_4_OR_LESS = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0
static let IS_IPHONE_5 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0
static let IS_IPHONE_6 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH >= 667.0
static let IS_IPHONE_6P = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0
static let IS_IPHONE_X = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 812.0
static let IS_IPAD = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1024.0
static let IS_IPAD_PRO = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1366.0
}
struct VersionType{
static let SYS_VERSION_FLOAT = (UIDevice.current.systemVersion as NSString).floatValue
static let iOS7 = (VersionType.SYS_VERSION_FLOAT < 8.0 && VersionType.SYS_VERSION_FLOAT >= 7.0)
static let iOS8 = (VersionType.SYS_VERSION_FLOAT >= 8.0 && VersionType.SYS_VERSION_FLOAT < 9.0)
static let iOS9 = (VersionType.SYS_VERSION_FLOAT >= 9.0 && VersionType.SYS_VERSION_FLOAT < 10.0)
static let iOS10 = (VersionType.SYS_VERSION_FLOAT >= 9.0 && VersionType.SYS_VERSION_FLOAT < 11.0)
}
}
これはyasirmturkマクロのSwiftバージョンです。それが何人かの人々に役立つことを願っています
// MARK: System versionning
func SYSTEM_VERSION_EQUAL_TO(v: String) -> Bool {
return UIDevice.currentDevice().systemVersion.compare(v, options: NSStringCompareOptions.NumericSearch) == NSComparisonResult.OrderedSame
}
func SYSTEM_VERSION_GREATER_THAN(v: String) -> Bool {
return UIDevice.currentDevice().systemVersion.compare(v, options: NSStringCompareOptions.NumericSearch) == NSComparisonResult.OrderedDescending
}
func SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v: String) -> Bool {
return UIDevice.currentDevice().systemVersion.compare(v, options: NSStringCompareOptions.NumericSearch) != NSComparisonResult.OrderedAscending
}
func SYSTEM_VERSION_LESS_THAN(v: String) -> Bool {
return UIDevice.currentDevice().systemVersion.compare(v, options: NSStringCompareOptions.NumericSearch) == NSComparisonResult.OrderedAscending
}
func SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v: String) -> Bool {
return UIDevice.currentDevice().systemVersion.compare(v, options: NSStringCompareOptions.NumericSearch) != NSComparisonResult.OrderedDescending
}
let kIsIOS7: Bool = SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO("7")
let kIsIOS7_1: Bool = SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO("7.1")
let kIsIOS8: Bool = SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO("8")
let kIsIOS9: Bool = SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO("9")