2011-10-11 25 views
8

Tôi đang cố sử dụng thư viện có hương vị iOS5 và iOS4.3. Vấn đề tôi đang gặp là nhận được phiên bản đúng bao gồm điều kiện, ví dụ:Điều kiện bao gồm tiêu đề tùy thuộc vào phiên bản iOS

cho iOS5:

#include ios5stuff.h 
@implementation 
    // do stuff 
@end 

Đối với iOS4

#include ios4stuff.h 
@implementation 
    // do stuff 
@end 

tôi có thể thấy làm thế nào để có điều kiện bao gồm những thứ trong lớp học của thực hiện khối, nhưng không phải bên ngoài này. Bất cứ ai có thể đề nghị cách tốt nhất để làm điều này?

+0

Có thể trùng lặp: http://stackoverflow.com/questions/1864114/how-to-detect-iphone-os-version-using-macros – IronMensan

Trả lời

17

Bạn nên thể làm điều này (chưa được kiểm tra):

#import <Availability.h> 

#if defined(__IPHONE_5_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0 
#import "my_header_for_io5_and_above.h" 
#elif defined(__IPHONE_4_3) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_3 
#import "my_header_for_ios4.3.h" 
#else 
#error Your SDK is too old ! Need at least 4.3. 
#endif 
+0

Cảm ơn - dường như làm việc rất đẹp! – TimD

+0

Tôi có thể tìm thông tin để sử dụng được xác định (__ IPHONE_5_0) hoặc __IPHONE_OS_VERSION_MAX_ALLOWED ở đâu? –

1

Nếu bạn nhìn vào các tiêu đề Foundation (NSString, NSData ...) có rất nhiều

#if MAC_OS_X_VERSION_10_6 <= MAC_OS_X_VERSION_MAX_ALLOWED || __IPHONE_4_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED 
/* ... */ 
#endif 

Ngoài ra còn có được một định nghĩa cho

__IPHONE_OS_VERSION_MIN_REQUIRED 
+2

Đây là các chỉ thị thời gian biên dịch, do đó nếu bạn đang biên soạn với SDK iOS 5 thì chúng bao gồm. – rckoenes

0

Bạn có thể sử dụng phương thức this hoặc phương pháp mà DarkDust nói và kiểm tra phiên bản SDK iOS khi bạn đang biên soạn, nhưng thường là điều thú vị hơn nếu bạn xử lý một số công cụ này trong thời gian chạy vì người dùng có thể cập nhật thiết bị của họ và sau đó sử dụng các tính năng mới hoặc tích hợp hệ điều hành tốt hơn một cách kỳ diệu.

Có một số cách để thực hiện việc này. Trong SDKS mới hơn, bạn cần có NS_CLASS_AVAILABLE. Tuy nhiên, nếu bạn vẫn hỗ trợ các SDK cũ hơn, bạn có thể không hỗ trợ. Nhưng điều này là mục tiêu-c, vì vậy may mắn đứng về phía chúng tôi:

Class cls = NSClassFromString (@"NSRegularExpression"); 
if (cls) { 
    // Create an instance of the class and use it. 
} else { 
    // Alternate code path to follow when the 
    // class is not available. 
} 

Về cơ bản cách làm việc này là yêu cầu hệ thống kiểu nếu một lớp có sẵn, nếu không, nó sẽ trả về null. Điều này hơi nguy hiểm nếu không được kiểm tra vì nó là một chuỗi và sẽ biên dịch, nhưng bạn sẽ có thể xử lý nó.

Nếu đó là một lớp tồn tại ở cả hai nơi, bạn có thể kiểm tra tính sẵn sàng chọn trong thời gian chạy như thế này:

if([TheAppleClass instancesRespondToSelector:@selector(aMethod:)]) { 
    // invoke the inherited method 
    [myInstance aMethod:parameter]; 
} 

reference1reference2

Bằng cách này bạn có thể cung cấp một xây dựng mà vẫn hỗ trợ OS4. 2 người dùng với một tờ tweet tùy chỉnh, nhưng khi họ nâng cấp, họ sẽ tự động nhận được tích hợp twitter OS. Tuy nhiên, nó vẫn là tất cả trong một bản xây dựng duy nhất mà bạn có thể phát hành khi bạn muốn mà không phải chờ 90% thị trường để cập nhật trước khi bạn bắt đầu xa lánh người dùng hệ điều hành cũ hơn.

+1

Poster cho biết anh ta cần nhập một tiêu đề khác, tùy thuộc vào SDK mà anh ta liên kết. Vì vậy, giải pháp thời gian chạy rõ ràng là quá muộn ;-) – DarkDust

+0

Vâng, tôi biết những gì ông yêu cầu, và của bạn là một câu trả lời thực sự cho câu hỏi. Tôi đang thách thức nhu cầu đó. – slf

+0

Thật không may tôi cần phải nhập các tiêu đề khác nhau - nhưng đó là một bản tóm tắt thực sự hữu ích về kiểm tra trạng thái của mọi thứ trong thời gian chạy, cảm ơn. – TimD

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