iOS Deployment Target: คืออะไร, เวอร์ชัน iOS ขั้นต่ำและการกำหนดค่า

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-02-08 เวลาอ่าน: 14 นาที

iOS Deployment Target (หรือที่เรียกว่า iOS Target, Deployment Target) คือเวอร์ชันขั้นต่ำของระบบปฏิบัติการ Apple ที่สามารถรันแอปพลิเคชันได้ พารามิเตอร์นี้ถูกตั้งค่าในโปรเจกต์ Xcode และกำหนดขอบเขตความเข้ากันได้: เมื่อเลือก iOS 16.0 แอปพลิเคชันจะถูกติดตั้งบนอุปกรณ์ที่ใช้ iOS 16.0 หรือใหม่กว่าเท่านั้น ตาม Apple Developer Documentation การเลือก Deployment Target ที่ถูกต้องส่งผลทั้งต่อการเข้าถึงกลุ่มเป้าหมายและการเข้าถึง API ใหม่ของเฟรมเวิร์ก Swift และ Objective-C

ประเด็นสำคัญ

  • iOS Deployment Target — เวอร์ชัน iOS ขั้นต่ำสำหรับการติดตั้งและรันแอปพลิเคชัน เทียบเท่ากับ minSdkVersion สำหรับ Android
  • การกำหนดค่าใน Xcode: Project → Info → iOS Deployment Target รวมถึงใน Swift Package Manager และ CocoaPods
  • @available และ #available — กลไกของ Swift สำหรับการเรียก API ที่สูงกว่า Deployment Target ปัจจุบันอย่างปลอดภัย
  • Deployment Target ใหม่แต่ละตัวให้เข้าถึง API ใหม่ของ SwiftUI, UIKit, Foundation, AppKit แต่ลดความครอบคลุมของอุปกรณ์
  • App Store กรองแอปพลิเคชันตามเวอร์ชัน iOS ของอุปกรณ์ — หากไม่ตรงกับ Deployment Target แอปพลิเคชันจะไม่แสดง

iOS Deployment Target คืออะไร?

iOS Deployment Target คือพารามิเตอร์การกำหนดค่า Xcode ที่ระบุเวอร์ชันเก่าที่สุดของ iOS, iPadOS, tvOS, watchOS หรือ visionOS ที่แอปพลิเคชันสามารถรันได้ แต่ละโปรเจกต์ Xcode มีการตั้งค่านี้แยกต่างหากสำหรับแต่ละแพลตฟอร์ม ตัวอย่างเช่น แอป iOS อาจมี Deployment Target 16.0 ในขณะที่ส่วนขยาย watchOS อาจเป็น 9.0 หากอุปกรณ์ของผู้ใช้รัน iOS 15.0 แอปที่มี Target 16.0 จะไม่ปรากฏใน App Store และไม่สามารถติดตั้งผ่านการแจกจ่ายโดยตรง

กลไกของ Deployment Target ขึ้นอยู่กับการตรวจสอบเวอร์ชัน OS ระหว่างการติดตั้ง App Store ของ iOS เปรียบเทียบค่า Deployment Target จาก Info.plist (คีย์ MinimumOSVersion) กับเวอร์ชัน OS บนอุปกรณ์ของผู้ใช้ หากเวอร์ชันอุปกรณ์ต่ำกว่า — ปุ่ม "ดาวน์โหลด" จะถูกบล็อก และ API ของ App Store จะไม่ส่งคืนแอปพลิเคชันในผลการค้นหาสำหรับอุปกรณ์นั้น พฤติกรรมเดียวกันนี้ใช้กับ TestFlight, การแจกจ่าย ad-hoc และองค์กร

ตามข้อมูล StatCounter ณ เดือนมิถุนายน 2025 iOS 16 คิดเป็นประมาณ 48% ของอุปกรณ์ iPhone ที่ใช้งานอยู่ iOS 17 — 35% iOS 18 — 12% เวอร์ชันเก่ากว่า — ประมาณ 5% การเลือก Deployment Target 16.0 ครอบคลุม 83% ของอุปกรณ์ Target 17.0 — 35% (เฉพาะ iOS 17+) ตัวเลขเหล่านี้มีความสำคัญต่อการตัดสินใจ: ยิ่ง Target สูงเท่าไร กลุ่มเป้าหมายก็ยิ่งเล็กลง แต่การเข้าถึง API ล่าสุดของ SwiftUI และ UIKit ก็ยิ่งง่ายขึ้น

