apple/iOS, UIKit, Documentation

AssetInventory 정리 + AssetInstallationRequest

lgvv 2025. 11. 22. 20:03

AssetInventory 정리 + AssetInstallationRequest

 

AssetInvenotry에 대해서 정리하고 관련된 메서드들 하나씩 정리

 

 

목차

  • AssetInventory
    • Overview
    • Install Assets
    • Manage Assets
  • Downloading and installing assets
    • assetInstallationRequest(supporting:)
  • Checking asset status
    • AssetInventory.Status
      • downloading
      • installed
      • supported
      • unsupported
  • Type Properties
    • AssetInventory.maximumReservedLocales
    • AssetInventory.reservedLocales
  • Type Methods
    • AssetInventory.release(reservedLocale: Locale) async -> Bool
    • AssetInventory.reserve(locale:)
  • AssetInstallationRequest
    • Overview
    • AssetInstallationRequest의 downloadAndInstall()

 

 

iOS 26.0+
iPadOS 26.0+
Mac Catalyst 26.0+
macOS 26.0+
visionOS 26.0+

 

transcription(받아쓰기) 또는 여러 기타 분석에  필요한 Asset 들을 관리함.

 

 

 

 

class로 구현되어 있음.

 

 

Overview

 

SpeechAnalyzer 클래스를 사용하기 전에, 사용할 모듈에 필요한 에셋을 설치.

이 에셋들은 Apple 서버에서 다운로드되며 시스템이 관리하는 ML 모델.

 

한 번 에셋을 다운로드 혹은 설치하거나 사용하면 시스템은 이를 자동으로 보관하고 업데이트하여 다른 앱과도 공유.

또한 시스템은 저장 공간과 네트워크 사용량을 제한하기 위해, 앱이 사용할 수 있는 Locale 기반 asset reservations 수를 제한적으로 제공.

 

앱은 에셋을 직접 다루지 않음. 대신 앱은 모듈 객체를 구성하고, 시스템은 그 구성 내용을 바탕으로 어떤 에셋이 필요한지 판단.

 


asset reservations이란?

  • Speech 프레임워크가 사용하는 모델(음성 인식 및 언어 모델 등)은 기기에 다운로드되어 저장.
  • 모든 앱이 무제한으로 모델을 설치하도록 허용할 시 기기 저장 공간이 과도하게 사용되고, 네트워크 트래픽이 많아질 수 있기에 iOS 앱 별로 설치 가능한 모델 개수에 제한.
  • 즉, 하나의 앱이 동시에 보유할 수 있는 언어 모델의 수를 제한.

 

 

AssetInventory를 통해 설치 가능 여부를 확인하고, 필요 없는 언어 모델은 사용 중지하여 공간을 확보.

 

 

 

Install assets (에셋 설치하기)

 

에셋을 설치하는 과정은 다음과 같은 4단계로 이루어짐.

  1. 사용하려는 구성(configuration)으로 analyze 모듈 생성. 
    1. 시스템은 객체 자체가 아니라, 모듈의 구성 정보를 기반으로 필요한 에셋을 설치.
    2. 모듈 객체 자체는 이후에 폐기(discard)해도 괜찮음.
  2. 앱의 에셋 예약(asset reservations)을 해당 로케일(locale)에 할당
    1. Locale 기반 에셋이 필요한 모듈(즉, LocaleDependentSpeechModule 프로토콜을 준수하는 모듈)에만 필요.
    2. 그 외 모듈은 이 단계를 건너뛰어도 상관 없음.
    3. 클래스가 필요 시 자동으로 수행하지만, 직접 reserve(locale:)를 호출해 수동으로 처리할 수도 있음.
  3. 모듈 구성에서 필요한 에셋 다운로드를 시작.
    1. 그 객체의 downloadAndInstall() 메서드를 호출하여 다운로드 및 설치 시작
    2. assetInstallationRequest(supporting:)를 호출해 AssetInstallationRequest 인스턴스를 얻은 뒤, 다운로드가 완료될 때까지 기다림.
  4. 이미 시스템에 사전 설치되었거나, 다른 앱이 설치했거나, 이전에 동일한 모듈 구성을 사용했다면 다운로드가 즉시 완료될 수 있음.

 

