로그인 없이 쓰는 앱 안 문의 기능 만들기
로그인하지 않은 사용자도 앱 안에서 문의를 보내고 답신을 받을 수 있도록 익명 인증과 계정 연결을 도입합니다.

개요
Casebook은 로그인하지 않아도 기본 사건을 플레이할 수 있습니다. 하지만 앱 안 문의함은 Sign in with Apple로 로그인한 사용자만 쓸 수 있었습니다. 게임하다 막혀서 도움이 필요한 사용자가 먼저 계정부터 만들어야 했던 것입니다.
이번 작업에서는 문의함을 중앙우체국으로 다시 만들고, 로그인하지 않은 사용자도 편지를 보내고 답신을 받을 수 있게 했습니다. 이 글에서는 다음 세 가지를 다룹니다.
- 익명 인증으로 임시 사용자 만들기
- 임시 사용자를 Apple 계정과 연결하기
- 문의 화면을 기본 컴포넌트로 구성하기
익명 인증으로 임시 사용자 만들기
답신을 돌려주려면 누가 보냈는지 알아야 합니다. 하지만 문의를 위해 가입을 요구하면 처음 문제로 돌아갑니다. 그래서 Mac · iPhone · iPad 앱은 처음 실행할 때 서버의 익명 인증으로 임시 사용자를 만듭니다. 사용자는 아무것도 입력하지 않습니다.
// 기기에 저장된 세션이 없을 때만 새 임시 사용자를 만듭니다.
if client.auth.currentSession == nil {
try await client.auth.signInAnonymously()
}
중요: 세션을 확인하지 못했다고 해서 바로 새 임시 사용자를 만들면 안 됩니다. 네트워크가 잠깐 끊긴 경우에도 새 사용자가 생기고, 그동안 받은 답신을 잃게 됩니다. 저장된 세션이 없거나, 서버가 그 세션을 확실히 거절했을 때(예: 오래 쓰지 않아 지워진 임시 사용자)만 새로 만드세요. 네트워크 오류로 세션을 새로 받지 못한 것뿐이라면 저장된 세션을 지우지 마세요.
임시 사용자를 Apple 계정과 연결하기
나중에 사용자가 Sign in with Apple로 로그인하면 새 계정을 만들지 않고, 지금의 임시 사용자에 Apple 계정을 연결합니다. 받은 답신은 그대로 남습니다.
다른 기기에서 이미 가입한 계정이 있으면 연결할 수 없습니다. 이때는 기존 계정으로 로그인한 뒤, 임시 사용자가 받은 답신을 계정으로 옮기고 임시 사용자를 지웁니다.
문의 화면을 기본 컴포넌트로 구성하기
처음에는 앱 분위기에 맞춰 편지지와 밀랍 봉인 느낌으로 화면을 꾸몄습니다. 보기에는 좋았지만 설정 화면 안에서는 낯설었습니다. 결국 SwiftUI 기본 Form으로 돌아가고, 분위기는 화면 위쪽의 건물 그림 한 장으로 살렸습니다.
Mac의 그룹 스타일 폼에서 TextField는 이름과 값을 한 줄에 그리기 때문에 입력칸이 오른쪽에 붙습니다. 여러 줄을 쓰는 편지 본문에는 TextEditor를 씁니다.
Form {
Section("내용") {
TextEditor(text: $message)
.frame(minHeight: 160)
}
}
.formStyle(.grouped)
결과와 남은 과제
이제 로그인하지 않은 사용자도 앱 안에서 바로 문의를 보낼 수 있습니다. 함께 다음을 정했습니다.
- 스팸을 막기 위해 하루에 보낼 수 있는 편지를 3통으로 제한합니다.
- 30일 동안 쓰지 않은 임시 사용자는 매일 한 번 정리합니다.
- 바뀐 처리 방식을 개인정보 처리방침에 반영했습니다.
“로그인 없이”는 화면 하나가 아니라 인증 흐름 전체에 영향을 주는 결정이었습니다.