Deployment Targetส่วนแบ่งอุปกรณ์ (มิถุนายน 2025)คุณสมบัติที่มี
iOS 15.0~90%Swift Concurrency, async/await, Focus State
iOS 16.0~83%SwiftUI NavigationStack, Layout, Live Activities
iOS 17.0~35%Observation, SwiftData, TipKit, Reactive Editing
iOS 18.0~12%Apple Intelligence API ใหม่, SwiftUI ที่ปรับปรุงแล้ว

iOS รุ่นใหม่แต่ละรุ่นเพิ่มไม่เพียงแต่คุณสมบัติสำหรับผู้ใช้ แต่ยังเพิ่ม API สำหรับนักพัฒนาด้วย ตัวปรับแต่ง SwiftUI ใหม่ เมธอด UIKit เฟรมเวิร์กอย่าง SwiftData และ Observation จะใช้ได้เฉพาะกับ Deployment Target ที่กำหนดเท่านั้น นักพัฒนาต้องสร้างสมดุลระหว่างการเข้าถึงกลุ่มเป้าหมายและความพร้อมใช้งานของเครื่องมือสมัยใหม่

iOS Deployment Target เปรียบเทียบกับ minSdkVersion: การเปรียบเทียบกับ Android

iOS Deployment Target และ minSdkVersion ของ Android ทำหน้าที่เหมือนกัน — กำหนดเวอร์ชัน OS ขั้นต่ำสำหรับแอปพลิเคชัน อย่างไรก็ตาม กลไกการนำไปใช้และเครื่องมือที่เกี่ยวข้องแตกต่างกัน การทำความเข้าใจความแตกต่างเหล่านี้มีประโยชน์สำหรับนักพัฒนาที่ทำงานบนทั้งสองแพลตฟอร์มและช่วยหลีกเลี่ยงความสับสนเมื่อสลับระหว่างระบบนิเวศ

ใน iOS เวอร์ชันขั้นต่ำถูกกำหนดผ่านการตั้งค่าบิลด์ของ Xcode (IPHONEOS_DEPLOYMENT_TARGET) และเก็บไว้ใน Info.plist (MinimumOSVersion) ใน Android — ผ่าน build.gradle (minSdkVersion) และ AndroidManifest.xml (<uses-sdk android:minSdkVersion>) iOS ไม่มีสิ่งที่เทียบเท่ากับ targetSdkVersion และ compileSdkVersion — การเปลี่ยนแปลงพฤติกรรมใน iOS จัดการโดย SDK ที่ใช้คอมไพล์แอปพลิเคชัน (Base SDK) และเวอร์ชัน OS บนอุปกรณ์

พารามิเตอร์iOSAndroid
เวอร์ชันขั้นต่ำDeployment Target (IPHONEOS_DEPLOYMENT_TARGET)minSdkVersion
ระบุที่ไหนXcode Build Settings → Info.plistbuild.gradle → AndroidManifest.xml
การตรวจสอบในโค้ด@available / #available / if #availableBuild.VERSION.SDK_INT
เวอร์ชันเป้าหมายBase SDK (ล่าสุดเสมอ)compileSdkVersion + targetSdkVersion
การกรองในร้านค้าApp Store: MinimumOSVersionGoogle Play: minSdkVersion

ความแตกต่างหลักคือ Base SDK ใน iOS เป็นเวอร์ชันล่าสุดที่ติดตั้งใน Xcode เสมอ นักพัฒนาไม่สามารถเลือก compileSdkVersion ได้เหมือนใน Android — แอปพลิเคชันจะคอมไพล์กับ SDK ล่าสุดที่มีอยู่เสมอ การเปลี่ยนแปลงพฤติกรรมใหม่ใน iOS ใช้กับแอปพลิเคชันทั้งหมดที่คอมไพล์ด้วย Base SDK ใหม่ โดยไม่คำนึงถึง Deployment Target ใน Android targetSdkVersion ให้การควบคุมการเปลี่ยนแปลงพฤติกรรม iOS ไม่มีการแยกนี้

การเปลี่ยนแปลงพฤติกรรมใน iOS เทียบกับ Android

