---
title: App Store에서 배포
sidebar:
  order: 1
i18nReady: true
---

import CommandTabs from '@components/CommandTabs.astro';
import TranslationNote from '@components/i18n/TranslationNote.astro';

[Apple App Store]는 Apple사가 운영하는 앱 마켓플레이스입니다.
이 App Store를 통해 macOS 및 iOS를 대상으로 한 Tauri 앱을 배포할 수 있습니다.

이 장에서는 "앱을 직접 App Store에 배포하는" 방법만 다룹니다.
macOS 배포 옵션 및 설정에 대한 자세한 내용은 종합적인 "[App Bundle][App Bundle로 배포]" 장을 참조하십시오.

## 필요 조건

iOS와 macOS 앱을 배포하려면 [Apple Developer] 프로그램에 등록해야 합니다.

또한 [macOS][macOS 코드 서명]와 [iOS][iOS 코드 서명]의 코드 서명을 설정해야 합니다.

## 앱 아이콘 변경

`tauri ios init`을 실행하여 Xcode 프로젝트를 생성한 후, `tauri icon` 명령을 사용하여 앱 아이콘을 업데이트할 수 있습니다.

<CommandTabs
  npm="npm run tauri icon /path/to/app-icon.png -- --ios-color #fff"
  yarn="yarn tauri icon /path/to/app-icon.png --ios-color #fff"
  pnpm="pnpm tauri icon /path/to/app-icon.png --ios-color #fff"
  deno="deno task tauri icon /path/to/app-icon.png --ios-color #fff"
  bun="bun tauri icon /path/to/app-icon.png --ios-color #fff"
  cargo="cargo tauri icon /path/to/app-icon.png --ios-color #fff"
/>

인수 `--ios-color`는 iOS 아이콘의 배경색을 정의합니다.

## 설정

Apple Developer 프로그램에 등록한 후, Tauri 앱을 App Store에서 배포하기 위한 첫 번째 단계는 앱을 [App Store Connect][app-store-connect-apps]에 등록하는 것입니다.

:::note
"_Bundle ID_" 필드에 지정된 값은 [`tauri.conf.json > identifier`]에 정의된 식별자와 일치**해야 합니다**.
:::

## 빌드 및 업로드

Tauri CLI는 앱을 macOS 및 iOS용으로 패키징할 수 있습니다. 단, macOS 컴퓨터에서 실행해야 합니다.

Tauri는 [`tauri.conf.json > version`]에 정의된 값에서 [`CFBundleVersion`](https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleversion) (번들 버전)을 가져옵니다.
다른 번들 버전 체계, 예를 들어 "연속 부호" 등이 필요한 경우,
[`tauri.conf.json > bundle > iOS > bundleVersion`] 또는 [`tauri.conf.json > bundle > macOS > bundleVersion`] 설정에서 고유한 번들 버전을 지정할 수 있습니다:

```json title="tauri.conf.json" ins={4}
{
  "bundle": {
    "iOS": {
      "bundleVersion": "100"
    }
  }
}
```

:::caution
"코드 서명"이 필요합니다. [macOS][macOS 코드 서명] 및 [iOS][iOS 코드 서명]의 "코드 서명" 관련 문서를 참조하십시오.
:::

Tauri는 iOS 앱에 Xcode를 이용하므로, iOS용 아카이브 및 배포에 Tauri CLI 대신 Xcode를 사용할 수 있다는 점에 유의하십시오.
iOS 프로젝트를 Xcode에서 열고 빌드하려면 다음 명령을 실행합니다:

<CommandTabs
  npm="npm run tauri ios build -- --open"
  yarn="yarn tauri ios build --open"
  pnpm="pnpm tauri ios build --open"
  deno="deno task tauri ios build --open"
  bun="bun tauri ios build --open"
  cargo="cargo tauri ios build --open"
/>

### macOS에서

앱을 App Store에 업로드하려면 먼저 모든 필요한 설정 옵션이 입력되었는지 확인해야 합니다. 그런 다음 App Bundle을 패키징하고 서명된 `.pkg` 파일을 만들어 업로드할 수 있습니다.

