앱갈피
Back to Home
iOS Development • 2026년 9월 8일

iOS 27·Xcode 27·폴더블 아이폰 — 애플 앱스토어에 앱 올려뒀다면 지금 확인할 것 3가지

#iOS #iOS 27 #Xcode 27 #Swift 6.4 #폴더블 #앱 출시 #바이브코딩


9월에 iOS 27과 새 아이폰이 나온다.

AI한테 코드를 맡겨서 앱을 만든 사람이라면 "내 앱 괜찮나?"부터 걱정될지도 모르겠다.
특히나 접는 아이폰이 나온다는 루머로 그동안 아이폰의 변화에서 해상도 대응이 더 심해질지도 모른다.

15년차 아이폰 개발자라, 각종 대응방법과 OS업데이트에 따른 기본적인 상식들은 가지고 있기에 툭하고 넘어가려 했으나

Claude Fable 5.1 ultracode의 성능을 확인할겸 조사를 맡겼더니 토큰의 40프로를 소모하며 어마어마한 문서를 만들어냈다.
(5시간 토큰도 혼자 다 소비하고, 중단했다가 마무리했다는 tmi)

나름 재미있는 것들도 있어서, 그 문서에서 대외비를 빼고 다시 정리해보았다.

우선, 기본적으로 이미 배포된 앱들이 문제가 생길 일은 없을 것이다.
애플은 이미 스토어에 배포된 앱에 한해서는 특별히 수정요청을 하지 않는다.

대신 일정기간(보통 발표 이듬해 4월) 후에는 반드시 새 Xcode, 이번에 발표된 Xcode 27로 빌드해서 올리는 것을 의무화할 것이다.
물론 이 때도 업데이트를 하지 않는다면 큰 상관은 없다.

그래도 확인은 해야지.

iOS27 RC(구 GM)이나 정식버전이 나오기전에 딱 세 가지만 확인하면 된다.
지금 빌드를 iOS 27 베타 폰에서 한 번 돌려보고, 빌드 서버(Xcode Cloud)가 멋대로 Xcode 27로 바뀌지 않게 고정하고, 앱스토어 제출 전에 답해야 하는 설문을 미리 채운다.

이 글은 Apple 공식 문서와 릴리스 노트, 주요 SDK 릴리스 노트를 근거로 정리했다. 루머는 루머라고 따로 표시했다.


일정부터 보자

날짜

무슨 일

확정 여부

9/9 (수) 새벽 2시 KST 기준 9/10

Apple 이벤트 "Surprise and shine"

확정

9/910

iOS 27 RC, Xcode 27 RC 배포

관례

9/14 (월) 전후

iOS 27 정식 배포, Xcode 27 정식

예상

9/18 (금)

iPhone 18 Pro 출시

루머

9월 말4분기

폴더블 아이폰 판매

루머, 소스마다 다름

2027년 4월

iOS 27 SDK로 빌드한 앱만 제출 가능

미공지, 매년 같은 패턴

표 마지막 줄은 매년 반복되는 패턴이라 iOS 생태계를 1년 정도 지켜보고 앱을 제출해본 사람은 다 안다.


내 앱이 깨지는 조건은 딱 하나다

iOS 27의 변경점은 대부분 "iOS 27 SDK로 빌드한 앱"에만 적용된다. SDK는 Xcode에 딸려 온다. 즉 Xcode 27로 빌드하기 전까지는 대부분의 변화가 내 앱과 상관없다.

그래서 이렇게 나눠서 생각하면 편하다.

구분

언제 켜지나

OS 변화

iOS 27 폰에서 실행하면 모든 앱에

유리 효과(Liquid Glass) 투명도 슬라이더, 알림센터 위치

SDK 변화

Xcode 27로 빌드한 앱만

앱이 아이패드에서 창 크기 조절되기 시작, 옛 디자인 옵트아웃 무효

툴체인 변화

Xcode 27로 컴파일하면 무조건

@State 동작 변경, 새 경고

출시 주간에 신경 쓸 건 첫 줄뿐이다. 나머지 두 줄은 나중에 브랜치 하나 파서 한꺼번에 처리하면 된다.


지금 빌드를 iOS 27에서 돌려보면 뭘 봐야 하나

iOS 27 베타(또는 RC)를 깔 수 있는 폰이 하나 있으면 좋다.