แตกต่างจาก Android ที่การเปลี่ยนแปลงพฤติกรรมผูกกับ targetSdkVersion iOS ใช้การเปลี่ยนแปลงพฤติกรรมกับแอปพลิเคชันทั้งหมดที่คอมไพล์ด้วยเวอร์ชันใหม่ของ Xcode และ Base SDK ตัวอย่างเช่น iOS 13 นำโหมดมืดมาใช้ — แอปพลิเคชันทั้งหมดที่สร้างด้วย Xcode 11 และ iOS 13 SDK ได้รับการรองรับธีมมืดโดยอัตโนมัติ โดยไม่คำนึงถึง Deployment Target ใน Android การเปลี่ยนแปลงที่คล้ายกัน (Scoped Storage) ใช้เฉพาะเมื่อ targetSdk >= 29 นักพัฒนา iOS ต้องเตรียมพร้อมสำหรับการเปลี่ยนแปลงพฤติกรรมกับ Xcode ใหม่แต่ละรุ่น โดยไม่สามารถเลื่อนออกไปได้

ความรู้เกี่ยวกับทั้งสองแพลตฟอร์มช่วยให้คาดการณ์ผลลัพธ์ของการเลือกเวอร์ชันขั้นต่ำและวางแผนอัปเดตโค้ดสำหรับ API ใหม่ ที่ IT Sectr เราใช้ทั้งสองระบบนิเวศมาตั้งแต่ปี 2017 — การปฏิบัติแสดงให้เห็นว่าควรเลือก iOS Deployment Target ต่ำกว่าเวอร์ชันปัจจุบัน 2–3 รุ่นเพื่อความสมดุลระหว่างความครอบคลุมและการทำงาน

วิธีกำหนดค่า Deployment Target ใน Xcode

การกำหนดค่า iOS Deployment Target ทำได้ในหลายตำแหน่งของโปรเจกต์: Target หลัก โปรเจกต์ Pods (หากใช้ CocoaPods) การพึ่งพา Swift Package Manager และ Target ของ Widget/Extension หากค่าแตกต่างระหว่างแอปพลิเคชันหลักและส่วนขยาย App Store จะใช้ค่าสูงสุดทั้งหมด — หมายถึงส่วนขยายไม่สามารถมี Target ต่ำกว่าแอปพลิเคชันหลัก

การกำหนดค่าในโปรแกรมแก้ไขโปรเจกต์ Xcode

เปิดโปรเจกต์ Xcode → เลือก Target → แท็บ General → ส่วน Minimum iOS Deployment รายการแบบเลื่อนลงแสดงเวอร์ชัน iOS SDK ที่มีทั้งหมดซึ่งติดตั้งใน Xcode การเปลี่ยนแปลงใช้กับสคีมาบิลด์ทั้งหมด อีกทางเลือกหนึ่ง — แท็บ Build Settings → iOS Deployment Target (IPHONEOS_DEPLOYMENT_TARGET) หากโปรเจกต์มี Target ส่วนขยายหลายตัว (Widget, Watch) แต่ละตัวจะมี Deployment Target ของตัวเอง

การกำหนดค่าผ่าน Swift Package Manager

สำหรับไลบรารีที่แจกจ่ายผ่าน SPM Deployment Target ระบุใน Package.swift ในพารามิเตอร์ platforms ไลบรารีที่มี platforms: [.iOS(.v16)] จะใช้ได้เฉพาะกับแอปพลิเคชันที่มี Deployment Target iOS 16.0+ เมื่อเพิ่มไลบรารีดังกล่าวลงในโปรเจกต์ที่มี Target 15.0 Xcode จะแสดงข้อผิดพลาดความไม่เข้ากัน ใน CocoaPods Deployment Target ถูกตั้งค่าใน Podfile: platform :ios, '16.0'

swift
// Package.swift — Deployment Target สำหรับไลบรารี SPM
import PackageDescription

let package = Package(
    name: "MyLibrary",
    platforms: [
        .iOS(.v16),
        .macOS(.v13),
        .watchOS(.v9),
        .tvOS(.v16)
    ],
    products: [
        .library(
            name: "MyLibrary",
            targets: ["MyLibrary"]
        )
    ],
    dependencies: [],
    targets: [
        .target(
            name: "MyLibrary",
            swiftSettings: [
                .enableUpcomingFeature("ConciseMagicFile")
            ]
        )
    ]
)

// การตรวจสอบความเข้ากันได้ในโค้ด
#if swift(>=5.9)
// คุณสมบัติ Swift 5.9+ (Xcode 15+)
#endif

