먹고 기도하고 코딩하라

MacOS 15 업데이트 및 Xcode 16 업데이트 호환성 대응 본문

앱/Swift

MacOS 15 업데이트 및 Xcode 16 업데이트 호환성 대응

사과먹는사람 2024. 9. 24. 20:19
728x90
728x90

회사에서 이번에 맥을 세콰이어로 업데이트하고 Xcode도 16으로 업데이트하면서 소소한 문제가 있었습니다.

해결하는 과정에서 팀과 공유하는 차원으로 문서를 썼는데, 혹시 누군가에게 도움이 될까 싶어 블로그에도 올립니다.

 

목차

  • Xcode 15 이하 버전 사용법
  • 문제 케이스
    • iOS 18 Simulator Runtime이 영원히 다운로드되지 않음
    • Sentry pod 문제로 빌드 불가
    • 기타 pod 문제로 빌드 불가
    • UIViewController에 .tab(UITab?) 변수 추가로 인한 기존 변수 리네임
  • iOS 18: 콜렉션뷰로 가져갈 셀이 아니라면 dequeue하지 말 것

 

 

Xcode 15 이하 버전 사용법

MacOS 15 Sequoia로 업데이트하면, 기존에 사용하던 Xcode 15는 바로 열어 사용할 수 없습니다.

대신 사용이 불가한 Xcode 앱 우클릭 > 패키지 내용 보기 > Contents > MacOS > Xcode로 이전 버전 Xcode를 열 수는 있습니다.

여기서는 Xcode 16으로 업데이트한 후 발생할 수 있는 문제와 해결책에 대해 다룹니다.

 

문제 케이스

iOS 18 Simulator Runtime 다운로드가 되지 않음

시뮬레이터를 사용하지 않더라도 iOS 18 시뮬레이터 런타임을 다운로드받아야 앱을 빌드할 수 있습니다.

보통 Xcode를 켜면 자동으로 다운로드받게 되는데, PREPARING 상태에서 계속 멈춰 다운로드가 되지 않을 수 있습니다.

다음과 같이 해결합니다.

  1. 링크에서 런타임 dmg를 다운로드받습니다.
  2. 터미널을 켜서 다음 명령어를 입력해 설치된 새 버전의 Xcode에 런타임을 import시켜줍니다.
sudo xcode-select -s /Applications/Xcode.app
xcodebuild -runFirstLaunch
xcodebuild -importPlatform “시뮬레이터런타임위치/.dmg”

 

Sentry pod 문제로 빌드 불가

이 문제는 sentry를 낮은 버전으로 사용하고 있도록 Podfile에서 제한하고 있기 때문에 발생합니다.

 

No type named 'terminate_handler' in namespace 'std' · Issue #4354 · getsentry/sentry-cocoa

Platform iOS Environment Production, Develop, TestFlight Installed CocoaPods Version 7.21.0 Xcode Version 16 Did it work on previous versions? xcode 15 is ok. Steps to Reproduce Upgrade xcode 16, b...

github.com

 

 

Recent visionos change is breaking ios builds · Issue #3547 · getsentry/sentry-react-native

OS: Windows MacOS Linux Platform: iOS Android SDK: @sentry/react-native (>= 1.0.0) react-native-sentry (<= 0.43.2) SDK version: 5.17.0 react-native version: 0.73.2 Are you using Expo? Yes No Are yo...

github.com

 

다음과 같이 해결합니다.

  1. 최신 버전으로 업데이트할 수 있도록 Podfile을 수정합니다.
  2. pod 버전을 업데이트하고, Sentry pod을 업데이트합니다.
  3. tag는 별 이유가 없다면 새로운 버전을 확인해 기입합니다. (2024년 9월 현재 8.36.0)
pod --version # 팟 버전 확인

sudo gem install cocoapods
pod update Sentry

 

주의

trunk URL 문제로 업데이트가 되지 않을 수 있습니다. 어떤 팟이 문제가 된다고 쓰여 있을 텐데, 그 팟을 따로 건드릴 필요는 없습니다.

[!] CDN: trunk URL couldn't be downloaded: <링크> Response: Error in the HTTP2 framing layer

