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 선택은 대상 고객 도달 범위와 새로운 Swift 및 Objective-C 프레임워크 API에 대한 액세스 모두에 영향을 미칩니다.

주요 사항

  • iOS Deployment Target — 애플리케이션 설치 및 실행을 위한 최소 iOS 버전, Android의 minSdkVersion과 완전히 동일
  • Xcode에서 설정: Project → Info → iOS Deployment Target, Swift Package Manager 및 CocoaPods에서도 가능
  • @available#available — 현재 Deployment Target보다 높은 API를 안전하게 호출하기 위한 Swift 메커니즘
  • 각각의 새로운 Deployment Target은 새로운 SwiftUI, UIKit, Foundation, AppKit API에 액세스를 제공하지만 기기 적용 범위는 줄어듦
  • App Store는 기기 iOS 버전별로 애플리케이션을 필터링 — Deployment Target이 일치하지 않으면 애플리케이션이 표시되지 않음

iOS Deployment Target이란?

iOS Deployment Target은 애플리케이션이 실행될 수 있는 iOS, iPadOS, tvOS, watchOS 또는 visionOS의 가장 오래된 버전을 지정하는 Xcode 구성 매개변수입니다. 각 Xcode 프로젝트에는 플랫폼별로 이 설정이 개별적으로 포함됩니다. 예를 들어, iOS 앱은 Deployment Target 16.0을 가질 수 있고 watchOS 확장은 9.0을 가질 수 있습니다. 사용자 기기가 iOS 15.0을 실행하는 경우 Target 16.0인 앱은 App Store에 표시되지 않으며 직접 배포를 통해 설치할 수 없습니다.

Deployment Target 메커니즘은 설치 시 OS 버전 확인을 기반으로 합니다. iOS App Store는 Info.plist(키 MinimumOSVersion)의 Deployment Target 값을 사용자 기기의 OS 버전과 비교합니다. 기기 버전이 낮은 경우 "다운로드" 버튼이 차단되고 App Store API는 해당 기기에 대한 검색 결과에 애플리케이션을 반환하지 않습니다. 동일한 동작이 TestFlight, ad-hoc 및 엔터프라이즈 배포에도 적용됩니다.

StatCounter의 2025년 6월 데이터에 따르면 iOS 16은 활성 iPhone 기기의 약 48%를 차지하고 iOS 17은 35%, iOS 18은 12%, 이전 버전은 약 5%입니다. Deployment Target 16.0을 선택하면 기기의 83%를 커버하고 Target 17.0은 35%(iOS 17+만)를 커버합니다. 이 수치는 의사 결정에 중요합니다. Target이 높을수록 대상 고객은 줄어들지만 최신 SwiftUI 및 UIKit API에 더 쉽게 액세스할 수 있습니다.

Deployment Target기기 점유율 (2025년 6월)사용 가능한 기능
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 vs minSdkVersion: Android와 비교

iOS Deployment Target과 Android의 minSdkVersion은 동일한 기능을 수행합니다 — 애플리케이션의 최소 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

주요 차이점은 iOS의 Base SDK가 항상 Xcode에 설치된 최신 버전이라는 것입니다. 개발자는 Android처럼 compileSdkVersion을 선택할 수 없습니다 — 애플리케이션은 항상 사용 가능한 최신 SDK에 대해 컴파일됩니다. iOS의 새로운 동작 변경은 Deployment Target에 관계없이 새로운 Base SDK로 컴파일된 모든 애플리케이션에 적용됩니다. Android에서는 targetSdkVersion이 동작 변경을 제어합니다. iOS에는 이러한 분리가 없습니다.

iOS vs Android의 동작 변경

동작 변경이 targetSdkVersion에 연결된 Android와 달리 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버전 낮게 선택해야 합니다.

Xcode에서 Deployment Target 설정 방법

iOS Deployment Target 구성은 프로젝트의 여러 위치에서 수행됩니다: 메인 Target, Pods 프로젝트(CocoaPods 사용 시), Swift Package Manager 종속성 및 Widget/Extension 타겟. 메인 애플리케이션과 확장 간에 값이 다른 경우 App Store는 모든 값 중 최대값을 사용합니다 — 즉, 확장은 메인 애플리케이션보다 낮은 Target을 가질 수 없습니다.

Xcode 프로젝트 편집기에서 구성

Xcode 프로젝트 열기 → Target 선택 → General 탭 → Minimum iOS Deployment 섹션. 드롭다운에는 Xcode에 설치된 모든 사용 가능한 iOS SDK 버전이 표시됩니다. 변경 사항은 모든 빌드 스킴에 적용됩니다. 대안 — 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 — SPM 라이브러리용 Deployment Target
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+를 설정합니다. iOS 16.0 미만의 Deployment Target을 가진 프로젝트는 이 라이브러리를 추가할 수 없습니다. swiftSettings 매개변수에는 특정 Swift 버전의 예정된 기능이 포함됩니다. SPM은 종속성을 추가할 때 자동으로 platforms 호환성을 확인합니다.

