Certilife와 같은 거래처가 맡긴 일이지만, 분야는 다릅니다. Brightmall은 쇼핑 쪽입니다. 웹으로 만든 쇼핑몰을 iOS 앱으로 감싸면, 폰 홈 화면에 아이콘으로 자리 잡고, App Store에도 올릴 수 있고, 웹만으로는 하기 어려운 앱 고유의 일까지 함께 처리할 수 있습니다.
애플리케이션은 Swift · UIKit · Combine으로 짰고, 의존성은 SPM으로만 묶었습니다. 네이티브 앱이 로그인 · 푸시 알림 · 파일 다운로드 · 딥링크 · App Store 심사 대응을 처리하고, 쇼핑몰 화면 자체는 웹 서버에서 받아 와 앱 안의 웹뷰에 띄웁니다.
웹과 앱은 정해진 메시지 규칙으로 통신합니다. 쇼핑몰은 로그인 · 로그아웃 · 전화 걸기 · 세션 토큰 전달처럼 이름 붙은 몇 가지 메시지로 앱을 부르고, 앱은 페이지 위의 정해진 함수를 되불러 답합니다. 토큰은 네이티브 쪽 iOS Keychain에 저장하고, 페이지를 새로 열 때마다 웹에 다시 전달합니다. 사용자가 어디로 이동하든 쇼핑몰의 로그인이 풀리지 않는 이유입니다.
웹 층에서 내려오는 거래 문서는 앱이 가로채 네이티브 다운로드로 저장하고, 저장했다고 토스트로 알립니다. 연결 감시자가 네트워크를 지켜보다가, 끊겼던 연결이 돌아오는 순간 토큰까지 챙겨 쇼핑몰을 다시 불러옵니다. 쇼핑몰의 모든 탭이 하나의 웹 프로세스 풀을 같이 쓰기 때문에, 어느 구역으로 가도 로그인 상태가 한 몸처럼 유지됩니다. 푸시 권한을 묻는 순간도 따로 설계했습니다. iOS 시스템 창이 뜨기 전에, 알림이 왜 필요한지 네이티브 화면이 먼저 설명합니다. 이 화면은 UIKit 앱 안에서 SwiftUI로 구현했습니다.
같은 소스가 컴파일 시점에 갈라지는 여러 서버 환경을 향해 출시됩니다. 내부 테스터는 스테이징 쇼핑몰을 걷고, App Store 빌드는 운영 서버를 바라봅니다.
