---
# System prepended metadata

title: iOS 배포 방법

---

iOS 배포 방법

1. iOS 앱을 IPA 파일로 빌드 한다.
2. 파일 설치를 위해 plist 파일 템플릿을 준비한다.
iOS는 plist 파일을 앱스토어에 전송하여 ipa 파일을 설치하므로 공통 plist 템플릿을 준비하여 사용하는 것이 좋음
```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>items</key>
        <array>
            <dict>
                <key>assets</key>
                <array>
                    <dict>
                        <key>kind</key>
                        <string>software-package</string>
                        <key>url</key>
                        <string>https://www.example.com/apps/foo.ipa</string>
                    </dict>
                </array><key>metadata</key>
                <dict>
                    <key>bundle-identifier</key>
                    <string>com.yun.example</string>
                    <key>bundle-version</key>
                    <string>1.0.0.13</string>
                    <key>kind</key>
                    <string>software</string>
                    <key>title</key>
                    <string>title...!</string>
                </dict>
            </dict>
        </array>
    </dict>
</plist>
```
3. 설치하고자 하는 ipa의 다운로드 경로를 plist 파일 내의 url string에 설정. 
    - 위 템플릿 기준으로 https://www.example.com/apps/foo.ipa 를 ipa 다운로드 경로로 변경
    - plist 파일이 유출되어도 아무나 설치할 수 없도록 조치가 필요함. (S3 이용 시 presignedURL 및 signedURL 입력)
4. plist 파일 다운로드 API를 설정
    - 앱스토어에 plist 파일을 다운로드 하고 해당 파일 내의 설정된 주소로 IPA 파일 설치를 진행하는 방식.
    - 앱스토어발 API 요청이기 때문에 배포 플랫폼 인증과 별도로 인증 수단 추가가 필요함.
    - 앱스토어발 요청시 쿼리 파라미터는 넘겨주지 못하는 것으로 확인.
    - Path Parma 내 uuid 등으로 해당 링크를 1회만 이용 할 수 있도록 제한하는 것을 추천.
    ```
    GET https://test.service.com/api/resources/{resourceId}/{uuid}
    Return ResponseEntity<byte[]>
    ```
5. 작성한 plist 다운로드 API 주소를 itms-services 프로토콜로 앱스토어에 전송
    - itms-services://?action=download-manifest&url={대상 주소} 형식으로 설정
    ```
    itms-services://?action=download-manifest&url=https://test.service.com/api/resources/{resourceId}/{uuid}
    ```