CocoaPods 및 Podfile

Podfile은 platform :ios, '16.0' 지시문을 사용합니다. pod install 후 CocoaPods는 각 pod 라이브러리의 Deployment Target을 확인합니다. 하나라도 프로젝트보다 높은 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" 오류와 함께 실패합니다. 해결책은 문제가 있는 pod의 Target을 낮추거나 프로젝트의 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

Podfile의 post_install 훅은 모든 pod 라이브러리에 강제로 Deployment Target 16.0을 설정합니다. 이는 pod 중 하나가 기능에 필요한 것보다 높은 Target을 지정할 때 유용합니다. pod가 더 높은 iOS 버전의 API를 사용하지 않는다고 확신하는 경우에만 사용하십시오.

Swift 및 Objective-C 코드에서 @available 및 #available 확인

@available#available은 특정 OS 버전에서만 사용 가능한 API를 안전하게 호출하기 위한 Swift 및 Objective-C 지시문입니다. 프로젝트의 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에서 클래스를 호출하려고 하면 런타임 오류가 발생합니다. 특정 OS 버전에 특화된 기능의 전체 모듈을 격리하려면 @available을 사용하십시오. 클래스 내의 메서드의 경우 @available을 사용하면 개별 함수를 숨길 수 있습니다.

#available — 조건부 실행

#available 지시문(if #available)은 런타임에 OS 버전을 확인하고 일치하는 경우에만 코드를 실행합니다. 새 구현과 이전 구현 간에 선택하기 위해 함수 내에서 사용됩니다. Objective-C에서는 if 내의 @available(iOS 17.0, *)이 동등합니다. 더 복잡한 확인을 위해 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, *) {
        // Live Activities API — iOS 16.1부터 사용 가능
        let activity = Activity<MyAttributes>(
            attributes: MyAttributes(name: "Live"),
            contentState: MyContentState(value: 42)
        )
        Task {
            await activity.activate()
        }
    } else {
        // 폴백: 푸시 알림 또는 없음
        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 함수는 폴백 구현과 함께 Live Activities(iOS 16.1+)를 확인하기 위해 #available을 사용합니다. ProcessInfo는 정확한 OS 버전을 확인합니다. @available(*, unavailable)은 새 API로 마이그레이션하기 위해 메서드를 모든 버전에서 사용 불가능으로 표시합니다. 이러한 확인이 없으면 Deployment Target 16.0인 애플리케이션은 iOS 17 API를 호출할 때 iOS 16.0 기기에서 충돌합니다.

Objective-C 및 @available

Objective-C는 Swift #available과 동일한 의미로 @available(iOS 17.0, *)을 사용합니다. 차이점: Objective-C는 런타임에 확인하고 Swift #available도 런타임에 확인하지만 분기 최적화를 위한 컴파일러 힌트가 있습니다. Swift와 상호 작용하는 Objective-C 코드의 경우 Objective-C 측에서 가용성 확인이 필요합니다 — Swift 브리징은 자동 확인을 추가하지 않습니다.

프로젝트에 적합한 Deployment Target 선택 방법

iOS Deployment Target 선택은 대상 고객 도달 범위, 사용 가능한 API 및 코드 유지 관리 복잡성의 세 가지 측면에 영향을 미치는 전략적 결정입니다. 단일 올바른 값은 없습니다 — 선택은 애플리케이션의 대상 고객, 최소 필요 기능 및 이전 버전 호환성 지원을 위한 팀 리소스에 따라 달라집니다.

첫 번째 요소 — iOS 버전 사용 통계 Apple은 WWDC 및 Apple Developer Dashboard에서 iOS 설치 데이터를 게시합니다. 2025년 6월 기준 분포는 iOS 15 ~7%, iOS 16 ~48%, iOS 17 ~35%, iOS 18 ~10%입니다. Target 16.0을 선택하면 83%의 커버리지, Target 17.0은 35%를 제공합니다. 대중 시장 애플리케이션(소셜 네트워크, 메신저, 전자상거래)에는 Target 16.0이 권장됩니다. 특정 API 요구 사항이 있는 틈새 B2B 애플리케이션에는 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 시간이 증가합니다. 팀이 작은 경우 현재보다 2~3버전 낮은 Target(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을 필요로 하는 경우 절반의 프로젝트가 이를 사용할 수 없습니다. 반면 애플리케이션의 경우 새 API에 액세스하기 위해 더 높은 Target을 허용할 수 있습니다.

Deployment Target을 높인 후 낮추는 방법

iOS Deployment Target 낮추기는 대상 고객을 확장해야 하거나 이전 프로젝트와 호환되는 라이브러리를 게시할 때 발생하는 작업입니다. 높이는 것과 달리 낮추려면 코드로 적극적인 작업이 필요합니다. 새로운(더 낮은) Target에서 사용할 수 없는 모든 API의 직접 호출을 #available 확인 및 폴백 구현으로 대체해야 합니다.

첫 번째 단계 — API 목록 작성 Target을 낮출 때 Xcode는 컴파일 오류를 표시하지 않습니다 — 노란색 경고만 표시합니다. @available(iOS N+, *)로 표시된 모든 메서드와 클래스(N이 새 Target보다 높음)를 찾아야 합니다. 패턴 "available(iOS"로 프로젝트 검색(Cmd+Shift+F)을 사용하십시오. 이러한 각 호출은 리팩토링의 대상입니다.

두 번째 단계 — #available 확인으로 대체 상위 버전의 각 API 호출은 if #available(iOS N+, *) { } else { }로 래핑됩니다. 전체 클래스의 경우 유형 수준에서 @available과 함께 #if os(iOS)를 사용하십시오. 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: @Published를 사용한 ObservableObject
        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)
        // iOS 16용 traits 변경 처리
    }
}