다음 각 항목에서 이 프로세스를 순서대로 설명합니다.

#### 설정

앱이 App Store 검증 시스템에서 수락되려면 앱에 몇 가지 설정 항목이 포함되어 있어야 합니다.

:::tip
여기서는 App Store 제출용으로 앱을 설정하는 절차에 대해 설명합니다.

다음 설정 변경을 "App Store용으로 빌드하는" 경우에만 적용하려면 다른 Tauri 설정 파일을 만듭니다.

```json title="src-tauri/tauri.appstore.conf.json
{
  "bundle": {
    "macOS": {
      "entitlements": "./Entitlements.plist",
      "files": {
        "embedded.provisionprofile": "path/to/profile-name.provisionprofile"
      }
    }
  }
}
```

그런 다음 Tauri 앱을 App Store용으로 번들링할 때 해당 설정 파일을 기본 설정 파일과 병합합니다:

<CommandTabs
  npm="npm run tauri build -- --no-bundle
npm run tauri bundle -- --bundles app --target universal-apple-darwin --config src-tauri/tauri.appstore.conf.json"
  yarn="yarn tauri build --no-bundle
yarn tauri bundle -- --bundles app --target universal-apple-darwin --config src-tauri/tauri.appstore.conf.json"
  pnpm="pnpm tauri build --no-bundle
pnpm tauri bundle -- --bundles app --target universal-apple-darwin --config src-tauri/tauri.appstore.conf.json"
  deno="deno task tauri build --no-bundle
deno task tauri bundle -- --bundles app --target universal-apple-darwin --config src-tauri/tauri.appstore.conf.json"
  bun="bun tauri build --no-bundle
bun tauri bundle -- --bundles app --target universal-apple-darwin --config src-tauri/tauri.appstore.conf.json"
  cargo="cargo tauri build --no-bundle
cargo tauri bundle -- --bundles app --target universal-apple-darwin --config src-tauri/tauri.appstore.conf.json"
/>

이 방법은 다음과 같은 경우에 특히 유용합니다.

- 앱을 App Store에 업로드하기 위해 CI/CD를 설정하지만 로컬에서 "[프로비저닝 프로필]"이 필요하지 않은 경우
- App Store 이외에서 배포하기 위해 앱을 컴파일하는 경우

<TranslationNote lang="ko">

**프로비저닝 프로필** provision profile. iOS/macOS 앱 개발자가 진짜임을 나타내는 인증서. "[개발용](https://developer.apple.com/kr/help/glossary/development-provisioning-profile/)"과 "[배포용](https://developer.apple.com/kr/help/glossary/distribution-provisioning-profile/)" 두 종류가 있습니다.

</TranslationNote>

:::

- Category(카테고리 항목)

앱을 App Store에 표시하려면 [`tauri.conf.json > bundle > category`](카테고리 항목)를 명시해야 합니다:

```json title="tauri.conf.json" ins={3}
{
  "bundle": {
    "category": "Utility"
  }
}
```

- Provisioning profile(프로비저닝 프로필)

또한 앱을 Apple에 수락받으려면 "프로비저닝 프로필"도 만들어야 합니다.

Apple Developer 사이트의 "[Identifiers](https://developer.apple.com/account/resources/identifiers/list)(ID)" 페이지에서 새로운 "[App ID]"를 만들고, "[Bundle ID]" 값이 [`tauri.conf.json > identifier`]에 설정된 ID(식별자)와 일치하는지 확인합니다.

