이번 편의 목표: 맥 앱스토어가 요구하는 앱 샌드박스를 켜고, 자동 서명이 개발자 팀과 연결되게 합니다.

맥 앱스토어 앱은 샌드박스 안에서 실행되어야 합니다. 샌드박스는 앱이 마음대로 집 폴더, 다른 앱, 네트워크, 하드웨어에 접근하지 못하게 막습니다. 스토어 밖에 Developer ID로 배포할 때는 권장 사항이지만, 스토어 안에서는 필수입니다. 배포 방식의 차이는 다음 문서에 표로 정리되어 있습니다.

Xcode에서 Library 대상을 선택하고 Signing & Capabilities를 엽니다. Automatically manage signing을 켭니다. Team에는 01편의 개발자 팀을 선택합니다. Bundle Identifier는 com.thinktree.library입니다. App Sandbox 능력이 목록에 없으면 Capability를 추가합니다. 새 맥 앱 템플릿은 이 능력이 이미 켜져 있는 경우가 많습니다.

예제 앱은 자기 컨테이너 안에만 데이터를 둡니다. 사용자가 고른 파일을 읽거나 네트워크에 접속하지 않으므로 파일과 네트워크 권한을 켜지 않습니다. 권한 파일은 다음처럼 샌드박스만 참입니다.

XML
<?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을 직접 만듭니다.

직접 해 보기

샌드박스를 켠 뒤 앱을 실행하세요. 집 폴더의 임의 경로를 코드에서 읽으려고 하면 실패해야 합니다. 컨테이너 안의 저장은 성공해야 합니다.

해설

임의 경로 실패는 샌드박스가 동작한다는 신호입니다. 그 실패를 피하려고 샌드박스를 끄면 맥 앱스토어 업로드 검사에서 거절됩니다. 필요한 파일은 열기 패널이나 앱 컨테이너로 바꿉니다.