// iOS 버전별 구현 선택을 위한 팩토리
func makeViewController() -> UIViewController {
    if #available(iOS 17.0, *) {
        return ModernViewController()
    } else {
        return LegacyViewController()
    }
}

코드는 Target을 iOS 17.0에서 16.0으로 낮추는 것을 보여줍니다. setupObservation 함수는 #available 확인이 있는 setupObservationCompatible로 대체됩니다. ViewController는 Modern(iOS 17+)과 Legacy(iOS 16)로 분할되며 OS 버전에 따라 구현을 선택하는 makeViewController 팩토리가 있습니다. 이 아키텍처는 전체 코드베이스를 복제하지 않고 두 개의 Deployment Target을 지원할 수 있게 합니다 — 버전 관리된 모듈만 복제됩니다.

Xcode 경고 및 해결

Deployment Target을 낮춘 후 Xcode는 새 Target에서 사용할 수 없는 모든 API 호출을 노란색으로 강조 표시합니다. "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을 통해 제어됩니다. 코드 확인: Swift의 @available vs Android의 Build.VERSION.SDK_INT.

2026년에는 어떤 iOS Deployment Target을 선택해야 하나요?

대중 시장 애플리케이션에는 iOS 16.0(기기의 83%), SwiftUI Observation/SwiftData를 사용하는 스타트업에는 iOS 17.0(기기의 35%)을 권장합니다. iOS 16.0은 iPhone 8 이상에서 지원되며 SwiftUI Layout, NavigationStack, Live Activities를 포함합니다. iOS 17.0은 Observation, SwiftData, TipKit을 제공합니다. 라이브러리 및 SDK의 경우 — 최대 호환성을 위해 iOS 15.0을 권장합니다.

Swift 코드에서 iOS 버전을 확인하는 방법은?

Swift에서는 조건부 코드 실행을 위해 함수 내에서 #available(iOS 17.0, *)을 사용하거나 선언적 확인을 위해 클래스/메서드 수준에서 @available(iOS 17.0, *)을 사용합니다. 정확한 버전의 경우 — ProcessInfo.processInfo.operatingSystemVersion(OperatingSystemVersion 반환)을 사용합니다. Objective-C에서는 if 내에서 @available(iOS 17.0, *)을 사용합니다. 확인 없이 Deployment Target보다 높은 API를 호출하면 런타임 충돌이 발생합니다.

게시 후 Deployment Target을 낮출 수 있나요?

iOS Deployment Target을 낮출 수 있지만 상위 버전의 모든 직접 API 호출을 #available 확인 및 폴백 구현으로 대체해야 합니다. Xcode는 노란색 경고로 알리지만 오류는 표시하지 않습니다. 합리적인 폴백이 없는 API(Live Activities, SwiftData)는 이전 버전에서 비활성화됩니다. 복잡한 마이그레이션을 피하기 위해 현재보다 2버전 낮은 Target으로 시작하는 것이 좋습니다.

요약

  • iOS Deployment Target — 애플리케이션 실행을 위한 최소 OS 버전, Android의 minSdkVersion에 해당
  • Xcode Build Settings(IPHONEOS_DEPLOYMENT_TARGET)에서 구성되고 Info.plist(MinimumOSVersion)에 저장됨
  • @available#available — Deployment Target보다 높은 API를 안전하게 호출하는 주요 Swift 메커니즘
  • Target 선택이 기기 커버리지에 미치는 영향: iOS 16.0 — 83%, iOS 17.0 — 35%, iOS 15.0 — 90%
  • 대중 시장 앱에는 iOS 16.0, 라이브러리에는 iOS 15.0, SwiftData를 사용하는 스타트업에는 iOS 17.0 권장
  • Target을 낮추려면 폴백이 있는 #available 확인으로 상위 버전 API 호출 리팩토링 필요
  • iOS의 Base SDK는 항상 최신 — 동작 변경이 모든 애플리케이션에 적용됨(Android targetSdkVersion과 다름)

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기