2009-12-27 40 views
8

Làm cách nào để bạn có thể xác định và so sánh (>, <, v.v.) phiên bản hệ điều hành hiện tại của iPhone mà ứng dụng đang chạy? Có một lỗi nhất định trong 3.0 nhưng không phải trong 3.1+ vì vậy tôi muốn có thể bỏ qua một chút mã nếu phiên bản hệ điều hành hiện tại không> = 3.1.Cách xác định phiên bản hệ điều hành iPhone hiện tại khi chạy và so sánh các chuỗi phiên bản?

Điều này cần phải ở thời gian chạy không biên dịch thời gian!

+0

Hết sức tò mò, lỗi là gì? –

+0

Đây là lỗi dữ liệu cốt lõi gây ra sự cố khi cả hai 'setPropertiesToFetch:' và 'setFetchBatchSize:' được sử dụng trên 'NSFetchRequest'. Đây chỉ là một vấn đề trong 3.0 vì nó đã được giải quyết bằng 3.1. Đây là liên kết đến cuộc thảo luận: https://devforums.apple.com/message/101589#101589 –

Trả lời

13

Bạn có muốn xác định phiên bản của hệ điều hành không? SDK được cố định vào thời gian xây dựng, nhưng hệ điều hành có thể thay đổi. Để có được phiên bản hệ điều hành, sử dụng [UIDevice currentDevice]. systemVersion. Để có phiên bản SDK, tôi nghĩ bạn có thể sử dụng __IPHONE_OS_VERSION_MIN_REQUIRED.

+0

Ah được rồi, có phiên bản hệ điều hành hiện tại! Khi 'systemVersion' trả về một chuỗi (@" 1.2 ", @" 3.1.2 "), làm thế nào điều này có thể được so sánh và thực hiện so sánh như < or >? –

+0

- [NSString intValue] hoặc - [NSString floatValue] –

+0

Không thể kiểm tra tại thời điểm này, nhưng cách 'floatValue' xử lý giá trị như 3.2.1? Vì nó không phải là số dấu phẩy động hợp lệ? –

22

Bạn có thể ví dụ như làm một cái gì đó như thế này:

NSString *reqSysVer = @"3.1"; 
NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; 

if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) 
{ 
    //Do some clever stuff 
} 
+0

Điều này có sự thiếu hụt (lỗi?) - nếu reqSysVer là 4.2 và phiên bản hiện tại là 4.1, thì thử nghiệm thành công và bạn làm công cụ thông minh. Vấn đề là phương pháp đó chỉ cần kiểm tra số đầu tiên (tôi đã viết một số xét nghiệm để xác định điều đó.) Xem đề xuất của tôi là nhận xét tiếp theo. –

2

Một cách đáng tin cậy hơn là để làm một cái gì đó như thế này:

static inline NSComparisonResult compareCurVersionTo(int major, int minor, int point) 
{ 
    NSUInteger testVers = major*10000 + minor*100 + point; 
    NSUInteger curSysNum = 0; 
    NSUInteger multi = 10000; 
    for(NSString *n in [[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."]) { 
     curSysNum += [n integerValue] * multi; 
     multi /= 100; 
    } 
    if(curSysNum < testVers) return NSOrderedAscending; 
    if(curSysNum > testVers) return NSOrderedDescending; 
    return NSOrderedSame; 
} 

này xử lý các "Leopard" lỗi mà các phiên bản nhỏ là nhiều hơn "9".

+1

Xin chào David, cảm ơn câu trả lời của bạn. Xin vui lòng xem đoạn mã sau đây cung cấp cách tốt nhất để làm điều này kiểm tra: http://forr.st/~mOO Nó ẩn trong các ý kiến ​​theo câu trả lời được chấp nhận! –

Các vấn đề liên quan