คำตอบด่วน ...
ตั้งแต่ Swift 2.0 คุณสามารถใช้#available
ในif
หรือguard
เพื่อป้องกันโค้ดที่ควรรันในระบบบางระบบเท่านั้น
if #available(iOS 9, *) {}
ใน Objective-C คุณต้องตรวจสอบเวอร์ชั่นของระบบและทำการเปรียบเทียบ
[[NSProcessInfo processInfo] operatingSystemVersion]
ใน iOS 8 ขึ้นไป
จาก Xcode 9:
if (@available(iOS 9, *)) {}
คำตอบทั้งหมด ...
ใน Objective-C และ Swift ในบางกรณีจะเป็นการดีกว่าที่จะหลีกเลี่ยงการพึ่งพาเวอร์ชันของระบบปฏิบัติการเพื่อบ่งชี้ถึงความสามารถของอุปกรณ์หรือระบบปฏิบัติการ โดยปกติจะมีวิธีการที่เชื่อถือได้มากขึ้นในการตรวจสอบว่าคุณลักษณะหรือคลาสเฉพาะนั้นพร้อมใช้งาน
ตรวจสอบสถานะของ API:
ตัวอย่างเช่นคุณสามารถตรวจสอบว่าUIPopoverController
มีอยู่ในอุปกรณ์ปัจจุบันโดยใช้NSClassFromString
:
if (NSClassFromString(@"UIPopoverController")) {
// Do something
}
สำหรับคลาสที่มีการเชื่อมโยงที่ไม่ปลอดภัยจะปลอดภัยในการส่งข้อความถึงคลาสโดยตรง โดยเฉพาะอย่างยิ่งการทำงานนี้สำหรับเฟรมเวิร์กที่ไม่ได้เชื่อมโยงอย่างชัดเจนว่า "จำเป็น" สำหรับคลาสที่หายไปนิพจน์จะประเมินค่าเป็นศูนย์ซึ่งจะทำให้เงื่อนไขล้มเหลว:
if ([LAContext class]) {
// Do something
}
บางคลาสเช่นCLLocationManager
และUIDevice
ให้วิธีการตรวจสอบความสามารถของอุปกรณ์:
if ([CLLocationManager headingAvailable]) {
// Do something
}
ตรวจสอบการมีสัญลักษณ์:
บางครั้งคุณต้องตรวจสอบว่ามีค่าคงที่หรือไม่ นี้ขึ้นมาใน iOS 8 ด้วยการแนะนำของUIApplicationOpenSettingsURLString
ที่ใช้ในการโหลด App -openURL:
การตั้งค่าผ่านทาง ค่าที่ไม่มีอยู่ก่อนหน้า iOS 8 การส่งผ่านศูนย์ไปที่ API นี้จะล้มเหลวดังนั้นคุณต้องระมัดระวังในการตรวจสอบการมีอยู่ของค่าคงที่ก่อน:
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)