ในตัวอย่าง Package.swift กำหนดแพลตฟอร์ม iOS 16+, macOS 13+, watchOS 9+, tvOS 16+ โปรเจกต์ใด ๆ ที่มี Deployment Target ต่ำกว่า iOS 16.0 จะไม่สามารถเพิ่มไลบรารีนี้ได้ พารามิเตอร์ swiftSettings รวมถึงคุณสมบัติที่จะมาถึงสำหรับ Swift เวอร์ชันเฉพาะ SPM ตรวจสอบความเข้ากันได้ของ platforms โดยอัตโนมัติเมื่อเพิ่มการพึ่งพา

CocoaPods และ Podfile

Podfile ใช้คำสั่ง platform :ios, '16.0' หลังจาก pod install CocoaPods จะตรวจสอบ Deployment Target ของแต่ละไลบรารี pod: หากอย่างน้อยหนึ่งตัวมี Target สูงกว่าโปรเจกต์ การติดตั้งจะล้มเหลวพร้อมข้อผิดพลาด "The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 17.0, but the range of supported deployment target versions is 16.0 to 17.0" วิธีแก้ไขคือลด Target ของ pod ที่มีปัญหาหรือเพิ่ม Target ของโปรเจกต์

ruby
# Podfile — ตัวอย่างกับ Deployment Target
platform :ios, '16.0'

# ไม่สนใจคำเตือนของ Deployment Target
post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '16.0'
        end
    end
end

ฮุก post_install ใน Podfile บังคับตั้งค่า Deployment Target 16.0 สำหรับไลบรารี pod ทั้งหมด สิ่งนี้มีประโยชน์เมื่อ pod ตัวใดตัวหนึ่งระบุ Target สูงกว่าที่จำเป็นสำหรับฟังก์ชันการทำงาน ใช้เฉพาะเมื่อคุณแน่ใจว่า pod ไม่ได้ใช้ API จากเวอร์ชัน iOS ที่สูงกว่า

การตรวจสอบ @available และ #available ในโค้ด Swift และ Objective-C

@available และ #available คือคำสั่ง Swift และ Objective-C สำหรับเรียก API ที่มีเฉพาะในบางเวอร์ชัน OS อย่างปลอดภัย หาก Deployment Target ของโปรเจกต์คือ iOS 16.0 และเมธอดต้องใช้ iOS 17.0 การเรียกโดยตรงจะทำให้เกิดข้อผิดพลาดขณะรันไทม์บนอุปกรณ์ที่ใช้ iOS 16.0–16.x การตรวจสอบความพร้อมใช้งานเป็นเครื่องมือบังคับสำหรับรองรับหลายเวอร์ชัน iOS

@available — การตรวจสอบแบบประกาศ

คำสั่ง @available ใช้กับคลาส เมธอด หรือไฟล์ทั้งหมด หากระบุ @available(iOS 17.0, *) หน้าคลาส คลาสทั้งหมดจะใช้ได้เฉพาะบน iOS 17.0+ การพยายามเรียกคลาสบน iOS 16.0 จะทำให้เกิดข้อผิดพลาดขณะรันไทม์ ใช้ @available เพื่อแยกโมดูลฟังก์ชันการทำงานทั้งหมดที่เฉพาะเจาะจงกับเวอร์ชัน OS หนึ่ง ๆ สำหรับเมธอดภายในคลาส @available อนุญาตให้ซ่อนฟังก์ชันแต่ละตัวได้

#available — การดำเนินการตามเงื่อนไข

คำสั่ง #available (if #available) ตรวจสอบเวอร์ชัน OS ขณะรันไทม์และดำเนินการโค้ดเฉพาะเมื่อตรงกันเท่านั้น ใช้ภายในฟังก์ชันเพื่อเลือกระหว่างการใช้งานใหม่และเก่า ใน Objective-C สิ่งที่เทียบเท่าคือ @available(iOS 17.0, *) ภายใน if สำหรับการตรวจสอบที่ซับซ้อนยิ่งขึ้น ให้ใช้ ProcessInfo.processInfo.isOperatingSystemAtLeast เพื่อเปรียบเทียบส่วนประกอบเวอร์ชัน (major, minor, patch)

swift
import UIKit
import SwiftUI

// 1. @available — ทั้งคลาสสำหรับ iOS 17+ เท่านั้น
@available(iOS 17.0, *)
class ObservationViewModel: ObservableObject {
    @Published var name: String = "User"