그런 다음 [Profiles](https://developer.apple.com/account/resources/profiles/list) 페이지로 이동하여 새로운 "프로비저닝 프로필"을 만듭니다.
App Store에서 macOS 앱을 배포하는 경우 "Mac App Store Connect" 프로필이어야 합니다.
적절한 "앱 ID"를 선택하고 "코드 서명"에 사용하는 "인증서"와 연결합니다.

"프로비저닝 프로필"을 만든 후 다운로드하여 잘 아는 위치에 저장하고, "[App Bundle](앱 번들)에 포함되도록 Tauri를 설정합니다:

```json title="tauri.conf.json" ins={4-6}
{
  "bundle": {
    "macOS": {
      "files": {
        "embedded.provisionprofile": "path/to/profile-name.provisionprofile"(프로비저닝 프로필 경로 기재)
      }
    }
  }
}
```

- Info.plist(정보 속성 목록)

<TranslationNote lang="ko">

**정보 속성 목록** Information Property List. 자세한 내용은 [Info.plist](영어)를 참조하십시오.

</TranslationNote>

앱은 "암호화 수출 규제"(가칭)를 준수해야 합니다.
자세한 내용은 [Apple사 공식 문서](https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations?language=objc)(영어)를 참조하십시오.

src-tauri 폴더에 Info.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>ITSAppUsesNonExemptEncryption</key>
	<false/> # or `true` if your app uses encryption
</dict>
</plist>
```

- Entitlements(인타이틀먼트/자격)

<TranslationNote lang="ko">

**인타이틀먼트** entitlement: "권리, 자격"을 부여하거나 부여된 "권리, 자격". 여기서는 정보나 데이터, 자원 등을 이용할 자격, 권리의 부여나 제한을 하는 것. Apple사 용어 해설은 [여기](https://developer.apple.com/kr/help/glossary/?q=인타이틀먼트).

</TranslationNote>

앱을 App Store에서 배포하려면 액세스 제어 기능인 [App Sandbox]를 포함해야 합니다.
또한 "코드 서명" 자격 설정에서 "App ID"와 "[team ID]"도 설정해야 합니다.

`src-tauri` 폴더에 `Entitlements.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>com.apple.security.app-sandbox</key>
    <true/>
    <key>com.apple.application-identifier</key>
    <string>$TEAM_ID.$IDENTIFIER</string>
    <key>com.apple.developer.team-identifier</key>
    <string>$TEAM_ID</string>
</dict>
</plist>
```

`$IDENTIFIER`는 [`tauri.conf.json > identifier`]의 값으로, `$TEAM_ID`는 Apple Developer "team ID"의 값으로 바꿔야 한다는 점에 유의하십시오. "team ID"는 프로비저닝 프로필용으로 만든 [Identifier](https://developer.apple.com/account/resources/identifiers/list)의 `App ID Prefix` 섹션에 있습니다.

그리고 macOS 번들 설정 [`tauri.conf.json > bundle > macOS > entitlements`]에서 이 `Entitlements.plist` 파일을 참조합니다.

```json title="tauri.conf.json" ins={4}
{
  "bundle": {
    "macOS": {
      "entitlements": "./Entitlements.plist"
    }
  }
}
```

인타이틀먼트(자격)를 적용하려면 코드 서명을 활성화하고 애플리케이션을 빌드해야 합니다.

"App Sandbox" 환경에서 앱을 실행했을 때 앱이 작동하는지 확인하십시오.

<TranslationNote lang="ko">

**App Sandbox** macOS에 구현된 보안 기능. 자세한 내용은 [Apple사 사이트](https://developer.apple.com/kr/help/glossary/app-sandbox/)를 참조하십시오.

</TranslationNote>

#### 빌드

macOS 애플리케이션은 `.pkg` 파일로 App Store에 업로드해야 합니다.
다음 명령을 실행하여 앱을 macOS App Bundle(확장자는 `.app`)로 패키징합니다:

```
tauri build --bundles app --target universal-apple-darwin
```

:::note
위의 명령은 유니버설 앱 바이너리 애플리케이션을 생성하여 "Apple 실리콘"과 "Intel 프로세서"를 모두 지원합니다.

만약 "Apple 실리콘"만 지원하고 싶다면, [`tauri.conf.json > bundle > macOS > minimumSystemVersion`]을 `12.0`으로 변경해야 합니다:

```json title="tauri.conf.json" ins={4}
{
  "bundle": {
    "macOS": {
      "minimumSystemVersion": "12.0"
    }
  }
}
```

그리고 사용하는 Mac 시스템에 따라 CLI 명령과 출력 경로를 변경합니다:

- 빌드에 사용하는 시스템이 "Apple 실리콘"을 사용하는 경우, 인수 "`--target universal-apple-darwin`"을 삭제하고, 다음 `.pkg` 생성 명령에서 참조되는 경로에서 "`target/universal-apple-darwin/release`" 대신 "`target/release`"를 사용합니다.
- 빌드에 사용하는 시스템이 "Intel 칩"을 사용하는 경우:
  - Rust Apple 실리콘 타겟을 설치합니다:
    ```
    rustup target add aarch64-apple-darwin
    ```
  - 인수 "`universal-apple-darwin`"을 "`aarch64-apple-darwin`"으로 변경하고, 다음 `.pkg` 생성 명령에서 참조되는 경로에서 "`target/universal-apple-darwin/release`" 대신 "`target/aarch64-apple-darwin/release`"를 사용합니다.

:::

설정 옵션에 대한 자세한 내용은 [App Bundle로 배포] 장을 참조하십시오.

App Bundle에서 서명된 `.pkg`를 생성하려면 다음 명령을 실행합니다:

```
xcrun productbuild --sign "<certificate signing identity>" --component "target/universal-apple-darwin/release/bundle/macos/$APPNAME.app" /Applications "$APPNAME.pkg"
```

【주의】 _$APPNAME_ 부분은 자신의 앱 이름으로 바꿔야 합니다.

:::note
_Mac Installer Distribution_ 서명 인증서를 사용하여 "Mac 인스톨러 패키지"에 서명해야 합니다.
:::

#### 업로드

이제 명령줄 유틸리티(CLI)인 [`altool`]을 사용하여 앱 패키지를 App Store에 업로드할 수 있습니다:

```
xcrun altool --upload-app --type macos --file "$APPNAME.pkg" --apiKey $APPLE_API_KEY_ID --apiIssuer $APPLE_API_ISSUER
```

【주의】 `altool`은 앱을 업로드하기 위해 [App Store Connect] API 키가 필요하다는 점에 유의하십시오.
자세한 내용은 아래 [인증] 항목을 참조하십시오.

그런 다음 앱은 Apple에 의해 검증되고 승인되면 [TestFlight]를 사용할 수 있게 됩니다.

<TranslationNote lang="ko">

**altool** ※ "이 공증 도구의 "인증" 기능은 2023-11-01을 기해 폐지되고 `notarytool`로 이전될 것"이라는 [Apple Technote] 2023-05-30 릴리스가 있었습니다. App store에 앱 업로드는 계속할 수 있는 것 같지만, 필요에 따라 최신 상황을 확인해 주십시오. "TN3147: Apple has deprecated `altool` for the purposes of notarization"

</TranslationNote>

### iOS에서

iOS 앱을 빌드하려면 `tauri ios build` 명령을 실행합니다.

<CommandTabs
  npm="npm run tauri ios build -- --export-method app-store-connect"
  yarn="yarn tauri ios build --export-method app-store-connect"
  pnpm="pnpm tauri ios build --export-method app-store-connect"
  deno="deno task tauri ios build --export-method app-store-connect"
  bun="bun tauri ios build --export-method app-store-connect"
  cargo="cargo tauri ios build --export-method app-store-connect"
/>

생성된 [IPA 파일]은 `src-tauri/gen/apple/build/arm64/$APPNAME.ipa`에 있습니다.

<TranslationNote lang="ko">

**IPA 파일** IPA file: iOS 애플리케이션의 아카이브 파일로, iOS Package Archive(확장자 .ipa)의 약자입니다.

</TranslationNote>

_$APPNAME_ 부분을 자신의 앱 이름으로 바꿔야 한다는 점에 유의하십시오.

이제 `altool` CLI를 사용하여 iOS 앱을 App Store에 업로드할 수 있습니다:

```
xcrun altool --upload-app --type ios --file "src-tauri/gen/apple/build/arm64/$APPNAME.ipa" --apiKey $APPLE_API_KEY_ID --apiIssuer $APPLE_API_ISSUER
```

`altool`은 앱을 업로드하기 위해 [App Store Connect] API 키가 필요하다는 점에 유의하십시오.
자세한 내용은 아래 [인증] 항목을 참조하십시오.

그런 다음 앱은 Apple에 의해 검증되고 승인되면 [TestFlight]를 사용할 수 있게 됩니다.

### 인증

iOS 및 macOS 앱은 인증에 App Store Connect API 키를 이용하는 `altool`을 사용하여 업로드됩니다.

새로운 API 키를 만들려면 [App Store Connect Users and Access page]를 열고, "Integrations(통합) > Individual Keys tab(개별 키 탭)"을 선택하고, "Add(추가)" 버튼을 클릭하여 "이름"과 "the Developer access(개발자 액세스)"를 선택합니다.
"`APPLE_API_ISSUER`"(발급자 ID)는 키 테이블 상단에 표시되고, "`APPLE_API_KEY_ID`"는 해당 테이블의 "키 ID" 열의 값이 됩니다.
"비밀 키 private key" 다운로드도 필요하지만, 이는 한 번만 실행되며 페이지를 새로고침한 후에만 표시됩니다(버튼이 새로 생성된 키에 해당하는 테이블 행에 표시됩니다).
이 비밀 키 파일의 경로는 "`AuthKey\_<APPLE_API_KEY_ID>.p8`"으로, 다음 디렉토리 중 하나에 저장해야 합니다: `<current-working-directory>/private_keys`, `~/private_keys`, `~/.private_keys` 또는 `~/.appstoreconnect/private_keys`입니다.

[App Bundle로 배포]: /ko/distribute/macos-application-bundle/
[Apple Developer]: https://developer.apple.com/kr/
[Apple App Store]: https://www.apple.com/kr/app-store/
[`altool`]: https://help.apple.com/itc/apploader/#/apdATD1E53-D1E1A1303-D1E53A1126
[macOS 코드 서명]: /ko/distribute/sign/macos/
[iOS 코드 서명]: /ko/distribute/sign/ios/
[app-store-connect-apps]: https://appstoreconnect.apple.com/apps
[`tauri.conf.json > identifier`]: /reference/config/#identifier
[`tauri.conf.json > bundle > category`]: /reference/config/#category
[`tauri.conf.json > bundle > macOS > entitlements`]: /reference/config/#entitlements
[`tauri.conf.json > bundle > macOS > minimumSystemVersion`]: /reference/config/#minimumsystemversion
[App Store Connect's Users and Access page]: https://appstoreconnect.apple.com/access/users
[인증]: #인증
[App Bundle]: https://developer.apple.com/kr/help/glossary/?q=app%20bundle
[App ID]: https://developer.apple.com/kr/help/glossary/?q=앱ID
[App Sandbox]: https://developer.apple.com/kr/help/glossary/?q=App%20Sandbox
[App Store Connect]: https://developer.apple.com/kr/help/glossary/?q=App%20Store%20Connect
[Apple Technote]: https://developer.apple.com/documentation/technotes/tn3147-migrating-to-the-latest-notarization-tool?changes=_3_3
[Bundle ID]: https://developer.apple.com/kr/help/glossary/?q=번들ID
[Info.plist]: https://developer.apple.com/documentation/bundleresources/information-property-list
[IPA 파일]: https://ko.wikipedia.org/wiki/IPA_(파일_포맷)
[team ID]: https://developer.apple.com/kr/help/glossary/?q=team
[TestFlight]: https://developer.apple.com/kr/help/glossary/?q=TestFlight
[프로비저닝 프로필]: https://developer.apple.com/kr/help/glossary/?q=프로필

<div style="text-align: right">
  【※ 이 한국어판은, 「May 21, 2025 영문판」에 근거하고 있습니다】
</div>
