1. 인증 및 탭 전환 메커니즘
- Rails 서버 측: Rails 8의
AuthenticationConcern
을 기반으로 최소한의 인증 로직을 구현하며, 이메일 확인 및 Turbo Stream 요청 처리를 포함합니다. - iOS 클라이언트 측:
SceneController
는 사용자의 인증 상태에 따라TabBarController
(인증됨) 또는Navigator
(비인증됨)를 루트 뷰 컨트롤러로 설정합니다. 서버에서 전송되는sessions_meta
부분의BridgeAuthentication
컴포넌트가didSignIn
알림을 트리거하여 탭 전환을 수행합니다.
2. 프로필 URL 처리 리팩토링
- 기존 방식: 초기에는 사용자의 실제 프로필 URL(
profile_path
)을 iOS 앱으로 직접 전달하여 탭 바의 첫 번째 탭을 설정했습니다. - 리팩토링:
profiles/me
와 같은 고정된 엔드포인트를 도입하여 서버 측에서 현재 로그인한 사용자의 프로필을 직접 렌더링하도록 변경했습니다. 이로써 클라이언트는 복잡한 URL 관리가 아닌profiles/me
경로만 알면 되므로 로직이 단순화되고,NotificationToken
과 같은 불필요한 상태 저장을 제거할 수 있었습니다. 이 변경은flash.keep
과 같은 리다이렉션 관련 문제도 회피했습니다.
3. 푸시 알림 기능 구현 (Noticed
Gem 활용)
- 백엔드 설정:
appotic
Gem 추가 및 APNS(Apple Push Notification Service) 연동을 위한 설정 파일을 구성합니다.NotificationToken
모델을 생성하여 사용자(User)와 1:N 관계를 설정하고,token
및platform
(iOS, FCM) 정보를 저장합니다.enum
을 활용하여platform
의 유효성을 관리합니다.NotificationTokensController
를 구현하여 iOS 앱에서 전송되는 디바이스 토큰을find_or_create_by
방식으로 저장하며, CSRF 보호를 건너뛰도록 설정합니다.NewFriendNotifier
에deliver_by :ios
설정을 추가하여Noticed
Gem이 iOS 푸시 알림을 처리하도록 합니다.
- iOS 클라이언트 설정:
NotificationTokenViewModel
을 생성하여 디바이스 토큰을 서버의notification_tokens#create
엔드포인트로 POST 요청합니다. 요청 시Content-Type: application/json
헤더를 설정합니다.AppDelegate
에서didRegisterForRemoteNotificationsWithDeviceToken
콜백을 통해 APNS로부터 받은 디바이스 토큰(Data 형식)을 String으로 변환하여NotificationTokenViewModel
을 통해 서버에 전송합니다.NotificationTokenComponent
Bridge 컴포넌트를 사용하여 앱 시작 시UNUserNotificationCenter
를 통해 사용자에게 푸시 알림 권한을 요청합니다. Apple 정책상 이 요청은 사용자당 한 번만 발생합니다.
4. 향후 개선 사항
- iOS 앱에서 디바이스 토큰을 로컬에 저장하여 로그아웃 시 서버에서 해당 토큰을 삭제하는 기능 구현이 필요합니다.