이 경우엔 추가로 cocoapods 내 repo를 날려주고 다시 업데이트합니다.

sudo rm -rf ~/.cocoapods/repos

 

기타 pod 문제로 빌드 불가

SDK does not contain 'libarclite' at the path '/Application/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a'; try increasing the minimum deploymnet target

Pods에 포함된 파일들에서 문제가 생길 수 있습니다.

이 경우 에러 메시지에서도 권고하듯, Pods의 iOS Deployment Target 버전이 낮은 게 문제가 될 수 있습니다. 원인은 여러 가지처럼 보이지만 결국 거의 deployment target이 핵심적인 문제입니다.

iOS 15라고 되어 있지만, 실제로는 15.6으로 셋팅되어 있기 때문에 꼭 15.0인지 확인 필요

해결책은 iOS Deployment Target을 적당히 올려주면 됩니다.

저희 회사 앱은 minimum deployment target이 iOS 15.0이지만, pod들은 iOS Deployment Target이 iOS 15 미만으로 설정되어 있으므로 적당히 올려주었습니다.

이 때 주의해야 할 점은 드롭다운에서 iOS 15를 선택할 경우 자동으로 15.6으로 세팅되기 때문에, Others에서 iOS 15.0으로 명시적으로 마이너 버전까지 지정해야 iOS 15.6 미만 버전 사용자들에게도 안정적으로 서브가 가능하다는 점입니다. 

다른 팟들에서 생기는 문제들 역시 대부분은 target 올리면 해결됩니다.

 

UIViewController에 .tab(UITab?) 프로퍼티 추가로 인한 기존 변수 리네임

혹시 탭을 구현해서 사용하고 있는데, 현재 선택된 탭 등을 구별하려고 tab 등의 프로퍼티를 갖고 있다면.. 주목하십시오

UIViewController에 UITab? 타입의 tab 프로퍼티가 추가됐습니다.

그렇기 때문에 탭 구분하려고 뷰컨에 심은/심을 tab 변수는 네이밍을 한 번만 다시 생각해봐야 합니다.

다른 타입으로 오버라이딩을 시도하는 꼴이라 빌드 자체가 안 됩니다.

이것까지 수정하고 나면 비로소 빌드할 수 있습니다. 😇

 

iOS 18: 콜렉션뷰로 가져갈 셀이 아니라면 dequeue하지 말 것

여담으로 Xcode 16과 iOS 18에서는 콜렉션뷰의 dequeue 활동에 매우 민감하게 반응하고 있습니다.

Xcode 16에서 iOS 18.0 기기를 붙여 빌드했더니 앱이 강제종료되었는데요.

Expected dequeued view to be returned to the collection view in preparation for display. When the collection view's data source is asked to provide a view for a given index path, ensure that a single view is dequeued and returned to the collection view. Avoid dequeuing views without a request from the collection view. For retrieving an existing view in the collection view, use -[UICollectionView cellForItemAtIndexPath:] or -[UICollectionView supplementaryViewForElementKind:atIndexPath:]

 

확인 결과 저희 앱 코드에서는 프로토콜의 한 함수에서 문제를 발견할 수 있었습니다.

// ❌ 이 부분
if collectionView.dequeueReusableCell(UICollectionViewCell.self, for: IndexPath(row: item, section: 0)) as? T != nil {
    collectionView.scrollToItem(at: IndexPath(item: item, section: 0), at: .left, animated: false)
}

이 경우, dequeueReusableCell을 하지 않아도 될 상황에 dequeue를 하고 있습니다. (존재 여부 확인만 하면 되는 상황)

쉽게 말해 셀을 dequeue해서 콜렉션뷰로 넘기는 상황이 아니라면 dequeue하지 말고 cellForItem(at:)으로 찾으라는 것이 요지입니다. 이전 버전까지는 융통성있게 넘어갔으나 새로 업데이트된 iOS 18에서 엄격해진 듯합니다.

다음과 같이 수정하면 정상적으로 동작합니다.

✅
if collectionView.cellForItem(at: IndexPath(row: item, section: 0)) as? T != nil {
    collectionView.scrollToItem(at: IndexPath(item: item, section: 0), at: .left, animated: false)
}

 

 

 

728x90
반응형
Comments