    // ใช้ Observation framework — ใช้ได้เฉพาะ iOS 17+
    func updateWithObservation() {
        let newName = "Updated via Observation"
        name = newName
    }
}

// 2. #available — การเรียกตามเงื่อนไขภายในฟังก์ชัน
func configureLiveActivity() {
    if #available(iOS 16.1, *) {
        // API Live Activities — ใช้ได้ตั้งแต่ iOS 16.1
        let activity = Activity<MyAttributes>(
            attributes: MyAttributes(name: "Live"),
            contentState: MyContentState(value: 42)
        )
        Task {
            await activity.activate()
        }
    } else {
        // สำรอง: การแจ้งเตือนแบบ push หรือไม่มี
        print("Live Activities ไม่พร้อมใช้งาน")
    }
}

// 3. ProcessInfo — การตรวจสอบเวอร์ชันที่แม่นยำ
func checkOSVersion() {
    let osVersion = ProcessInfo.processInfo.operatingSystemVersion
    print("iOS \(osVersion.majorVersion).\(osVersion.minorVersion).\(osVersion.patchVersion)")

    // การเปรียบเทียบส่วนประกอบ
    if osVersion.majorVersion >= 17 {
        print("ตรวจพบ iOS 17+")
    }
}

// 4. Objective-C @available
// Objective-C ใช้ @available:
// if (@available(iOS 17.0, *)) { }

// 5. @available พร้อมอาร์กิวเมนต์ unavailable
@available(*, unavailable, message: "Use configureWithSwiftUI instead")
func legacyConfigureMethod() { }

คลาส ObservationViewModel ใช้ @available เพื่อแยกฟังก์ชันการทำงาน iOS 17 ฟังก์ชัน configureLiveActivity ใช้ #available เพื่อตรวจสอบ Live Activities (iOS 16.1+) พร้อมการใช้งานสำรอง ProcessInfo ตรวจสอบเวอร์ชัน OS ที่แน่นอน @available(*, unavailable) ทำเครื่องหมายเมธอดว่าไม่พร้อมใช้งานในทุกเวอร์ชัน — สำหรับการย้ายไปยัง API ใหม่ หากไม่มีการตรวจสอบเหล่านี้ แอปพลิเคชันที่มี Deployment Target 16.0 จะล่มบนอุปกรณ์ที่ใช้ iOS 16.0 เมื่อเรียก API iOS 17

Objective-C และ @available

Objective-C ใช้ @available(iOS 17.0, *) ด้วยความหมายเดียวกับ Swift #aware ข้อแตกต่าง: Objective-C ตรวจสอบขณะรันไทม์ Swift #available ก็ตรวจสอบขณะรันไทม์เช่นกัน แต่มีคำแนะนำคอมไพเลอร์สำหรับการเพิ่มประสิทธิภาพสาขา สำหรับโค้ด Objective-C ที่โต้ตอบกับ Swift จำเป็นต้องมีการตรวจสอบความพร้อมใช้งานฝั่ง Objective-C — สะพาน Swift ไม่ได้เพิ่มการตรวจสอบอัตโนมัติ

วิธีเลือก Deployment Target ที่เหมาะสมสำหรับโปรเจกต์ของคุณ

การเลือก iOS Deployment Target คือการตัดสินใจเชิงกลยุทธ์ที่ส่งผลต่อสามด้าน: การเข้าถึงกลุ่มเป้าหมาย API ที่มี และความซับซ้อนในการบำรุงรักษาโค้ด ไม่มีค่าที่ถูกต้องเพียงค่าเดียว — การเลือกขึ้นอยู่กับกลุ่มเป้าหมายของแอปพลิเคชัน คุณสมบัติขั้นต่ำที่จำเป็น และทรัพยากรของทีมสำหรับการรองรับความเข้ากันได้ย้อนหลัง

ปัจจัยแรก — สถิติการใช้งานเวอร์ชัน iOS Apple เผยแพร่ข้อมูลการติดตั้ง iOS ที่ WWDC และใน Apple Developer Dashboard ณ เดือนมิถุนายน 2025 การกระจายคือ: iOS 15 — ~7% iOS 16 — ~48% iOS 17 — ~35% iOS 18 — ~10% การเลือก Target 16.0 ให้ความครอบคลุม 83% Target 17.0 — 35% สำหรับแอปพลิเคชันมวลชน (โซเชียลเน็ตเวิร์ก ข้อความ อีคอมเมิร์ซ) แนะนำ Target 16.0 สำหรับแอปพลิเคชัน B2B เฉพาะที่มีข้อกำหนด API เฉพาะ — Target 17.0

