View in English

  • 메뉴 열기 메뉴 닫기
  • Apple Developer
검색
검색 닫기
  • Apple Developer
  • 뉴스
  • 둘러보기
  • 디자인
  • 개발
  • 배포
  • 지원
  • 계정
페이지에서만 검색

빠른 링크

5 빠른 링크

비디오

메뉴 열기 메뉴 닫기
  • 컬렉션
  • 주제
  • 전체 비디오
  • 소개

WWDC25 컬렉션으로 돌아가기

  • 소개
  • 요약
  • 자막 전문
  • 코드
  • Apple-Hosted Background Assets 알아보기

    Background Assets를 기반으로 한 이 세션에서는 게임 및 기타 애플리케이션에 대한 콘텐츠 애셋 팩을 다운로드할 수 있는 새로운 기능을 소개합니다. Apple이 개발자를 위해 이러한 애셋 팩을 호스팅하거나 자체 호스팅 옵션을 관리하는 방법을 알아보세요. 네이티브 API 통합 및 해당 App Store 구현에 대해 자세히 살펴봄으로써 앱의 콘텐츠 전달 및 사용자 경험을 향상하는 도구를 제공합니다.

    챕터

    • 0:00 - 서론
    • 1:01 - 백그라운드 애셋의 새 기능
    • 7:32 - 샘플 앱 개발
    • 17:24 - 베타 테스트 및 배포

    리소스

    • Maximum build file sizes
    • Overview of Apple-hosted asset packs
    • Testing asset packs locally
      • HD 비디오
      • SD 비디오

    관련 비디오

    WWDC25

    • App Store Connect API로 개발 흐름 자동화하기
    • App Store Connect의 새로운 기능

    WWDC23

    • 백그라운드 에셋의 새 기능
  • 비디오 검색…

    안녕하세요 저는 Gabriel이고 App Store 팀의 소프트웨어 엔지니어입니다 저는 Jenny이고 App Processing 팀의 엔지니어입니다 백그라운드 애셋을 사용하여 App Store에 앱 에셋을 배포하는 새로운 방법을 소개합니다 앱과 애셋이 기기에서 어떻게 함께 작동하는지 설명하겠습니다 또한 애셋에 Apple 호스팅을 사용하는 방법도 공유합니다 이 세션에서는 먼저 백그라운드 애셋 및 현재 사용 가능한 애셋 배포 기술을 검토하겠습니다 백그라운드 애셋을 관리하는 새 Swift 및 Objective-C API와 Apple 호스팅 등 올해의 새로운 기능을 알아보겠습니다

    iOS, iPadOS, macOS, tvOS visionOS에서 새 기능을 앱에 통합하는 방법과 로컬 테스트 수행 방법을 소개합니다

    Apple이 애셋을 호스팅 및 배포하기를 원한다면 베타 테스트 및 App Store 배포를 준비하는 방법을 설명하겠습니다

    Gabriel이 백그라운드 애셋 및 새로운 기능을 설명하겠습니다

    고마워요, Jenny 사용자는 App Store에서 앱을 다운로드할 때 즉시 사용하기를 원합니다 앱을 열었을 때 추가 다운로드가 끝나기를 기다려야 한다면 앱을 닫거나 삭제할 수도 있습니다

    백그라운드 애셋을 사용하면 더욱 편리한 첫 실행 경험을 선사할 수 있습니다 시스템이 기기에서 애셋을 다운로드 및 업데이트하는 방식을 구성하고 기본 앱 업데이트 없이 애셋을 업데이트할 수 있습니다 예를 들어 게임을 처음 다운로드한 사용자에게만 튜토리얼 레벨을 제공하여 나머지 게임이 백그라운드에서 다운로드되는 동안 빠르게 플레이할 수 있으며 앱 내 구입으로 잠금 해제하는 선택적 다운로드 콘텐츠인 DLC를 제공하거나 App Store 제출 절차를 가속화해 기기에서 머신 러닝 모델을 업데이트할 수 있습니다 튜토리얼을 포함한 여러 레벨이 있는 게임을 개발 중이라고 가정해 보겠습니다 각 레벨의 애셋을 전달하기 위한 옵션이 네 가지 있습니다 기본 앱 번들에 모두 포함하기 URLSession On-Demand Resources 또는 백그라운드 애셋입니다 각 옵션의 장단점을 자세히 살펴보겠습니다

    모든 애셋을 기본 앱 번들에 포함하면 튜토리얼 레벨 시작에 일부 애셋만 필요하더라도 모든 애셋이 다운로드될 때까지 기다려야 합니다 대부분의 플랫폼에서 4GB 크기 제한에 걸릴 수 있으며 애셋을 하나만 업데이트해도 전체 앱을 다시 업로드 및 제출해야 합니다 On-Demand Resources라면 튜토리얼이 더 빨라집니다 TestFlight 또는 App Store에서 앱 번들 일부를 따로 다운로드할 수 있으니까요 하지만 일부 애셋 파일 업데이트 시 여전히 전체 앱을 업데이트해야 합니다 On-Demand Resources는 레거시 기술이며 곧 지원 중단됩니다

    후속 기술인 백그라운드 애셋은 앱 애셋을 자체 서버에 호스팅할 수 있습니다 앱 전체를 업데이트하지 않고도 애셋을 언제든 업데이트할 수 있죠 백그라운드 애셋의 핵심은 다운로더 확장 프로그램으로 사용자가 앱을 열기 전에 애셋 다운로드를 진행하는 코드를 작성할 수 있습니다 이 기능은 다운로드 동작과 포스트 프로세싱 과정을 직접 제어해야 할 때 매우 유용합니다 하지만 여러분은 앱의 애셋이 사용 가능하며 최신 상태인지가 가장 중요할 겁니다 새로운 관리형 백그라운드 애셋을 사용하면 시스템이 애셋 팩의 다운로드, 업데이트 압축 등을 자동으로 관리합니다 Apple이 작성한 시스템 제공 다운로드나 확장 프로그램은 맞춤형 코드 없이 앱에 추가할 수 있습니다 또한 TestFlight 및 App Store에 배포된 앱에 새로운 Apple 호스팅 백그라운드 애셋 서비스를 제공하므로 애셋을 자체 서버 호스팅 대신 Apple 호스팅 옵션을 사용할 수 있습니다 Apple Developer Program 멤버십에 200GB의 Apple 호스팅 용량이 제공됩니다

    On-Demand Resources를 아직 사용 중이라면 백그라운드 애셋으로 마이그레이션하시기 바랍니다 관리형 백그라운드 애셋으로는 게임의 튜토리얼 레벨에 필요한 텍스처, 사운드 효과 GPU 셰이더 같은 애셋 파일을 그룹화한 여러 애셋 팩을 만들 수 있습니다 시스템은 다운로드 정책에 따라 사용자의 기기에 애셋 팩을 자동으로 다운로드합니다 다운로드 정책은 세 가지로 각각 필수, 프리페치, 온디맨드입니다 필수 다운로드 정책은 시스템이 애셋 팩을 자동으로 다운로드하고 설치 과정에 통합합니다 애셋 팩은 사용자가 App Store, TestFlight 홈 화면에서 보는 전체 다운로드 진행도에 기여합니다 설치가 완료되고 사용자가 앱을 열었을 때 애셋 팩을 바로 사용할 수 있습니다

    프리페치 다운로드 정책은 앱 설치 도중에 애셋 팩을 다운로드하기 시작하지만 앱 설치가 완료된 후에도 백그라운드에서 다운로드가 계속될 수 있습니다 온디맨드 다운로드 정책은 사용자가 API 메서드를 명시적으로 호출하여 요청 시에만 애셋 팩을 다운로드합니다 애셋 팩을 자체 호스팅하거나 Apple에 호스팅을 맡길 수 있습니다 이제 Jenny가 Apple 서버가 애셋 팩과 앱 빌드를 어떻게 전달하는지 설명하겠습니다 네, 그러죠 Apple이 호스팅하는 각 애셋 팩은 여러 플랫폼을 지원하는 하나의 앱에 사용할 수 있습니다 앱 바이너리와 앱에 사용할 애셋 팩을 기기에서 다운로드하려면 먼저 두 파일을 App Store Connect에 따로 업로드해야 합니다 이후 TestFlight 및 App Store 배포에서 외부 테스트를 위한 심사를 요청할 수 있습니다

    업로드한 애셋 팩에는 버전이 할당되며 특정 앱 빌드와 연결되지 않습니다 기기에서 앱과 애셋 팩이 어떻게 매칭되는지는 애셋 팩 버전의 상태에 따라 결정됩니다 예를 들어 설명해 드리겠습니다

    같은 애셋 팩에 3개의 다른 버전이 있다고 가정해 보겠습니다 버전 1은 App Store에 출시되었고 버전 2는 TestFlight에서 외부 베타 중이며 버전 3은 TestFlight에서 내부 베타 중입니다 컨텍스트별로 애셋 팩의 한 가지 버전만 사용할 수 있습니다 동시에 기기에는 App Store에서 다운로드한 앱 빌드나 TestFlight 외부 베타 또는 내부 베타를 통해 다운로드한 앱 빌드가 존재할 수 있습니다 서버는 해당 컨텍스트 내 모든 앱 빌드에 대한 애셋 팩의 라이브 버전을 선택하여 전달합니다

    즉, App Store에서 다운로드한 앱 버전 1.0 빌드 1은 애셋 팩 버전 1을 사용합니다

    TestFlight의 외부 베타에서 사용 가능한 앱 버전 2.0 빌드 1은 애셋 팩 버전 2를 사용합니다 그리고 내부 베타 중인 앱 버전 2.0 빌드 2와 3 애셋 팩 버전 3을 사용합니다

    애셋 팩 버전 업데이트 시의 동작을 이해하는 것이 중요합니다

    예를 들어 애셋 팩 버전 2에 만족한다면 App Store 배포를 위해 제출할 수 있습니다 그러면 새 애셋 팩으로 대체된 앱이 App Store에 출시됩니다

    즉, App Store에서 다운로드된 앱의 모든 버전이 애셋 팩 버전 2를 사용하도록 자동 전환되며 사용자의 기기에 아직 설치되어 있는 이전 버전도 포함됩니다 따라서 애셋 팩을 업데이트하기 전에 이전 앱 빌드 및 버전에서도 잘 작동하는지 확인해야 합니다 이제 앱 빌드 업데이트 예시를 살펴보겠습니다 외부 베타 테스트를 위해 앱 버전 2.0 빌드 3을 제출한다고 가정해 보겠습니다 승인 후 외부 베타를 통해 빌드가 다운로드되면 이전 애셋 팩 버전 2가 사용됩니다 새로운 애셋 팩 버전 3과 연결되도록 하려면 애셋 팩 버전도 함께 제출해야 합니다 애셋 팩의 개념을 이해했으니 Gabriel이 애셋 팩을 생성하고 앱에서 사용하는 방법을 안내하겠습니다 고마워요, Jenny 앱에서 관리형 백그라운드 애셋을 사용하는 방법을 보여드리겠습니다

    관리형 백그라운드 애셋을 시작하려면 애셋 팩을 생성하고 새로운 API를 적용한 후 앱과 애셋 팩을 로컬에서 테스트해야 합니다

    애셋 팩을 만드는 방법을 설명해 드리겠습니다

    macOS, Linux 및 Windows용의 새로운 패키징 도구를 사용하면 소스 리포지토리에서 파일을 가져와 압축 아카이브로 패키징하여 TestFlight 및 App Store에 배포할 수 있습니다 이 도구는 macOS의 Xcode와 함께 제공되며 Linux 및 Windows용은 Apple 개발자 웹사이트의 다운로드 섹션에서 제공할 예정입니다 도구를 실제로 사용해 보겠습니다

    템플릿 명령어를 실행해 매니페스트 템플릿을 생성할 수 있습니다 macOS에서는 Xcode를 설치 후 터미널에서 xcrun ba-package template을 실행합니다 Linux나 Windows에서는 셸의 검색 경로에 도구를 추가한 후 ba-package template을 실행합니다 패키징 도구가 매니페스트 템플릿을 생성합니다 매니페스트는 Apple에 애셋 팩에 대해 알려 주는 JSON 파일입니다 맞춤형 ID를 선택할 수 있습니다 이 ID는 앱 코드의 애셋 팩 다운로드 정책 애셋 팩이 지원하는 플랫폼들을 식별하는 데 사용됩니다

    먼저 파일 선택기를 채워 보겠습니다 파일 선택기는 소스 리포지토리에서 애셋 팩에 포함할 파일 집합을 선택합니다 파일 선택기의 두 가지 유형은 개별 파일 선택과 전체 디렉토리 선택입니다

    게임의 도입부 컷신 비디오의 파일 선택기 추가를 위해 소스 리포지토리 루트의 상대 경로를 사용합니다

    이 애셋 팩의 ID는 Tutorial입니다 게임의 튜토리얼 레벨에 필요한 애셋 파일이 있기 때문입니다 이제 다운로드 정책을 구성합니다 튜토리얼은 사용자가 가장 먼저 경험하는 부분이므로 게임을 처음 열기 전에 튜토리얼 애셋 팩이 로컬에 다운로드되도록 하겠습니다 따라서 이 경우에는 필수 다운로드 정책을 사용하는 것이 좋습니다

    이 튜토리얼 레벨은 게임을 처음 설치하는 사람에게만 해당됩니다 이미 게임을 플레이 중이고 새 버전으로 업데이트하는 사람은 튜토리얼을 다시 다운로드할 필요가 없습니다

    따라서 필수 다운로드 정책을 최초 설치로만 제한하고 후속 업데이트는 제외하도록 설정합니다 즉, 게임을 기기에 처음 다운로드하는 사용자만 튜토리얼 애셋을 받게 됩니다

    매니페스트가 작성됐으니 압축 아카이브를 생성하기 위해 패키징 도구를 다시 실행합니다 현재 디렉토리를 리포지토리의 루트로 설정하고 매니페스트 경로와 아카이브를 저장할 경로를 전달합니다 애셋 팩이 패키징됐으니 게임에서 사용하는 방법을 살펴보겠습니다

    백그라운드 애셋의 새로운 API를 사용하면 몇 줄의 코드만으로 애셋 팩 내의 파일을 읽을 수 있습니다 먼저 Xcode에 다운로더 확장 프로그램을 추가합니다 다운로더 확장 프로그램은 설치 과정 등의 이유로 기본 앱이 실행 중이 아닐 때 애셋 팩을 다운로드합니다

    새 대상을 추가하고 백그라운드 다운로드 템플릿을 선택합니다

    Apple 호스팅 사용 또는 자체 호스팅 사용을 선택합니다

    템플릿은 Swift 코드를 생성하지만 원하는 경우 Objective-C 코드로 쉽게 바꿀 수 있습니다

    올해 시스템에서 새롭게 제공하는 다운로더 확장 프로그램은 자동 다운로드, 백그라운드 업데이트 등의 각종 기능이 있으며 앱에 기능을 추가할 때 맞춤형 코드가 필요하지 않습니다 Xcode가 백그라운드 다운로드 템플릿으로 생성하는 스니펫은 시스템 구현을 기본 사용하도록 미리 구성되어 있습니다 추가 확장 코드를 작성할 필요가 없습니다

    실제로 다운로드 동작을 맞춤화할 필요가 없다면 짧은 shouldDownload(_:) 메서드를 완전히 제거해도 됩니다 다시 말해 이제 Xcode가 생성한 코드 몇 줄만으로 앱에 다운로더 확장 프로그램을 추가할 수 있습니다

    다운로드 동작을 맞춤화하려면 shouldDownload(_:)를 맞춤형으로 구현하면 됩니다 시스템은 애셋 팩의 다운로드 정책에 따라 백그라운드에서 다운로드할 계획인 모든 새 애셋 팩에 shouldDownload(_:) 구현을 호출하고 부울 값을 반환하여 다운로드 진행 여부를 결정합니다 이는 일부 애셋 팩에 특정 호환성 요구사항이 있는 경우 유용합니다 확장 프로그램을 구현했으니 이제 다운로드된 애셋 팩 내의 파일을 기본 앱에서 사용하는 방법을 살펴보겠습니다

    첫 번째 단계는 공유된 AssetPackManager에 ensureLocalAvailability(of:) 메서드를 호출하는 것입니다 이 메서드는 현재 애셋 팩이 다운로드되었는지 확인합니다 아닌 경우 다운로드를 시작하고 완료될 때까지 대기합니다 대부분의 경우 다운로더 확장 프로그램이 이미 애셋 팩을 다운로드했으니 메서드가 빠르게 반환됩니다 드물지만 애셋 팩을 새로 다운로드해야 하는 경우에는 앱 사용자에게 진행 상황을 안내하는 것이 좋습니다

    Swift에서는 statusUpdates(forAssetPackWithID:) 메서드가 반환하는 비동기 시퀀스의 상태 업데이트를 기다릴 수 있습니다

    Objective-C에서는 BAManagedAssetPackDownloadDelegate 프로토콜을 준수하는 객체를 생성하고 공유 애셋 팩 관리자의 delegate 속성에 연결할 수 있습니다

    다운로드를 취소하려면 다운로드 상태 업데이트에서 받은 진행 구조 중 하나에 cancel()을 호출하면 됩니다 ensureLocalAvailability(of:)가 오류 없이 반환되면 요청된 애셋 팩을 로컬에서 사용할 수 있습니다

    파일을 읽으려면 공유 애셋 팩 관리자의 contents(at:searchingInAssetPackWithID:options:) 메서드를 호출합니다 첫 번째 매개변수는 소스 리포지토리의 루트 즉 애셋 팩 생성을 위해 패키징 도구를 실행한 디렉토리에서 읽을 파일까지의 상대 경로입니다 시스템은 모든 애셋 팩을 공유 네임스페이스에 자동 병합하여 소스 리포지토리를 개발 시스템에서 그대로 가져온 것처럼 재구성합니다 따라서 런타임 시 특정 파일을 읽을 때 해당 파일이 어떤 애셋 팩에 포함되어 있는지 추적할 필요가 없습니다 기본적으로 contents(at:searchingInAssetPackWithID:options:)는 메모리 매핑된 데이터 인스턴스를 반환하며 메모리 공간을 많이 차지하는 큰 애셋 파일에도 적합합니다

    파일 디스크립터에 대한 로우 레벨 액세스 예를 들어 파일을 메모리에 단계적으로 읽어야 하는 경우 descriptor(for:searchingInAssetPackWithID:) 메서드를 대신 사용할 수 있습니다 이 경우 사용한 디스크립터를 사용자가 직접 닫아야 합니다 두 메서드의 assetPackID 매개변수에 nil이 아닌 인수를 제공하면 특정 애셋 팩으로 검색 범위를 제한할 수 있습니다 시스템은 앱이 다운로드한 애셋 팩을 추적하고 백그라운드에서 자동으로 최신 상태로 유지합니다 그러나 앱이 설치된 상태에서는 애셋 팩을 자동으로 삭제하지 않으므로 특정 애셋 팩을 더 이상 사용하지 않는다면 공유 애셋 팩 관리자에 remove(assetPackWithID:) 메서드를 호출해 저장 공간을 확보하는 것이 좋습니다 예를 들어 사용자가 튜토리얼 레벨을 완료하면 Tutorial 애셋 팩을 제거할 수 있습니다

    사용자가 게임 진행 상황을 초기화하고 튜토리얼을 다시 시작하는 경우 ensureLocalAvailability(of:) 호출로 애셋 팩을 다시 다운로드할 수 있습니다

    사용자가 기기의 설정 앱의 저장 공간 보기에서 앱과 관련해 다운로드된 애셋 팩의 저장 공간을 확인할 수 있다는 점을 유의하세요 다음 단계는 기본 앱과 다운로더 확장 프로그램을 같은 앱 그룹에 추가하는 것입니다 시스템은 앱 그룹을 통해 기본 앱과 확장 프로그램 간의 협업을 지원합니다

    메인 앱의 Info.plist에 BAAppGroupID 키 추가 후 앱 그룹 ID를 문자열 값으로 설정합니다

    부울 값이 true 또는 yes인 BAHasManagedAssetPacks 키를 추가합니다

    Apple 호스팅을 사용한다면 부울 값이 true 또는 yes인 BAUsesAppleHosting 키를 추가합니다 Apple 호스팅을 사용하지 않는다면 이 세션의 리소스 섹션에 있는 관련 문서에서 BAManifestURL을 포함한 다른 필수 Info.plist 키에 대해 자세히 알아보세요 앱과 확장 프로그램이 구성됐으니 이제 테스트를 진행할 수 있습니다

    TestFlight 또는 App Store에 앱 제출 전에 애셋 팩 다운로드를 테스트할 수 있는 macOS, Linux Windows용 백그라운드 애셋 모의 서버를 새로 만들었습니다 패키징 도구와 마찬가지로 모의 서버도 macOS의 Xcode와 함께 제공되며 Linux 및 Windows용은 Apple Developer 웹사이트의 다운로드 섹션에서 곧 제공할 예정입니다 백그라운드 애셋은 모든 다운로드에 HTTPS를 사용하므로 먼저 SSL 인증서를 발급해야 합니다 이를 위해 루트 인증 기관을 만들어야 합니다 그리고 해당 인증 기관을 테스트 기기에 설치합니다 그런 다음 인증 기관을 사용해 SSL 인증서를 발급하고 마지막으로 모의 서버를 실행하고 해당 SSL 인증서에 연결합니다 자세한 내용은 이 세션의 리소스 섹션에 있는 관련 문서를 참고하세요 SSL 인증서 발급 후 ba-serve를 실행하여 모의 서버를 시작하고 제공할 애셋 팩 아카이브의 경로를 전달하고 바인딩할 호스트를 설정합니다 호스트는 IP 주소, 호스트 이름 또는 도메인 이름일 수 있습니다 macOS에서는 도구에 키체인에서 인증서와 개인 키 쌍을 선택하라는 메시지가 표시됩니다 Linux 또는 Windows에서는 명령어 라인에 인증서와 개인 키를 전달해야 합니다 도움말 플래그를 전달하면 맞춤형 포트 번호 설정 등의 추가 옵션을 확인할 수 있습니다 macOS에서는 ID 프롬프트를 건너뛰는 기능이 추가될 예정입니다 iOS, iPadOS, visionOS 테스트 기기와 차후 tvOS 테스트 기기에서는 개발자 설정의 개발 오버라이드로 이동하여 모의 서버의 기본 URL과 호스트 및 포트를 입력합니다 macOS 테스트 기기에서는 xcrun ba-serve url-override를 실행해 동일한 정보를 입력합니다

    Xcode에서 앱을 빌드 및 실행하면 앱이 모의 서버에서 애셋 팩을 다운로드합니다 이제 Jenny가 베타 테스트와 애셋 팩 배포에 대해 설명하겠습니다 - Jenny? - 고마워요, Gabriel 새 앱 바이너리와 애셋 팩이 준비됐으니 TestFlight에서 베타 테스트를 준비하고 App Store에 배포하는 방법을 안내해 드리겠습니다

    Apple 호스팅을 사용할 경우 앱 바이너리와 애셋 팩을 App Store Connect에 각각 업로드하고 원한다면 TestFlight에서 테스트 가능하며 마침내 App Store에 배포됩니다

    애셋 팩을 예로 들어 이 과정을 자세히 살펴보겠습니다 애셋 팩을 업로드하는 방법은 여러 가지입니다

    드래그 앤 드롭 UI 경험을 원하면 macOS용 Transporter 앱을 쓰세요

    완전한 관리와 투명성을 원한다면 App Store Connect REST API로 자체 자동화 시스템을 구축하면 됩니다 간편한 명령줄 인터페이스는 크로스 플랫폼 iTMSTransporter가 유용한 명령어를 제공하며 App Store Connect API에 요청을 대신 전송해 줍니다 이러한 도구와 관련된 문서를 확인해 보세요 Transporter와 App Store Connect API 사용법을 설명겠습니다 Transporter 앱을 사용하는 경우 Tutorial.aar 아카이브를 앱의 윈도우에 끌어다 놓으면 됩니다

    원하는 앱에 추가하고 제공을 클릭합니다 이것이 튜토리얼 애셋 팩의 새 버전이 됩니다

    Transporter 앱에서 애셋 팩 업로드 상태를 확인할 수 있습니다

    업로드 과정 전체를 확인하려면 App Store Connect API를 사용하면 됩니다 따라야 하는 세 단계는 애셋 팩 레코드 생성과 애셋 팩 버전 레코드 생성 애셋 팩 버전에 아카이브 업로드입니다 먼저 애셋 팩 레코드를 생성하려면 backgroundAssets 리소스에 POST 요청을 전송합니다

    요청 본문에 애셋 팩 이름을 assetPackIdentifier로 입력하고 관계 섹션에 앱의 Apple 계정을 추가합니다 이 요청의 응답은 애셋 팩에 UUID를 반환하며 이를 나중에 API 요청에 사용할 수 있습니다

    다음으로 backgroundAssetVersions 리소스에 POST 요청을 보내 애셋 팩의 새 버전을 생성합니다

    관계 섹션에는 이전 API 응답에서 제공받은 애셋 팩의 ID를 사용합니다 이 작업을 하면 기존 버전 번호를 기반으로 버전 번호가 자동으로 올라갑니다 여기서는 버전 1이 생성됩니다 응답에서 튜토리얼 애셋 팩의 버전 1을 고유하게 식별하는 ID도 받습니다

    애셋 팩 버전이 성공적으로 생성되면 backgroundAssetUploadFiles 리소스를 사용해 Tutorial.aar 아카이브 파일의 업로드를 예약할 수 있습니다 이는 App Store 스크린샷 등의 다른 업로드 작업과 유사합니다

    애셋 유형, 파일 이름, 파일 크기 MD5 체크섬이 필요합니다

    백그라운드 애셋 버전 ID와의 관계도 포함해야 합니다 이 호출의 응답에는 업로드 파일 ID와 업로드 지침에 대한 세부 정보가 포함됩니다

    아카이브를 업로드한 후 업로드 파일 ID와 함께 backgroundAssetUploadFiles에 PATCH 호출을 수행하면 애셋 팩 처리가 시작됩니다

    애셋 팩의 진행 상황을 보려는 경우 App Store Connect 또는 App Store Connect API를 사용하면 사용 가능한 애셋 팩에 대한 자세한 정보를 확인할 수 있습니다

    App Store Connect에서는 TestFlight 탭에서 애셋 팩 처리 상태를 확인할 수 있습니다 업로드가 처리되면 내부 테스트 준비 완료 상태가 됩니다 즉 새로운 버전을 TestFlight에서 내부 테스트용으로 배포된 앱 빌드에 사용할 수 있습니다 새로운 애셋 팩 버전이 준비됐다는 이메일을 수신하게 됩니다 이 알림을 받기 위해 웹훅을 설정할 수도 있습니다

    WWDC25 세션인 ‘App Store Connect API로 개발 흐름 자동화하기’에서 올해 웹훅 기능에 대해 더 자세히 알아보실 수 있습니다

    하지만 처리 중 애셋 팩 아카이브 파일에서 문제가 발견되면 버전 상태가 실패로 변경되며 이것도 알림으로 전달됩니다 문제를 해결한 후 애셋 팩을 새 버전으로 다시 업로드할 수 있습니다 App Store Connect API를 사용하면 앱의 모든 애셋 팩 목록 각 애셋 팩의 버전 애셋 팩 상태를 확인할 수 있는 다양한 GET 요청 리소스가 제공됩니다 backgroundAssetVersions 리소스로 업로드 진행을 확인할 수 있습니다

    애셋 팩이 처리되면 내부 베타 릴리즈 리소스가 생성됩니다 표시되는 애셋 팩 버전은 READY_FOR_TESTING입니다

    앱 바이너리와 애셋 팩을 모두 업로드하면 TestFlight에서 베타 테스트를 시작할 수 있습니다

    App Store Connect에서 현재 튜토리얼 버전 1이 내부 테스트 준비 완료 상태입니다 더 많은 사용자를 대상으로 앱 빌드 및 애셋 팩 버전을 테스트하려면 외부 테스트용을 별도로 제출할 수 있습니다

    애셋 팩을 제출하려면 원하는 버전을 클릭하고 외부 테스트를 위해 제출을 선택합니다 버전이 승인되면 외부 테스트 준비됨으로 상태가 변경되고 알림이 전송됩니다

    App Store Connect API를 사용하면 betaBackgroundAssetReviewSubmissions 리소스를 사용해 애셋 팩 버전을 제출할 수 있습니다

    외부 베타 릴리즈 리소스를 통해 심사 상태를 확인할 수 있습니다 애셋 팩 버전의 외부 테스트 준비가 완료되면 표시해 줍니다

    테스트를 완료하고 App Store에 애셋 팩 버전을 배포할 준비가 되면 App Store 배포를 위해 앱 심사 팀에 제출할 수 있습니다

    App Store Connect의 배포 탭에서 애셋 팩을 확인할 수 있습니다 이제 단일 애셋 팩 버전만 제출하거나 다른 애셋 팩, 앱 버전 기타 심사 항목과 함께 제출할 수 있습니다 애셋 팩 버전과 앱 버전을 함께 제출하면 앱 심사 팀이 선택된 애셋 팩 버전을 사용해 앱을 심사합니다

    심사할 애셋 팩을 추가하려면 애셋 팩 선택을 클릭하고

    버전을 선택한 후 심사에 추가합니다

    제출이 승인되면 애셋 팩 버전이 배포 준비 상태로 표시됩니다

    App Store Connect API가 있으면 reviewSubmissions 리소스를 써서 심사할 앱을 제출할 수 있습니다

    심사 중에는 App Store 릴리즈 리소스에서 심사 상태를 확인할 수 있습니다 배포 준비 상태가 되면 앱 사용자가 App Store에서 새로운 애셋을 다운로드할 수 있게 됩니다 오늘 참 많은 주제를 다뤘네요 애셋 팩에 대해 살펴봤으며 애셋 팩을 만들고 앱에서 사용하고 Apple 호스팅을 위해 업로드 및 제출하는 방법도 설명했습니다 이번 세션이 새로운 관리형 백그라운드 애셋을 시작하는 데 도움이 되길 바랍니다

    이제 여러분의 차례입니다 패키징 도구를 사용해 첫 번째 애셋 팩을 만들어 보세요 앱이 아직 On-Demand Resources를 사용한다면 백그라운드 애셋으로의 마이그레이션을 고려해 보세요 문서를 확인하고 앱에 새로운 백그라운드 애셋 API를 적용하세요 마지막으로 피드백을 보내 주세요 잘 작동하는 부분과 그렇지 않은 부분을 피드백 지원으로 알려 주세요 올해 App Store Connect에 새롭게 추가된 사항을 모두 확인하려면 ‘App Store Connect의 새로운 기능’ 세션을 시청하세요 또한 WWDC23의 ‘백그라운드 에셋의 새 기능’ 세션에서 기존 백그라운드 애셋 기능에 대한 자세한 내용과 유용한 로컬 테스트 팁을 확인할 수 있습니다

    - 시청해 주셔서 감사합니다 - 피드백도 많이 보내 주세요

    • 8:26 - Fill out the manifest

      {
      	"assetPackID": "[Asset-Pack ID]",
      	"downloadPolicy": {
      		"essential": { // Possible keys: “essential”, “prefetch”, or “onDemand”
      			// Essential and prefetch download policies require a list of installation event types. For an on-demand download policy, the value for the “onDemand” key must be an empty object.
      			"installationEventTypes": [
      				// Remove undesired elements from this array.
      				"firstInstallation",
      				"subsequentUpdate"
      			]
      		}
      	},
      	"fileSelectors": [
      		// You can add as many file and/or directory selectors as you want.
      		{
      			"file": "[Path to File]"
      		},
      		{
      			"directory": "[Path to Directory]"
      		}
      	],
      	"platforms": [
      		// Remove undesired elements from this array.
      		"iOS",
      		"macOS",
      		"tvOS",
      		"visionOS"
      	]
      }
    • 10:44 - Add a downloader extension

      import BackgroundAssets
      import ExtensionFoundation
      import StoreKit
      
      @main
      struct DownloaderExtension: StoreDownloaderExtension {
      	
      	func shouldDownload(_ assetPack: AssetPack) -> Bool {
      		return true
      	}
      	
      }
    • 11:39 - Download an asset pack

      let assetPack = try await AssetPackManager.shared.assetPack(withID: "Tutorial")
      
      // Await status updates for progress information
      let statusUpdates = AssetPackManager.shared.statusUpdates(forAssetPackWithID: "Tutorial")
      Task {
      	for await statusUpdate in statusUpdates {
      		// …
        }
      }
      
      // Download the asset pack
      try await AssetPackManager.shared.ensureLocalAvailability(of: assetPack)
    • 12:22 - Receive download status updates in Objective-C

      #import <BackgroundAssets/BackgroundAssets.h>
      
      @interface ManagedAssetPackDownloadDelegate : NSObject <BAManagedAssetPackDownloadDelegate>
      
      @end
      
      @implementation ManagedAssetPackDownloadDelegate
      
      - (void)downloadOfAssetPackBegan:(BAAssetPack *)assetPack { /* … */ }
      
      - (void)downloadOfAssetPackPaused:(BAAssetPack *)assetPack { /* … */ }
      
      - (void)downloadOfAssetPackFinished:(BAAssetPack *)assetPack { /* … */ }
      
      - (void)downloadOfAssetPack:(BAAssetPack *)assetPack hasProgress:(NSProgress *)progress { /* … */ }
      
      - (void)downloadOfAssetPack:(BAAssetPack *)assetPack failedWithError:(NSError *)error { /* … */ }
      
      @end
    • 12:29 - Attach the delegate in Objective-C

      static void attachDelegate(ManagedAssetPackDownloadDelegate *delegate) {
      	[[BAAssetPackManager sharedManager] setDelegate:delegate];
      }
    • 12:33 - Cancel an asset-pack download

      let statusUpdates = AssetPackManager.shared.statusUpdates(forAssetPackWithID: "Tutorial")
      for await statusUpdate in statusUpdates {
      	if case .downloading(_, let progress) = statusUpdate {
      		progress.cancel()
      	}
      }
    • 12:41 - Use an asset pack

      // Read a file into memory
      let videoData = try AssetPackManager.shared.contents(at: "Videos/Introduction.m4v")
      
      // Open a file descriptor
      let videoDescriptor = try AssetPackManager.shared.descriptor(for: "Videos/Introduction.m4v")
      defer {
      	do {
      		try videoDescriptor.close()
      	} catch {
      		// …
      	}
      }
    • 13:56 - Remove an asset pack

      // Remove the asset pack
      try await AssetPackManager.shared.remove(assetPackWithID: "Tutorial")
      
      // Redownload the asset pack
      let assetPack = try await AssetPackManager.shared.assetPack(withID: "Tutorial")
      try await AssetPackManager.shared.ensureLocalAvailability(of: assetPack)
    • 14:53 - Info.plist

      <key>BAAppGroupID</key>
      <string>group.com.naturelab.thecoast</string>
      <key>BAHasManagedAssetPacks</key>
      <true/>
      <key>BAUsesAppleHosting</key>
      <true/>
    • 0:00 - 서론
    • App Store에서 앱 애셋을 배포하는 새로운 방법인 Background Assets에 대해 알아보세요. 현재 애셋 전송 기술을 검토하고, 새로운 Swift 및 Objective-C API를 확인하며, iOS, iPadOS, macOS, tvOS, visionOS 전반에서 이러한 기능을 통합하는 방법을 알아보세요. 베타 테스트 및 App Store 배포에 대한 준비를 포함하여 Apple에서 호스팅하는 애셋에 대해서도 논의합니다.

    • 1:01 - 백그라운드 애셋의 새 기능
    • Background Assets를 사용하면 기본 앱과 별도로 앱 애셋을 다운로드 및 업데이트할 수 있도록 지원하여 앱 실행 경험을 강화할 수 있습니다. 이러한 접근 방식을 사용하면 사람들이 배경에서 추가 콘텐츠를 다운로드한 상태에서 앱 사용을 즉시 시작할 수 있습니다. 애셋 팩에 대한 세 가지 주요 다운로드 정책은 필수, 프리페치, 온디맨드입니다. 자체 서버에서 애셋 팩을 호스팅하거나 Apple Developer Program 멤버십에서 200GB를 제공하는 새로운 Apple Hosted Background Assets 서비스를 활용할 수 있습니다. Managed Background Assets가 지원 중단된 On-Demand Resources 기술을 대체합니다. 더 뛰어난 제어 능력과 유연성을 제공하기 때문에 앱 성능 및 사용자 참여를 최적화할 수 있습니다. 시스템이 다운로드, 업데이트, 압축을 자동으로 관리하기 때문에 쉽게 구현할 수 있습니다.

    • 7:32 - 샘플 앱 개발
    • 앱에서 Managed Background Assets를 사용하려면 macOS, Linux, Windows에서 사용할 수 있는 새로운 패키지 툴을 사용하여 애셋 팩을 생성해야 합니다. 이 툴은 애셋 팩의 ID, 다운로드 정책, 지원되는 플랫폼, 파일 선택기를 사용하여 포함할 파일을 지정할 수 있는 JSON 매니페스트 파일을 생성합니다. 앱을 시작하기 전에 로컬에서 필수 자료를 사용할 수 있도록 다운로드 정책을 구성하고 다운로드를 첫 번째 설치로 제한할 수 있습니다. 매니페스트가 작성되면 패키징 툴이 압축된 아카이브를 생성합니다. 애셋 팩을 앱에 통합하기 위해 Xcode에 다운로더 확장 프로그램을 추가하면 애셋 팩이 백그라운드에서 다운로드되도록 예약합니다. 시스템은 자동 다운로드 및 업데이트를 지원하는 모든 기능을 갖춘 다운로더 확장 프로그램을 제공합니다. ‘AssetPackManager’를 사용하여 기본 앱에서 다운로드된 파일에 액세스하면 로컬 가용성을 보장하고 필요한 경우 상태 업데이트를 대기함으로써 최적화된 애셋 관리와 함께 원활한 사용자 경험을 제공할 수 있습니다. Background Assets 프레임워크를 사용하려면 대리인 프로토콜이 애셋 팩 관리자의 대리인 속성에 첨부되어야 합니다. 다운로드 상태 업데이트는 필요한 경우 다운로드를 취소하는 데 사용할 수 있는 진행 구조를 제공합니다. 애셋 팩이 로컬에서 사용할 준비가 되면 오류 없이 반환되는 ‘ensureLocalAvailability(of:)’로 표시되며, ‘contents(at:searchingInAssetPackWithID:options:)’ 또는 ‘descriptor(for:searchingInAssetPackWithID:)’ 메서드를 사용하여 파일을 읽을 수 있습니다. 시스템은 애셋 팩 업데이트 및 스토리지를 자동으로 관리하지만, 사용하지 않는 애셋 팩을 수동으로 제거하여 공간을 확보하는 것이 좋습니다. 주요 앱과 다운로더 확장 프로그램 간 조정을 활성화하려면 이 둘을 동일한 앱 그룹에 추가하고 특정 Info.plist 키를 구성해야 합니다. 테스트를 위해 SSL 인증서가 필요한 모의 서버가 제공됩니다. 테스트 기기의 개발 오버라이드에 모의 서버의 기본 URL을 입력해야 합니다. 일단 구성되고 나면 앱이 테스트를 진행하는 동안 모의 서버에서 애셋 팩을 다운로드합니다.

    • 17:24 - 베타 테스트 및 배포
    • 앱이 App Store의 TestFlight 및 배포에 대한 베타 테스트를 진행하도록 준비시키려면 앱 바이너리 및 애셋 팩을 App Store Connect에 업로드해야 합니다. 드래그 앤 드롭 인터페이스를 제공하는 macOS용 Transporter 앱을 포함하여 다양한 메서드를 사용하는 애셋 팩을 업로드하거나 완전한 제어 및 자동화를 위해 App Store Connect REST API를 업로드하세요. API 사용에는 애셋 팩 기록 생성, 버전 기록 생성, 아카이브 업로드 등 세 가지 주요 단계가 포함됩니다. 애셋 팩이 처리된 후에는 TestFlight에서 내부 또는 외부 테스트를 위해 제출할 수 있습니다. 테스트를 성공적으로 진행한 후, App Store에 배포용 App Review에 애셋 팩 버전을 제출할 수 있습니다. App Store Connect 또는 API를 통해 업로드, 제출, 검토의 진행 상황 및 상태를 모니터링합니다.

