A2Z Studio
앱 개발

앱인토스 사진 업로드에서 권한 거절과 브리지 응답 지연을 구분한 방법

A2Z Studio·발행일 2026년 10월 10일·읽는 시간 약 2분

핵심 요약

  • 사진 선택 실패를 하나의 오류 문구로 묶지 않고 권한·지원 환경·응답 지연로 나눈다.
  • 카메라 호출에는 응답 제한 시간을 두고, 브라우저 경로에서는 스트림을 정리한다.
  • 이미지 크기와 반환 형식을 지정해 이후 처리 단계의 입력을 일정하게 만든다.

사진을 입력으로 받는 AI Hair Salon에서는 ‘사진 선택’ 버튼 하나 뒤에 서로 다른 실행 환경이 있습니다. 앱인토스 안에서는 네이티브 앨범·카메라 기능을 호출하고, 브라우저에서 확인할 때는 웹 카메라 경로가 필요합니다. 기능이 실패했을 때도 권한 거절, 지원되지 않는 환경, 응답 지연은 해결 방법이 다릅니다.

이 글은 프로젝트의 usePhotoUpload.js와 권한 처리 코드를 기준으로 흐름을 정리한 사례입니다. 특정 SDK 버전의 일반적인 보장을 설명하기보다는, 이 앱이 어떤 조건을 처리하는지에 초점을 맞춥니다.

앨범: 권한 확인 후 한 장만 가져오기

앨범 경로는 fetchAlbumPhotos.getPermission()으로 권한 상태를 확인하고 필요한 경우 권한 대화상자를 엽니다. 권한 흐름을 통과한 뒤에 사진을 요청합니다.

fetchAlbumPhotos({ maxCount: 1, maxWidth: 1024, base64 })

한 번에 한 장만 요청하고 최대 너비를 제한한 이유는 화면에서 한 장을 스타일 변환 입력으로 쓰기 때문입니다. 반환 형식이 base64일 때는 data:image/jpeg;base64, 접두사를 붙여 미리보기와 이후 처리 단계에서 같은 형식으로 다룹니다.

실패하면 오류 이름에 따라 메시지를 나눕니다. PermissionDeniedError는 앱 권한, OSPermissionDeniedError는 운영체제 권한, TimeoutError는 지연, 지원 불가 오류는 실행 환경 안내로 연결합니다. 사용자가 설정에서 권한을 바꿔야 하는 경우와 잠시 뒤 재시도하면 되는 경우를 같은 문구로 안내하지 않기 위한 구분입니다.

카메라: 네이티브 경로와 브라우저 경로

카메라 훅은 앱인토스의 openCamera와 권한 메서드가 있는지 확인합니다. 사용 가능하면 권한 확인 후 전면 카메라를 열고, 응답을 기다리는 시간에 15초 제한을 둡니다. 제한 시간이 지나면 권한·브리지·네트워크 설정을 확인하라는 메시지로 돌려줍니다.

브리지를 사용할 수 없는 브라우저 경로에서는 navigator.mediaDevices.getUserMedia로 카메라를 열고, 비디오 프레임을 캔버스에 그린 다음 JPEG로 변환합니다. 너비가 1024px보다 크면 비율을 유지해 줄입니다. 캡처를 마쳤거나 비디오 오류가 나면 stream.getTracks().forEach(track => track.stop())으로 장치 사용을 끝냅니다.

상황화면에서 필요한 안내
앱 권한 거절앱의 사진 접근 권한 확인
OS 권한 거절휴대전화 설정의 권한 확인
브리지 지원 불가지원되는 실행 환경에서 다시 열기
응답 지연연결과 권한 상태 확인 후 재시도

직접 점검할 순서

처음 허용, 한 번 거절한 뒤 재시도, 운영체제 설정에서 거절, 느린 응답, 브라우저 단독 실행을 따로 확인해야 합니다. 정상 경로 한 번만 테스트하면 ‘버튼이 아무 반응이 없다’는 상황을 놓치기 쉽습니다. 브라우저에서 카메라를 닫은 뒤에도 장치 표시가 남는지도 확인합니다.

현재 구현이 모든 기기와 권한 조합을 보장한다는 뜻은 아닙니다. 특히 브리지 제공 여부와 OS 권한 화면은 실제 기기에서 검증해야 합니다. 그래도 실패 원인을 나눈 구조는 사용자가 다음에 할 행동을 안내하고, 개발자가 어느 단계에서 막혔는지 찾는 출발점이 됩니다.