(정리)

 

에셋이 한 번 다운로드되면, 앱을 재시작해도 유지되며 다른 앱과도 공유

시스템은 오랫동안 사용되지 않은 에셋에 대해 앱의 구독 상태를 해제할 수 있음.

 

 

 

Manage assets (에셋 관리하기)

 

앱에서 특정 Locale에 대한 에셋이 더 이상 필요하지 않은 경우, release(reservedLocale:)를 호출하여 해당 예약(reservation)을 해제할 수 있음.

시스템은 이후 필요에 따라 해당 에셋을 삭제.

 

 

 

Downloading and installing assets

 

 

assetInstallationRequest(supporting:)

  • 에셋 다운로드를 시작하고 진행 상태를 모니터링하는 데 사용되는 설치 요청 객체를 반환
  • 현재 상태가 .installed일 경우 더 이상 수행할 작업이 없다는 것을 의미하므로, nil을 반환

 

 

일부 에셋이 예약되지 않은 Locale을 필요로 한 경우 필요한 Locale을 자동으로 예약

단, 자동으로 예약하는 작업으로 인해 maximumReservedLocales을 초과하는 경우 throw로 에러를 던짐

 

 

위 상황에 대한 플로우 정리

  • 이미 예약된 Locale: ["en-US"]
  • 새로 필요한 Locale: ["en-US", "ko-KR"]
  • 이 경우에는 "ko-KR"이 아직 준비되지 않았아서, inventory에 asset을 준비하는 코드를 명시적으로 작성하지 않아도 installation 시점에 알아서 reserve 해줌.

 

호출 메서드

public static func assetInstallationRequest(
    supporting modules: [any SpeechModule]
) async throws -> AssetInstallationRequest?

 

 

 

 

AssetInventory.Status

 

AssetInventory.Status는 우선순위가 존재하여, unsuppoted(1), suppoted(2), downloading(3), installed(4) 순서

숫자가 높을수록 우선순위 높음.

 

  • case downloading
    • 시스템이 현재 에셋을 다운로드 중이거나 네트워크 혹은 배터리 등의 조건이 좋아지면 다운로드를 다시 시도할 예정
    • 다운로드 진행상황은 progress를 통해 확인할 수 있음.
  • case installed
    • 필요한 에셋이 이미 기기에 설치되어 있고 모듈을 바로 사용할 수 있는 상태
  • case supported
    • 현재 구성(configuration)으로 모듈을 실행할 수는 있으나 필요한 에셋은 아직 다운로드해야 함.
    • 해당 기기에서 지원 가능해서 설치해서 쓰면 됨.
  • case unsupported
    • 이 설정(configuration)에서는 모듈을 전혀 사용할 수 없음.
    • preset, configuration, locale 등 iOS 26 이상의 기기여도 해당 특정 조건을 만족하지 않는 경우에도 해담.

 

 

AssetInventory.status(forModules:)

 

모듈 목록에 대해서 상태를 반환.

 

해당 메서드는 배열로 modules를 받는데, 모듈들은 각각의 preset을 달리 가질 수 있어서 상태로 다를 수 있음. 

public static func status(
    forModules modules: [any SpeechModule]
) async -> AssetInventory.Status

 

 

만약 목록에서 상태로 서로 다를 경우 우선순위가 가장 낮은 상태를 반환

 

 

 

AssetInventory.maximumReservedLocales

 

앱이 사용할 수 있는 Locale 개수로 해당 값은 reservedLocales가 가질 수 있는 최대 개수로, 기기의 저장공간 등에 따라 기기마다 다를 수 있음.

 

 