ปัจจัยที่สอง — API ที่จำเป็น หากคุณสมบัติหลักของแอปพลิเคชันต้องใช้ SwiftData (iOS 17+), Observation (iOS 17+) หรือ Live Activities (iOS 16.1+) Target จะต้องไม่ต่ำกว่าเวอร์ชันที่ต้องการ การวิเคราะห์ API ที่จำเป็นในขั้นตอนการออกแบบป้องกันสถานการณ์ที่พบว่าต้องใช้ Target สูงกว่ากลางทางการพัฒนา ใช้การตรวจสอบความพร้อมใช้งานเป็นแผนสำรอง ไม่ใช่เป็นกลยุทธ์หลัก

ปัจจัยที่สาม — ทรัพยากรการทดสอบ การรองรับเวอร์ชัน iOS เก่าต้องการการทดสอบบนซิมูลเลเตอร์และอุปกรณ์จริงที่มีเวอร์ชันเหล่านั้น iOS 15 ทดสอบบน iPhone 6s/7 iOS 16 — บน iPhone 8/X iOS 17 — บน iPhone XS/XR แต่ละเวอร์ชันเพิ่มเติมของความเข้ากันได้ย้อนหลังเพิ่มเวลา QA หากทีมมีขนาดเล็ก การเลือก Target ต่ำกว่าเวอร์ชันปัจจุบัน 2–3 รุ่น (16.0) เป็นสิ่งที่สมเหตุสมผล — สมดุลระหว่างความครอบคลุมและความพยายาม

ประเภทแอปTarget ที่แนะนำความครอบคลุมเหตุผล
มวลชน (โซเชียล, ตลาดซื้อขาย)iOS 16.0~83%กลุ่มเป้าหมายสูงสุด
องค์กร / B2BiOS 16.0~83%อุปกรณ์องค์กรอัปเดตช้า
สตาร์ทอัพ / MVPiOS 17.0~35%พัฒนารวดเร็วบน API ใหม่
เกม (Metal 3+)iOS 17.0~35%ต้องใช้ API กราฟิกใหม่
ไลบรารี/SDKiOS 15.0~90%ความเข้ากันได้สูงสุดสำหรับลูกค้า

ไลบรารีและ SDK ควรมี Deployment Target ต่ำที่สุดเท่าที่เป็นไปได้ (15.0 หรือแม้แต่ 14.0) — ผู้ใช้ไลบรารีอาจมี Target สูงกว่าคุณ หากไลบรารีต้องการ iOS 17.0 ครึ่งหนึ่งของโปรเจกต์จะไม่สามารถใช้งานได้ สำหรับแอปพลิเคชัน ในทางกลับกัน คุณสามารถมี Target ที่สูงกว่าเพื่อเข้าถึง API ใหม่

วิธีลด Deployment Target หลังจากเพิ่มแล้ว

การลด iOS Deployment Target เป็นงานที่เกิดขึ้นเมื่อจำเป็นต้องขยายกลุ่มเป้าหมายหรือเมื่อเผยแพร่ไลบรารีที่เข้ากันได้กับโปรเจกต์เก่า แตกต่างจากการเพิ่ม การลดต้องทำงานกับโค้ดอย่างจริงจัง: คุณต้องแทนที่การเรียก API โดยตรงทั้งหมดที่ไม่พร้อมใช้งานใน Target ใหม่ (ต่ำกว่า) ด้วยการตรวจสอบ #available และการใช้งานสำรอง

ขั้นตอนแรก — สำรวจ API Xcode ไม่แสดงข้อผิดพลาดในการคอมไพล์เมื่อลด Target — มันเพียงเตือนด้วยคำเตือนสีเหลือง คุณต้องค้นหาเมธอดและคลาสทั้งหมดที่ทำเครื่องหมายด้วย @available(iOS N+, *) โดยที่ N สูงกว่า Target ใหม่ ใช้การค้นหาโปรเจกต์ (Cmd+Shift+F) ด้วยรูปแบบ "available(iOS" การเรียกแต่ละครั้งดังกล่าวเป็นตัวเลือกสำหรับการปรับโครงสร้าง