없으면 시뮬레이터라도 된다. 볼 것은 많지 않다.

  • 유리 효과 슬라이더. iOS 27에는 설정 › 모양 › Liquid Glass에 투명도 슬라이더가 생겼다.
    완전 투명으로 놓고 내 앱 탭바·툴바 위 글자가 읽히는지 본다. 사진이나 화려한 배경 위에 버튼이 있는 앱은 여기서 무너지기 쉽다.

  • 네트워크 이미지 캐시. SwiftUI AsyncImage가 iOS 27부터 서버 캐시 헤더를 따른다.
    같은 주소인데 내용만 바뀌는 이미지(프로필, 로고)가 안 바뀌는 것처럼 보일 수 있다.

  • 알림 눌렀을 때 진입. 알림센터가 왼쪽 위 스와이프로 옮겨갔다.
    알림 탭해서 앱이 제대로 열리는지만 확인.

  • 한글이 들어간 URL. URL 파싱 코드가 통째로 바뀌었다.
    딥링크나 API 주소에 한글·특수문자가 있으면 한 번 눌러본다.

  • 결제. iOS 27 베타 5에는 결제 완료 처리가 안 되는 버그가 있었다(베타 6에서 수정).
    이런 문제가 있기에 베타는 나왔다고 실사용 아이폰에 바로 설치하면 안된다.

이 중에 문제가 있으면 지금 쓰는 Xcode로 고쳐서 바로 올린다.

9월은 심사가 밀리는 시기라 미리 내는 게 좋다. 요즘은 심사가 2~3일, 첫 심사는 몇 주 걸린다는 글도 있다.



Xcode 27로 빌드하면 뭐가 바뀌나

Xcode 27에는 Swift 6.4가 들어 있다. 여기서부터가 진짜 변경점이다. 처음 빌드하면 에러가 좀 나올 텐데 대부분 아래 세 가지다.

@State 초기값이 무시되거나 컴파일 에러

SwiftUI @State가 내부적으로 매크로로 바뀌었다. 이런 코드가 있으면 걸린다.

struct DetailView: View {
@State private var count = 0 // 여기 초기값이 있고
init(start: Int) {
count = start // init에서 또 넣으면 → 무시되거나 에러
}
}

고치는 법은 간단하다. 선언부 초기값을 지우고 init에서만 넣거나, init을 없애고 선언부 초기값만 남긴다.

AI한테 "TN3211 기준으로 @State 초기화 패턴 고쳐줘"라고 하면 알아듣는다. 똑똑해...

부수 효과로 @State에 담은 클래스가 화면 다시 그릴 때마다 새로 만들어지던 성능 문제가 사라진다.

이건 iOS 17 타깃까지 소급 적용된다고 한다. 6.4로 새로 빌드해서 배포하면 전반적인 체감이 있을 것 같다.

Task { try await ... } 마다 노란 경고

Swift 6.4는 에러를 던지는 Task를 만들고 결과를 버리면 경고를 낸다.

에러가 조용히 사라지는 걸 막으려는 거다. SwiftUI 버튼 액션이나 onAppear에서 흔히 쓰는 패턴이라 앱 하나에 열 곳쯤은 나온다.

빌드는 되니 급하진 않다. 안에서 do/catch로 잡거나 _ = Task { ... }로 "일부러 버린다"고 표시하면 조용해진다.

앱이 아이패드와 맥에서 창 크기가 조절된다

iPhone 전용 앱이라도 Xcode 27로 빌드하면 아이패드 위에서, 그리고 macOS 27 iPhone 미러링에서 창을 자유롭게 늘렸다 줄였다 할 수 있게 된다.

끌 수 있는 옵션은 없다. 화면 폭을 고정값으로 가정한 코드가 있으면 여기서 깨진다. 아래 폴더블 얘기와 이어진다.

그 밖에 알아둘 것

  • 옛 디자인으로 남아 있으려고 UIDesignRequiresCompatibility 키를 넣었다면 Xcode 27부터 무시된다. 유리 디자인이 강제된다.

  • 앱 델리게이트만 쓰는 옛날 방식 UIKit 앱은 아예 실행이 안 된다. SwiftUI App으로 만든 앱은 해당 없다.

  • 런치 스크린이 없으면 업로드가 거부된다(ITMS-90870). Xcode 템플릿으로 만든 SwiftUI 앱은 기본으로 들어 있다.

  • 탭바에서 조건에 따라 탭을 숨기는 앱은, 숨긴 탭이 선택된 상태가 되면 크래시할 수 있다.

  • canOpenURL이 deprecated됐다. 그냥 open하고 실패를 처리하라는 뜻이다.

  • PreviewProvider가 deprecated됐다. #Preview로 바꾸면 된다.

  • Firebase, AdMob, RevenueCat 같은 SDK는 6월부터 Xcode 27 대응 버전을 냈다. Xcode 27로 열기 전에 File › Packages › Update to Latest Package Versions를 한 번 돌리고 Package.resolved를 커밋한다. 특히 Firebase에 딸려오는 nanopb, promises가 옛 버전에 고정돼 있으면 Xcode 27에서 패키지 해석부터 실패한다.



폴더블 아이폰이 나오면 내 앱은 어떻게 보이나

Apple이 개발자에게 폴더블을 언급한 적은 한 번도 없다. 그래서 여기서부터는 루머다.

  • 펼치면 약 7.8인치, 가로가 세로보다 긴 화면. 접으면 5.5인치 일반 아이폰 비율. (Bloomberg Gurman, Ming-Chi Kuo)

  • iPadOS가 아니라 iOS 27로 돈다. 아이패드 앱은 실행 안 된다. 아이폰 앱이 아이패드 가로 모드 비슷한 비율로 넓어진다. (Gurman)

  • 앱 두 개를 나란히 띄울 수 있다. (Gurman)

루머가 맞다면 내 아이폰 앱은 어느 날 갑자기 정사각형에 가까운 넓은 화면을 받게 된다. 그리고 Apple은 작년(WWDC25)에 이미 못을 박아뒀다. iOS 26 SDK 이후로 빌드한 앱은 새 화면 크기가 나와도 시스템이 검은 띠(레터박스)로 감싸주지 않는다. 앱이 화면을 통째로 받는다.

그러니까 폴더블 대비는 별개 작업이 아니다. 위에서 말한 "창 크기 조절 대응"이 곧 폴더블 대비다.

Apple도 WWDC26에서 "특정 기기가 아니라 다양한 크기와 비율을 위해 설계하라"고 했다.


지금 확인할 수 있는 방법

폴더블 시뮬레이터는 아직 없다. 대신 이렇게 근사치로 볼 수 있다.

  1. 아이패드 시뮬레이터.
    아이폰+아이패드 앱이면 iPad mini 시뮬레이터에서 창 모드로 놓고 창을 늘렸다 줄였다 한다. 폴더블 내부 화면 크기와 제일 비슷하다.

  2. 프리뷰 크기 고정.
    SwiftUI 프리뷰에 #Preview(traits: .fixedLayout(width: 1133, height: 744)) 같은 걸 추가해 두면 넓은 가로 화면을 계속 볼 수 있다.

  3. Xcode 27의 리사이즈 모드.
    Xcode 27을 깔면 시뮬레이터 창을 마우스로 끌어 아무 크기나 만들 수 있다(Device Hub › Enter resize mode). 단 Xcode 27로 빌드한 앱만 된다.

코드에서 찾아볼 것도 정해져 있다. AI한테 이 목록 그대로 검색시키면 된다.

  • UIScreen.main — iOS 27부터 틀린 값을 준다. 화면 크기 대신 뷰 크기(GeometryReader, onGeometryChange)를 쓴다.

  • userInterfaceIdiom — "아이패드니까 이 레이아웃"식 분기. Apple이 명시적으로 쓰지 말라고 했다. 폴더블에서는 아이폰으로 잡힐 가능성이 커서 아이패드용 레이아웃이 안 나온다.

  • .frame(width: 393) 같은 화면 폭 고정값.

  • 가로 모드 여부로 레이아웃을 정하는 코드. 창이 넓어져도 세로 모드일 수 있다.

  • 광고 배너 폭을 화면 폭으로 계산하는 코드. 창이 좁아지면 배너가 잘린다.

그리고 화면이 넓어졌다 좁아졌다 할 때 선택한 항목, 스크롤 위치, 입력 중인 글이 날아가지 않는지 본다. if 넓은화면 { A } else { B }로 뷰를 통째로 갈아끼우면 상태가 날아간다. Apple 엔지니어가 포럼에서 직접 하지 말라고 한 패턴이다.


Xcode Cloud 쓰면 이것부터

Xcode Cloud로 빌드하는 사람은 지금 바로 워크플로 설정을 열어본다. Xcode 버전이 "Latest Release"로 돼 있으면 특정 버전(현재 26.6)으로 고정한다.

이유는 위에서 말한 그대로다. Xcode 27이 정식으로 나오는 날, "Latest Release"는 자동으로 27로 바뀐다. 그러면 내가 손도 안 댔는데 다음 빌드부터 Xcode 27 규칙이 전부 적용된다. 패키지 해석 실패, @State 에러, 아이패드 리사이즈가 한꺼번에 온다.

하나 더. Xcode 26.5(Swift 6.3.2)에는 메인 스레드에서 돌아야 할 코드가 백그라운드에서 도는 컴파일러 버그가 있다. 26.6에서 고쳐졌다. 빌드 서버가 26.5에 머물러 있으면 26.6으로 올린다.


맥을 macOS 27로 올릴 때 주의해야할 사항

macOS 27 베타에서는 Xcode 26이 실행 자체가 안 된다는 포럼 글이 있다.
Apple이 공식 답변으로 "지원 안 한다"고 했지만, 최종 확인은 베타가 끝난 후에 확인이 필요하긴 하다.
"This version of Xcode is not compatible with this version of macOS." 라고 뜬다고 하니 이 경우 Xcode를 업데이트 하자.
(mac OS 버전을 내리는 것보단 쉬우니)
https://developer.apple.com/forums/thread/831716

다 필요없고 mac OS와 Xcode를 전부 최신으로 맞추면 해결이긴 하다.


코드 말고 눌러야 하는 것들

앱스토어 커넥트 쪽에도 9월에 바뀐 게 있다. 자주 업데이트했던 사람이라면 아마 이미 해결한 내용도 있을 것이다.

이 내용들은 심사제출 시 필요한 메타데이터라 코드와 상관없이 appstoreconnect에서 에러가 뜰 것이다.

  • 연령 등급 설문에 "소셜 미디어 기능" 질문이 생겼다. 9월부터 새 버전 제출 시 답이 필수다.
    사용자끼리 피드를 주고받는 앱이 아니면 "아니오". 앱 정보 › 연령 등급에서 저장.

  • 개발자 계약(PLA) 개정본 수락. 8월 18일에 새 첨부 조항이 붙었다. 계정 소유자가 기한 안에 수락하지 않으면 TestFlight, Xcode Cloud, 자동 서명이 멈춘다. developer.apple.com/account 상단 배너 확인.

  • 심사 연락처 전화번호를 국제 형식(+82)으로. 8월 19일부터 필수.

  • 한국 스토어 등급. 10월부터 '가벼운 비속어'와 '가벼운 성인/선정적 주제' 항목이 전체이용가에서 12세로 올라간다.
    설문에서 "드물게 있음"으로 체크한 앱은 등급이 바뀐다.

  • 스크린샷에 투명 배경(알파 채널) 금지. 스크린샷 규격은 아직 안 바뀌었다. 폴더블용 규격은 출시 뒤 공지를 기다린다.


이번 주 할 일

  1. Xcode Cloud 워크플로를 Xcode 26.6으로 고정한다.

  2. 앱스토어 커넥트에서 연령 등급 설문, 계약 수락, 전화번호를 확인한다.

  3. 급한 배포가 없다면, 빌드를 iOS 27 베타 폰에서 돌려본다. 유리 슬라이더, 이미지 갱신, 알림 진입, 한글 URL.

  4. 문제가 있으면 지금 Xcode로 고쳐서 제출한다. 단계별 출시(Phased Release)를 켜두면 1%부터 천천히 나간다.

  5. Xcode 27 베타를 따로 설치해서(기존 Xcode는 그대로) 한 번 빌드해 본다. 에러 목록만 뽑아둔다. 고치는 건 10월에 해도 된다.

  6. 맥은 macOS 26에 둔다.


폴더블은 나와 봐야 안다.
대신 "화면 크기를 가정하지 않는 앱"은 폴더블이 어떻게 나오든 버틴다. 그쪽에 시간을 쓰는 게 남는 장사다.

Comments