이번 편의 목표: 맥 앱스토어가 요구하는 앱 샌드박스를 켜고, 자동 서명이 개발자 팀과 연결되게 합니다.
맥 앱스토어 앱은 샌드박스 안에서 실행되어야 합니다. 샌드박스는 앱이 마음대로 집 폴더, 다른 앱, 네트워크, 하드웨어에 접근하지 못하게 막습니다. 스토어 밖에 Developer ID로 배포할 때는 권장 사항이지만, 스토어 안에서는 필수입니다. 배포 방식의 차이는 다음 문서에 표로 정리되어 있습니다.
Xcode에서 Library 대상을 선택하고 Signing & Capabilities를 엽니다. Automatically manage signing을 켭니다. Team에는 01편의 개발자 팀을 선택합니다. Bundle Identifier는 com.thinktree.library입니다. App Sandbox 능력이 목록에 없으면 Capability를 추가합니다. 새 맥 앱 템플릿은 이 능력이 이미 켜져 있는 경우가 많습니다.
예제 앱은 자기 컨테이너 안에만 데이터를 둡니다. 사용자가 고른 파일을 읽거나 네트워크에 접속하지 않으므로 파일과 네트워크 권한을 켜지 않습니다. 권한 파일은 다음처럼 샌드박스만 참입니다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
</dict>
</plist>나중에 열기 패널로 사용자가 고른 파일만 읽고 써야 하면 com.apple.security.files.user-selected.read-write를 참으로 추가합니다. 그 권한은 패널에서 고른 파일에만 적용됩니다. 집 폴더 전체를 읽는 권한은 스토어 심사에서 사유를 요구받습니다. 예제에는 넣지 않습니다.
Hardened Runtime은 스토어 밖 공증에는 필수입니다. 스토어 업로드 자체만 놓고 보면 샌드박스가 먼저입니다. 새 코드에는 Hardened Runtime도 함께 켜 둡니다. 디버거나 특정 메모리 실행이 필요한 예외만 개별적으로 엽니다. 예제에는 예외가 필요 없습니다.
서명이 붙었는지 아카이브 전의 개발 빌드에서 확인할 수 있습니다. 앱 꾸러미 경로를 넣어 실행합니다.
codesign -dvvv --entitlements - Library.app
출력에 com.apple.security.app-sandbox가 참이면 샌드박스가 켜진 것입니다. 활동 모니터의 샌드박스 열에서도 실행 중인 앱이 Yes인지 볼 수 있습니다. 개발 실행은 Apple Development 서명이고, 업로드용 아카이브는 Xcode가 Apple Distribution 서명과 맥 앱스토어 프로파일을 자동으로 고릅니다. 자동 관리가 실패할 때만 인증서 목록에서 Apple Distribution을 직접 만듭니다.
직접 해 보기
샌드박스를 켠 뒤 앱을 실행하세요. 집 폴더의 임의 경로를 코드에서 읽으려고 하면 실패해야 합니다. 컨테이너 안의 저장은 성공해야 합니다.
해설
임의 경로 실패는 샌드박스가 동작한다는 신호입니다. 그 실패를 피하려고 샌드박스를 끄면 맥 앱스토어 업로드 검사에서 거절됩니다. 필요한 파일은 열기 패널이나 앱 컨테이너로 바꿉니다.
COMMENTS
댓글 0
이 글에 대한 의견이나 질문을 남겨 주세요.
댓글은 구글이나 카카오로 시작한 뒤에 남길 수 있습니다.
등록된 댓글이 없습니다.