ขั้นตอนที่สอง — แทนที่ด้วยการตรวจสอบ #available การเรียก API แต่ละครั้งจากเวอร์ชันที่สูงกว่าจะถูกห่อใน if #available(iOS N+, *) { } else { } สำหรับคลาสทั้งหมด ให้ใช้ #if os(iOS) กับ @available ในระดับประเภท หาก API ไม่มีการสำรองที่สมเหตุสมผล (เช่น Live Activities) ฟังก์ชันการทำงานจะถูกปิดใช้งานสำหรับเวอร์ชันเก่าพร้อมการแจ้งเตือนผู้ใช้

swift
import UIKit
import SwiftUI

// การลด Deployment Target จาก 17.0 เป็น 16.0

// ก่อน (@available iOS 17.0):
@available(iOS 17.0, *)
func setupObservation() {
    // Observation framework — เฉพาะ iOS 17+
    let model = ObservationViewModel()
    // ...
}

// หลัง (การตรวจสอบ #available):
func setupObservationCompatible() {
    if #available(iOS 17.0, *) {
        // iOS 17+: Observation framework
        let model = ObservationViewModel()
        // ...
    } else {
        // iOS 16.x: ObservableObject กับ @Published
        let model = LegacyObservableViewModel()
        // ...
    }
}

// สำหรับ UIKit iOS 17+ API:
@available(iOS 17.0, *)
class ModernViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // ใช้ UIKit TraitChanges (iOS 17+)
        registerForTraitChanges([UITraitVerticalSizeClass.self]) { _, _ in }
    }
}

// สำรองสำหรับ iOS 16:
class LegacyViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // ไม่มี registerForTraitChanges — ใช้ traitCollectionDidChange
    }

    override func traitCollectionDidChange(_: UITraitCollection?) {
        super.traitCollectionDidChange(nil)
        // การจัดการการเปลี่ยนแปลง traits สำหรับ iOS 16
    }
}

// โรงงานสำหรับเลือกการใช้งานตามเวอร์ชัน iOS
func makeViewController() -> UIViewController {
    if #available(iOS 17.0, *) {
        return ModernViewController()
    } else {
        return LegacyViewController()
    }
}

โค้ดสาธิตการลด Target จาก iOS 17.0 เป็น 16.0 ฟังก์ชัน setupObservation ถูกแทนที่ด้วย setupObservationCompatible พร้อมการตรวจสอบ #available ViewController ถูกแบ่งเป็น Modern (iOS 17+) และ Legacy (iOS 16) พร้อมโรงงาน makeViewController ที่เลือกการใช้งานตามเวอร์ชัน OS สถาปัตยกรรมนี้อนุญาตให้รองรับสอง Deployment Target โดยไม่ต้องทำซ้ำโค้ดเบสทั้งหมด — เฉพาะโมดูลที่มีเวอร์ชัน

คำเตือนของ Xcode และการแก้ไข

หลังจากลด Deployment Target Xcode จะเน้นสีเหลืองการเรียก API ทั้งหมดที่ไม่พร้อมใช้งานใน Target ใหม่ คำเตือน "In iOS 16.0 and later" หมายถึงเมธอดต้องการเวอร์ชันที่สูงกว่า วิธีแก้ไข: เพิ่ม @available หรือ if #available (แนะนำ) ระงับผ่าน @available(*, deprecated) สำหรับการย้ายแบบค่อยเป็นค่อยไป หรือลบการเรียก การเปิดใช้งาน "Treat Warnings as Errors" ในโปรเจกต์จะเปลี่ยนคำเตือนเหล่านี้เป็นข้อผิดพลาดในการคอมไพล์ — เปิดใช้งานตัวเลือกนี้เพื่อการควบคุม

คำถามที่พบบ่อย

iOS Deployment Target คืออะไร?

iOS Deployment Target คือเวอร์ชัน iOS ขั้นต่ำที่แอปพลิเคชันสามารถรันได้ ระบุใน Xcode Project → Info → iOS Deployment Target แอปที่มี Target 16.0 ไม่สามารถติดตั้งบน iOS 15.0 และต่ำกว่า App Store กรองแอปพลิเคชันตามพารามิเตอร์นี้ — ผู้ใช้ที่มีเวอร์ชันไม่รองรับจะไม่เห็นแอป สิ่งที่เทียบเท่าใน Android คือ minSdkVersion

iOS Deployment Target แตกต่างจาก minSdkVersion อย่างไร?

