it-swarm.com.de

Wie kann programmgesteuert ermittelt werden, auf welcher iOS-Version das Gerät ausgeführt wird?

Ich möchte überprüfen, ob der Benutzer die App unter iOS unter 5.0 ausführt, und eine Bezeichnung in der App anzeigen.

Wie erkenne ich, welches iOS programmgesteuert auf dem Gerät des Benutzers ausgeführt wird?

Vielen Dank!

285
meetpd

Beste aktuelle Version , ohne sich mit der numerischen Suche in NSString befassen zu müssen, ist macros (Siehe ursprüngliche Antwort: Check iPhone iOS Version )

Diese Makros existieren in Github, siehe: https://github.com/carlj/CJAMacros/blob/master/CJAMacros/CJAMacros.h

So was:

#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)

und benutze sie so:

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

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

Veraltete Version unten

um die OS Version zu bekommen:

[[UIDevice currentDevice] systemVersion]

gibt einen String zurück, der über in int/float umgewandelt werden kann

-[NSString floatValue]
-[NSString intValue]

so was

Beide Werte (floatValue, intValue) werden aufgrund ihres Typs entfernt, 5.0.1 wird zu 5.0 oder 5 (float oder int). Um genau zu vergleichen, müssen Sie sie trennen, um die hier akzeptierte Antwort auf ein Array von INTs zu überprüfen: iPhone iOS Version prüfen

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

und vergleiche so

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

Für Swift 4.0 Syntax

das folgende Beispiel prüft nur, ob das Gerät von iOS11 oder höhere Version.

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

Aktualisieren

Ab iOS 8 können wir die neue isOperatingSystemAtLeastVersion Methode auf NSProcessInfo anwenden.

   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
   }

Beachten Sie, dass dies unter iOS 7 zum Absturz kommt, da die API vor iOS 8 noch nicht vorhanden war. Wenn Sie iOS 7 und niedriger unterstützen, können Sie die Überprüfung mit sicher durchführen

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

Ursprüngliche Antwort iOS <8

Der Vollständigkeit halber wird hier ein alternativer Ansatz vorgestellt, den Apple selbst in iOS 7 UI Transition Guide vorschlägt und bei dem die Foundation Framework-Version überprüft wird.

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

Ich weiß, ich bin zu spät, um diese Frage zu beantworten. Ich bin mir nicht sicher, ob meine Methode bei niedrigen iOS-Versionen (<5.0) noch funktioniert:

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);

Sie können diese Ergebnisse erhalten:

[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];

oder überprüfen Sie die Version wie

Die folgenden Makros erhalten Sie von hier .

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;

}

Hoffe das hilft

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

Marek Sebera ist die meiste Zeit großartig, aber wenn Sie wie ich sind und feststellen, dass Sie die iOS-Version häufig überprüfen müssen, möchten Sie nicht ständig ein Makro im Speicher ausführen, da Sie eine sehr leichte Verlangsamung feststellen. vor allem auf älteren Geräten.

Stattdessen möchten Sie die iOS-Version einmal als Float berechnen und irgendwo speichern. In meinem Fall habe ich eine GlobalVariables Singleton-Klasse, mit der ich die iOS-Version in meinem Code mit folgendem Code überprüfe:

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

Verwenden Sie diesen Code, um diese Funktion in Ihrer App zu aktivieren (für iOS 5+ mit 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

Jetzt können Sie ganz einfach die iOS-Version überprüfen, ohne ständig Makros ausführen zu müssen. Beachten Sie insbesondere, wie ich das [[UIDevice currentDevice] systemVersion] NSString zu einem CGFloat, auf den ständig zugegriffen werden kann, ohne eine der unsachgemäßen Methoden zu verwenden, auf die bereits auf dieser Seite hingewiesen wurde. Mein Ansatz geht davon aus, dass die Versionszeichenfolge im Format n.nn.nn vorliegt (wobei spätere Bits fehlen dürfen) und für iOS5 + funktioniert. Beim Testen läuft dieser Ansatz viel schneller als das ständige Ausführen des Makros.

Hoffe, das hilft jedem, der das Problem, das ich hatte, erlebt hat!

5
Anton

So erhalten Sie genauere Informationen zur Versionsnummer, wenn Haupt- und Nebenversion getrennt sind:

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

Das Array vN enthält die Haupt- und Nebenversionen als Zeichenfolgen. Wenn Sie jedoch Vergleiche anstellen möchten, sollten die Versionsnummern als Zahlen (ints) gespeichert werden. Sie können diesen Code hinzufügen, um sie im C-Array zu speichern. * versionNumbers:

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

* C-Arrays werden hier für eine präzisere Syntax verwendet.

2
JohnK

In MonoTouch:

Um die Hauptversion zu erhalten, verwenden Sie:

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

Für kleinere Versionen verwenden Sie:

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

Ein einfacher Check für iOS-Versionen unter 5 (alle Versionen):

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