it-swarm-id.com

Bagaimana kita bisa secara terprogram mendeteksi versi iOS mana perangkat berjalan?

Saya ingin memeriksa apakah pengguna menjalankan aplikasi di iOS kurang dari 5.0 dan menampilkan label di aplikasi.

Bagaimana cara mendeteksi iOS mana yang berjalan pada perangkat pengguna secara terprogram?

Terima kasih!

285
meetpd

Versi terbaik saat ini , tanpa harus berurusan dengan pencarian numerik dalam NSString adalah mendefinisikan macros (Lihat jawaban asli: Periksa Versi iPhone iOS =)

Makro-makro itu ada di github, lihat: https://github.com/carlj/CJAMacros/blob/master/CJAMacros/CJAMacros.h

Seperti ini:

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

dan gunakan seperti ini:

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

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

Versi kedaluwarsa di bawah ini

untuk mendapatkan versi OS:

[[UIDevice currentDevice] systemVersion]

mengembalikan string, yang dapat diubah menjadi int/float via

-[NSString floatValue]
-[NSString intValue]

seperti ini

Kedua nilai (floatValue, intValue) akan dilucuti karena tipenya, 5.0.1 akan menjadi 5.0 atau 5 (float atau int), untuk membandingkan secara tepat, Anda harus memisahkannya ke array INT yang memeriksa jawaban yang diterima di sini: - Periksa Versi iPhone iOS

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

dan bandingkan seperti ini

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

Untuk sintaks Swift 4.0

contoh di bawah ini hanya memeriksa apakah perangkat dari iOS11 atau versi yang lebih besar.

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

Memperbarui

Dari iOS 8 kita dapat menggunakan metode isOperatingSystemAtLeastVersion baru di 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
   }

Hati-hati karena ini akan macet di iOS 7, karena API tidak ada sebelum iOS 8. Jika Anda mendukung iOS 7 dan di bawah, Anda dapat dengan aman melakukan pemeriksaan dengan

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

Jawaban asli iOS <8

Demi kelengkapan, berikut adalah pendekatan alternatif yang diusulkan oleh Apple sendiri di iOS 7 UI Transition Guide , yang melibatkan memeriksa versi 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

Saya tahu saya sudah terlambat untuk menjawab pertanyaan ini. Saya tidak yakin apakah metode saya masih berfungsi pada versi iOS yang rendah (<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);

Anda bisa mendapatkan hasil ini:

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

atau periksa versi suka

Anda bisa mendapatkan makro di bawah ini dari di sini .

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;

}

Semoga ini membantu

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

Marek Sebera sering kali hebat, tetapi jika Anda seperti saya dan mendapati bahwa Anda perlu sering memeriksa versi iOS, Anda tidak ingin terus menjalankan makro dalam memori karena Anda akan mengalami sedikit pelambatan, terutama pada perangkat yang lebih lama.

Sebagai gantinya, Anda ingin menghitung versi iOS sebagai float sekali dan menyimpannya di suatu tempat. Dalam kasus saya, saya memiliki kelas singleton GlobalVariables yang saya gunakan untuk memeriksa versi iOS dalam kode saya menggunakan kode seperti ini:

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

Untuk mengaktifkan fungsi ini di aplikasi Anda, gunakan kode ini (untuk iOS 5+ menggunakan 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

Sekarang Anda dapat dengan mudah memeriksa versi iOS tanpa menjalankan makro terus-menerus. Perhatikan khususnya bagaimana saya mengonversi NSString [[UIDevice currentDevice] systemVersion] ke CGFloat yang selalu dapat diakses tanpa menggunakan salah satu metode yang tidak tepat yang telah ditunjukkan oleh banyak orang pada halaman ini. Pendekatan saya mengasumsikan string versi dalam format n.nn.nn (memungkinkan bit yang lebih baru hilang) dan berfungsi untuk iOS5 +. Dalam pengujian, pendekatan ini berjalan lebih cepat daripada menjalankan makro secara konstan.

Semoga ini bisa membantu siapa saja yang mengalami masalah yang saya alami!

5
Anton

Untuk mendapatkan informasi nomor versi yang lebih spesifik dengan memisahkan versi mayor dan minor:

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

Array vN akan berisi versi mayor dan minor sebagai string, tetapi jika Anda ingin melakukan perbandingan, nomor versi harus disimpan sebagai angka (ints). Anda dapat menambahkan kode ini untuk menyimpannya dalam array-C * versionNumbers:

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

* C-array digunakan di sini untuk sintaksis yang lebih ringkas.

2
JohnK

Di MonoTouch:

Untuk mendapatkan versi Mayor gunakan:

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

Untuk penggunaan versi minor:

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

Pemeriksaan sederhana untuk versi iOS kurang dari 5 (semua versi):

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