พารามิเตอร์ทั้งสองกำหนดเวอร์ชัน OS ขั้นต่ำสำหรับการติดตั้งแอปพลิเคชัน iOS Deployment Target เก็บใน Info.plist (MinimumOSVersion) minSdkVersion — ใน AndroidManifest.xml iOS ไม่มีสิ่งที่เทียบเท่ากับ targetSdkVersion และ compileSdkVersion — การเปลี่ยนแปลงพฤติกรรมทั้งหมดจะถูกนำไปใช้เมื่อคอมไพล์ด้วย Base SDK ใหม่ ใน Android การเปลี่ยนแปลงพฤติกรรมถูกควบคุมผ่าน targetSdkVersion การตรวจสอบโค้ด: @available ใน Swift เทียบกับ Build.VERSION.SDK_INT ใน Android

ควรเลือก iOS Deployment Target ใดในปี 2026

แนะนำให้เลือก iOS 16.0 สำหรับแอปพลิเคชันมวลชน (83% ของอุปกรณ์) และ iOS 17.0 สำหรับสตาร์ทอัพและโปรเจกต์ที่ใช้ SwiftUI Observation/SwiftData (35% ของอุปกรณ์) iOS 16.0 รองรับบน iPhone 8 ขึ้นไป รวมถึง SwiftUI Layout, NavigationStack, Live Activities iOS 17.0 ให้ Observation, SwiftData, TipKit สำหรับไลบรารีและ SDK — iOS 15.0 เพื่อความเข้ากันได้สูงสุด

วิธีตรวจสอบเวอร์ชัน iOS ในโค้ด Swift

ใน Swift ใช้ #available(iOS 17.0, *) ภายในฟังก์ชันสำหรับการดำเนินการโค้ดตามเงื่อนไข หรือ @available(iOS 17.0, *) ในระดับคลาส/เมธอดสำหรับการตรวจสอบแบบประกาศ สำหรับเวอร์ชันที่แน่นอน — ProcessInfo.processInfo.operatingSystemVersion ซึ่งส่งคืน OperatingSystemVersion ใน Objective-C ใช้ @available(iOS 17.0, *) ภายใน if หากไม่มีการตรวจสอบ การเรียก API ที่สูงกว่า Deployment Target จะทำให้เกิดข้อผิดพลาดขณะรันไทม์

สามารถลด Deployment Target หลังจากเผยแพร่ได้หรือไม่

คุณสามารถลด iOS Deployment Target ได้ แต่ต้องแทนที่การเรียก API โดยตรงทั้งหมดจากเวอร์ชันที่สูงกว่าด้วยการตรวจสอบ #available และการใช้งานสำรอง Xcode จะเตือนด้วยคำเตือนสีเหลืองแต่จะไม่แสดงข้อผิดพลาด API ที่ไม่มีการสำรองที่สมเหตุสมผล (Live Activities, SwiftData) จะถูกปิดใช้งานในเวอร์ชันเก่า แนะนำให้เริ่มต้นด้วย Target ต่ำกว่าเวอร์ชันปัจจุบัน 2 รุ่นเพื่อหลีกเลี่ยงการย้ายที่ซับซ้อน

สรุป

  • iOS Deployment Target — เวอร์ชัน OS ขั้นต่ำสำหรับการรันแอปพลิเคชัน เทียบเท่ากับ minSdkVersion ใน Android
  • กำหนดค่าใน Xcode Build Settings (IPHONEOS_DEPLOYMENT_TARGET) และเก็บใน Info.plist (MinimumOSVersion)
  • @available และ #available — กลไกหลักของ Swift สำหรับการเรียก API ที่สูงกว่า Deployment Target อย่างปลอดภัย
  • การเลือก Target ส่งผลต่อความครอบคลุมอุปกรณ์: iOS 16.0 — 83%, iOS 17.0 — 35%, iOS 15.0 — 90%
  • สำหรับแอปพลิเคชันมวลชนแนะนำ iOS 16.0 สำหรับไลบรารี — iOS 15.0 สำหรับสตาร์ทอัพที่ใช้ SwiftData — iOS 17.0
  • การลด Target ต้องปรับโครงสร้างการเรียก API จากเวอร์ชันสูงกว่าทั้งหมดเป็นการตรวจสอบ #available พร้อมการสำรอง
  • Base SDK ใน iOS เป็นเวอร์ชันล่าสุดเสมอ — การเปลี่ยนแปลงพฤติกรรมใช้กับแอปพลิเคชันทั้งหมด แตกต่างจาก Android targetSdkVersion

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม