원문 캡처 · reactnative.dev
원문 캡처 · reactnative.dev

React Native 0.88은 이벤트 처리를 웹 표준 방식으로 전환하고, 가변 글꼴과 iOS SceneDelegate를 지원한다. 사용자에게 보이는 호환성 파괴 변경은 없으며, React 19.3.0과 Metro 0.87로 업데이트됐다.

이벤트는 이제 기본적으로 W3C의 EventTarget API를 거쳐 전달된다. 캡처와 버블링을 포함해 웹과 같은 모델을 사용하며, 기존 이벤트 속성의 이름과 합성 이벤트 객체, 실행 순서는 바뀌지 않는다. 터치 응답 시스템도 그대로다. 네이티브 내부 이벤트 처리 방식에 의존하는 코드는 점검할 필요가 있다. 기존 경로는 0.88에서 내부 플래그 뒤에 남아 있지만, 후속 릴리스에서 제거될 예정이다. 네이티브 참조에 이벤트 리스너를 직접 붙이는 API는 0.88의 Canary 채널에서 제공된다.

Android와 iOS의 <Text> 및 <TextInput>에서 fontVariationSettings를 쓸 수 있다. Java TurboModules는 JavaScript의 ArrayBuffer를 직접 받고 반환할 수 있어 바이너리 데이터를 문자열이나 숫자 배열로 변환하지 않아도 된다. 동기 메서드에서 빌려온 메모리는 메서드가 반환될 때까지만 유효하다. 이후에도 보관해야 한다면 메서드 안에서 복사해야 하며, 무효화된 버퍼의 bytes나 size에 접근하면 IllegalStateException이 발생한다.

iOS 27 SDK부터 UIKit 앱은 UIScene 생명주기를 사용해야 하며, Xcode 27로 빌드한 앱은 이를 지원하지 않으면 실행되지 않는다. React Native 0.88은 기존 AppDelegate 방식과 호환되는 SceneDelegate 지원을 추가했다. 다만 단일 장면만 지원하므로 UIApplicationSupportsMultipleScenes는 false로 유지해야 한다. 앱을 전환하려면 React Native 진입점을 AppDelegate에서 SceneDelegate로 옮기고, 장면의 URL 및 사용자 활동 콜백을 RCTLinkingManager에 전달하며, Info.plist에 UIApplicationSceneManifest를 추가해야 한다. 새 커뮤니티 템플릿과 업그레이드 도우미를 참고할 수 있다. 장면 생명주기에서는 앱 창 크기를 바꿀 수 있고 Dimensions.get()과 useWindowDimensions()가 현재 값에 맞춰 갱신된다.

Swift Package Manager 지원은 이번에도 실험적이며 선택 사항이다. CocoaPods는 계속 지원된다. 릴리스 계획은 0.89에서 Swift Package Manager를 기본값으로 삼고, 전환이 어려운 앱에는 CocoaPods 선택지를 남기는 것이다. CocoaPods 지원은 이후 릴리스에서 제거할 계획이다. 미리보기 사용 중 막히는 점은 RFC #0994에 보고할 수 있다. 0.88에서는 실제 앱과 라이브러리의 피드백을 반영해 빌드 스크립트와 라이브러리 호환성을 개선했다.

그 밖에 backgroundSize, backgroundPosition, backgroundRepeat가 안정화됐으며 기존 experimental_ 접두어 이름도 별칭으로 계속 작동한다. InitializeCore, InputAccessoryView 등 일부 API는 폐기 예정으로 표시됐다. Android의 기본 User-Agent에는 앱 이름과 버전이 포함되므로 기존 기본값을 기준으로 처리하는 서버는 달라진 값을 받게 된다.

React Native 0.88은 최신 안정 버전이며 0.85.x는 지원되지 않는 버전으로 전환됐다. 기존 프로젝트는 업그레이드 안내와 Upgrade Helper를 이용해 변경 사항을 확인할 수 있다. 새 프로젝트는 npx @react-native-community/cli@latest init MyProject --version latest로 만들 수 있다. Expo에서는 SDK 58 릴리스에 포함될 예정이다.

부록: 원문 예시

text
<Text style={{fontVariationSettings: {wght: 700, slnt: -10}}}>Object form</Text><Text style={{fontVariationSettings: "'wght' 700, 'slnt' -10"}}>String form</Text>