Developer Footer

  • 비디오
  • WWDC25
  • Apple-Hosted Background Assets 알아보기
  • 메뉴 열기 메뉴 닫기
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    메뉴 열기 메뉴 닫기
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    메뉴 열기 메뉴 닫기
    • 손쉬운 사용
    • 액세서리
    • 앱 확장 프로그램
    • App Store
    • 오디오 및 비디오(영문)
    • 증강 현실
    • 디자인
    • 배포
    • 교육
    • 서체(영문)
    • 게임
    • 건강 및 피트니스
    • 앱 내 구입
    • 현지화
    • 지도 및 위치
    • 머신 러닝 및 AI
    • 오픈 소스(영문)
    • 보안
    • Safari 및 웹(영문)
    메뉴 열기 메뉴 닫기
    • 문서(영문)
    • 튜토리얼
    • 다운로드(영문)
    • 포럼(영문)
    • 비디오
    메뉴 열기 메뉴 닫기
    • 지원 문서
    • 문의하기
    • 버그 보고
    • 시스템 상태(영문)
    메뉴 열기 메뉴 닫기
    • Apple Developer
    • App Store Connect
    • 인증서, 식별자 및 프로파일(영문)
    • 피드백 지원
    메뉴 열기 메뉴 닫기
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(영문)
    • News Partner Program(영문)
    • Video Partner Program(영문)
    • Security Bounty Program(영문)
    • Security Research Device Program(영문)
    메뉴 열기 메뉴 닫기
    • Apple과의 만남
    • Apple Developer Center
    • App Store 어워드(영문)
    • Apple 디자인 어워드
    • Apple Developer Academy(영문)
    • WWDC
    Apple Developer 앱 받기
    Copyright © 2025 Apple Inc. 모든 권리 보유.
    약관 개인정보 처리방침 계약 및 지침