Setting a deployment target
각 타켓은 프로젝트의 배포 타겟 설정을 통해 앱이 실행될 수 있는 최소 운영 체제 버전을 지정한다
이 설정은 앱 새발 시 사용할 수 있는 프레임워크 버전을 결정한다
새로운 기능이나 프레임워크를 버전을 채택하려면 이 설정을 변경할 수 있다
Xcode 14에서 생성한 Scrumdinger 프로젝트의 배포 타겟은 iOS16입니다
16이상을 실행하는 모든 장치에서 이 앱을 실행할 수 있습니다
iOS 16.0에서 도입된 NavigationStack을 Create a navigationhierachy에서 추가했기 때문에 Scrumdiger타겟을 15.0으로 설정하면 NavigationStack을 사용한 모든 부분에서 컴파일 오류가 발생합니다
NavigationStack을 사용한 모든 부분에서 컴파일러 오류가 발생합니다. NavigationView는 iOS 16.0에서 더 이상 사용되지 않기 때문에, NavigationStack을 완전히 피하는 것은 해결할 수 없습니다
최선의 해결책은 앱을 실행 중인 iOS 버전에 따라 적절한 뷰를 선택하는 것입니다. iOS 15.x에서는 NavigationView를 사용하고, iOS 16.0 이상에서는 최신 NavigationStack을 사용하는 방식으로 앱을 작성하는 것입니다. 이렇게 하면 앱이 실행되는 장치에 가장 적합한 최신 API를 사용할 수 있으면서도 구형 장치와의 호환성을 유지할 수 있습니다. 이를 위해서는 가용성 조건을 사용할 수 있습니다
Checking for an operating system version
이전 버전의 운영 체제와의 호환성을 유지하기 위해서는 available 조건을 사용할 수 있습니다. #available을 사용하면 특정 운영 체제 버전에 대해 코드를 실행할 수 있습니다. 다음 예제에서는 iOS 16.0 이상을 실행하는 장치에서만 NavigationStack을 사용하는 뷰를 보여줍니다:
struct ScrumsView: View {
@Binding var scrums: [DailyScrum]
var body: some View {
if #available(iOS 16.0, *) {
NavigationStack {
ScrumsList(scrums: $scrums)
}
} else {
NavigationView {
ScrumsList(scrums: $scrums)
}
}
}
}
위 코드에서 #available(iOS 16.0, *) 조건문은 iOS 16.0 이상을 실행하는 장치에서만 NavigationStack을 사용하게 하고, 그 이하 버전에서는 NavigationView를 사용하도록 합니다. 이를 통해 최신 API를 활용하면서도 구형 장치와의 호환성을 유지할 수 있습니다
전체 타입을 특정 운영 체제에서 사용 가능하도록 표시하려면 @available 속성을 사용할 수 있습니다. 아래 구조체를 표시하면, 뷰 본문 내에서 NavigationStack을 사용할 때 별도의 가용성 검사를 하지 않아도 됩니다.
@available(iOS 16.0, *)
struct ScrumsStackView: View {
@Binding var scrums: [DailyScrum]
var body: some View {
NavigationStack {
ScrumsList(scrums: $scrums)
}
}
}
@available(iOS 16.0, *) 속성을 사용하여 ContentView 구조체를 iOS 16.0 이상에서만 사용할 수 있도록 표시합니다.
ContentViewWrapper는 iOS 버전에 따라 적절한 뷰를 선택하여 제공합니다. iOS 16.0 이상에서는 ContentView를 사용하고,
그 이하 버전에서는 NavigationView를 사용합니다.
이를 통해 최신 API를 활용하면서도 구형 장치와의 호환성을 유지할 수 있습니다.
ContentView 내부에서는 별도의 가용성 검사를 하지 않아도 되므로 코드가 더 깔끔해집니다.
struct ScrumsView: View {
@Binding var scrums: [DailyScrum]
var body: some View {
if #available(iOS 16.0, *) {
ScrumsStackView(scrums: $scrums)
} else {
NavigationView {
ScrumsList(scrums: $scrums)
}
}
}
}
위의 ScrumsStackView 선언에 가용성 주석을 추가하면 뷰 본문에서 NavigationStack을 사용할 수 있습니다.
하지만 이 주석으로 인해 iOS 15.x에서 ScrumsStackView를 사용하는 것은 오류가 됩니다.
ScrumsStackView를 프로젝트에서 사용하려면 첫 번째 예제에서와 유사하게 가용성을 확인해야 합니다.
아래는 이를 구현하는 방법입니다.
struct ScrumsView: View {
@Binding var scrums: [DailyScrum]
var body: some View {
if #available(iOS 16.0, *) {
ScrumsStackView(scrums: $scrums)
} else {
NavigationView {
ScrumsList(scrums: $scrums)
}
}
}
}
가용성 주석 추가:
@available(iOS 16.0, *) 주석을 ScrumsStackView에 추가하여 이 뷰가 iOS 16.0 이상에서만 사용 가능하도록 설정합니다.
가용성 확인:
ContentView 내에서 #available(iOS 16.0, *) 조건문을 사용하여 iOS 버전을 확인하고, iOS 16.0 이상에서는 ScrumsStackView를, 그 이하 버전에서는 NavigationView를 사용하도록 합니다.
'SwiftUI' 카테고리의 다른 글
SwiftUI | Transcribing speech to text (0) | 2024.08.06 |
---|---|
SwiftUI | Examining data flow in Scrumdinger (0) | 2024.08.06 |
Adopting Swift concurrency (0) | 2024.08.05 |
SwiftUI | Responding to events (0) | 2024.08.02 |
Making classes observable (0) | 2024.08.02 |