[Swift] Access Security Scoped File URL

민경준·2022년 3월 16일
1

파일 업로드를 하기 위해 UIDocumentPickerViewController를 사용하여
파일을 선택하고 업로드 api 테스트를 진행하는 도중 에러가 발견되었다.

The URL provided is a directory 즉, 해당 url은 file이 아니라 folder 라는것
근데 나는 pdf 파일을 선택했는데..?

URL > file:///private/var/mobile/Containers/Shared/AppGroup/675FC249-8955-4233-BD2A-1F088CEE5587/File%20Provider%20Storage/Elementary_Workbook_Unit7.pdf

이 에러를 해결하기 위해 한참을 서칭하던 도중 우연히 단서를 하나 발견했다.. 문서 picker에서 컨텐츠를 선택했을때 security-scoped URL이 반환될 수 있다는 것...

문서 picker에서 사용자가 디렉토리를 선택하면, 시스템은 앱에게 해당 디렉토리 및 이 디렉토리의 모든 컨텐츠에 대한 접근권한 허용을 줍니다. 문서 picker는 디렉토리에 대한 security-scoped URL을 반환합니다. 디렉토리의 컨텐트를 열거하기 위해 이와 같은 URL 중 한 가지를 사용하는 경우 결과 URL 역시 security-scoped 입니다. security-scoped URL을 북마크로 저장할 수 있고, 이후 security-scoped로 다시 확인할 수 있습니다.
.
(출처: https://velog.io/@panther222128/Providing-Access-to-Directories)

그렇다,,, 내가 문서 picker로 부터 얻은 url은 secruity-scpoed URL 이기때문에
upload 할때는 해당 URL에 대한 접근 권한을 얻은 뒤에 진행을 해야한다.

  1. URL을 사용하기 전에 startAccessingSecurityScopedResource()를 호출하여 권한을 얻는다.
  2. standardizedFileURL 을 통해 private이 떨어져 나간 url을 얻어 upload를 진행한다.
  3. upload가 모두 끝난 뒤에 stopAccessingSecurityScopedResource()를 호출하여 접근 권한을 종료시킨다.

이렇게 하면 에러 없이 깔끔하게 upload에 성공할 수 있다.

profile
iOS Developer 💻

0개의 댓글