AssetInventory.reservedLocales

 

앱이 현재 보유하고 있는 asset locale 목록

 

모듈이 필요로 하는 에셋을 구독하기 전에, 먼저 해당 에셋의 로케일을 예약해야 하는데,

참고로 이 메서드가 반환하는 로케일은 reserve(locale:) 메서드에 전달한 로케일의 변형(variant)일 수 있음.

 

 

variant란?

  • reserve(locale: )에 en_US를 요청해도 시스템 내부에서 가장 적합한 Locale이 en_GB라고 판단하며, 실제 reserve 목록에서는 en_GB가 반환될 수 있다는 의미
  • 즉, 내가 요청한 Locale과 시스템이 실제로 사용하는 Locale이 정확히 같지 않아도, 같은 언어 계열이면 variant(가장 가까운 대체 Locale)로 선택해서 반환한다는 의미.

 

 

 

AssetInventory.release(reservedLocale: Locale) async -> Bool

 

Asset Locale의 reservation을 해제

 

만약 Locale이 reserved되어 있지 않다면 false를 반환

 

AssetInventory.reserve(locale:)

 

이미 해당 Locale이 reserved 되었다면 false를 반환

 

입력한 Locale을 지원하는 에셋이 존재한다면 해당 에셋의 Locale을 reservedLocales 목록에 추가.

 


Throws (에러를 던지는 상황)

  • 예약된 Locale 수가 maximumReservedLocales를 초과하게 되는 경우
  • 해당 Locale을 지우너하는 Asset이 존재하지 않는 경우

 

 

AssetInstallationRequest

 

 

iOS 26.0+
iPadOS 26.0+
Mac Catalyst 26.0+
macOS 26.0+
visionOS 26.0+

 

에셋 선택을 설명하고, 다운로드하며 설치하는 객체

 

objc 유의

 

 

 

AssetInstallationRequest의 구현부

 

progress라는 프로퍼티를 가지고 있어서 진행 상황에 대해서 추적이 가능.

 

 

Overview

 

AssetInsllationRequest 타입의 인스턴스를 직접 생성하지 않고
AssetInventory.assetInstallationRequest(supporting:) 메서드를 통해 AssetInsllationRequest 객체를 얻음

 

시스템은 다운로드 및 설치 요청을 통합 관리하므로 여러 개의 인스턴스를 얻어 downloadAndInstall()을 여러번 호출해도 중복 다운로드가 발생하지 않음.

 

 

 

 

AssetInstallationRequest의 downloadAndInstall()

 

디바이스에 없는 에셋을 다운로드하고 설치

 

 

네트워크 문제나 기타 오류 등으로 인해 시스템이 즉시 에셋을 다운로드 할 수 없는 경우, 나중에 자동으로 다운로드를 시도

해당 메서드는 초기 다운로드 및 설치 시도가 성공하거나 실패한 시점에 반환

 

즉, 이후에 진행 상황이나 성공 여부 등은 status(forModules: ) 또는 다른 설치 요청 객체를 사용하여 모니터링.

시스템은 다운로드 및 설치 요청을 통합 관리하므로 중복 호출해도 중복 다운로드가 발생하지 않음.

 

 

func execute() async throws {
    let transcriber = SpeechTranscriber(locale: .current, preset: .progressiveTranscription)
    let requset = try await AssetInventory.assetInstallationRequest(supporting: [transcriber])
    try await requset?.downloadAndInstall()
}

 

 

 

 

(참고)

https://developer.apple.com/documentation/speech/assetinventory

 

'apple > iOS, UIKit, Documentation' 카테고리의 다른 글

swift rethrows  (0) 2025.12.03
SpeechAnalyzer  (0) 2025.11.22
SpeechTranscriber 정리 + DictationTranscriber  (0) 2025.11.22
sending parameter and result values  (0) 2025.10.07
Region based Isolation  (0) 2025.10.06