스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
StoreKit 및 앱 내 구입의 새로운 기능
App Store의 앱 내 구입 시스템을 사용하여 향상된 구입 경험을 만들고 제공하는 방법을 알아보세요. 구독 맞춤 설정 향상을 위한 새로운 StoreKit 뷰 제어기 스타일과 API를 살펴보고, 거래별 정보의 새로운 필드를 소개하고, Xcode의 새로운 테스트 기능을 알아봅니다. StoreKit의 중요한 지원 중단 사항에 대해서도 자세히 알아보세요.
챕터
- 0:00 - Introduction
- 0:36 - Core API enhancements
- 3:12 - Merchandise using SwiftUI
- 15:35 - Test in Xcode
- 21:06 - Update to StoreKit 2
리소스
- Forum: App Store Distribution & Marketing
- In-App Purchase
- Introducing StoreKit 2
- Message
- Original API for In-App Purchase
- Product.SubscriptionInfo.RenewalInfo
- Setting up StoreKit Testing in Xcode
- StoreKit views
- Testing in-app purchases with StoreKit transaction manager in Xcode
- Transaction properties
관련 비디오
WWDC24
WWDC23
WWDC22
WWDC21
WWDC20
-
다운로드
안녕하세요 저는 Rudy입니다 ‘StoreKit 및 앱 내 구입의 새로운 기능’ 세션입니다 이 세션에서는 StoreKit 구성으로 테스트할 수 있는 StoreKit의 새로운 기능 및 Xcode의 테스트 환경 개선 사항을 공유하겠습니다 먼저, 새로운 핵심 프레임워크 기능을 검토해 보겠습니다 머천다이징 UI를 구축할 수 있는 새로운 방법도 공유하고 Xcode에서 앱의 동작을 테스트하는 방법도 다룹니다
StoreKit 2를 사용하도록 앱을 업데이트하면 어떤 이점이 있는지 보겠습니다 먼저, 고객의 거래 내역과 관련된 업데이트를 살펴보겠습니다 지금까지 거래 내역 API에는 자동 갱신 구독, 비갱신형 구독 비소모성 항목 미완료 소모성 항목 거래가 포함되었습니다 앱 사용자가 소모성 항목을 구입하는 경우 해당 거래가 완료되면 이러한 API를 통해 접근할 수 없었습니다 iOS 18부터 거래 내역 API에 완료된 소모성 항목 거래가 포함됩니다
이제 완료된 소모성 항목을 수동으로 추적하는 대신 프레임워크에서 모든 소모성 항목 거래를 확인할 수 있습니다 완료 상태와 관계없이 말이죠 이 기능은 프로젝트의 info.plist 파일로 구성할 수 있는 새로운 선택 기능입니다
완료된 소모성 항목 거래를 받으려면 새로운 키 SKIncludeConsumableInAppPurchaseHistory의 값을 true로 설정합니다 그런 다음 평소처럼 거래를 수신합니다
완료된 소모성 항목은 App Store Server API에도 표시됩니다 또한 앱 내 구입 거래 수준 정보를 추가로 제공하기 위해 거래 및 갱신 정보 데이터 모델에 새로운 필드를 추가했습니다 거래 유형의 첫 번째 신규 필드는 currency로 의미 그대로 구매 시 사용된 통화를 보여 줍니다
이 필드는 App Store Connect에서 구성한 가격이 포함된, 새로운 price 구성원과 함께 표시됩니다
갱신 정보 모델의 경우 거래 모델에 추가된 필드를 미러링하는 2개의 신규 필드를 추가했습니다 첫 번째 신규 필드는 currency입니다 두 번째 신규 필드는 renewalPrice입니다 renewalPrice는 구독 갱신 시 고객에게 청구되는 금액을 나타냅니다 renewalPrice는 새로운 currency 구성원이 제공하는 컨텍스트를 참고하여 해석해야 합니다 Xcode 16으로 앱을 빌드할 때 이러한 신규 거래 및 갱신 정보 API에 접근할 수 있습니다 앱이 iOS 15 이전 버전에서 실행되는 경우에도 사용할 수 있습니다 앱이 이전 OS 버전을 지원하는 경우 이러한 필드에 접근하는 방법에 관한 지침은 ‘앱 내 구입’ 문서를 참고하세요 올해 핵심 API의 마지막 업데이트는 새로운 ‘윈백 특가’ 구독 특가입니다 윈백 특가는 이탈한 구독자의 재참여를 유도하기 위한 유형입니다 이 새로운 특가를 앱에 통합하면 App Store Connect에서 자격 규칙을 맞춤화할 수 있는 강력한 새 도구를 사용하여 추가 코드 없이 StoreKit Message API로 특가를 판매할 수 있어 매우 간편합니다
App Store에서 윈백 특가를 홍보할 수도 있습니다 예를 들어 Apple 에디터 팀이 투데이, 게임, 앱 탭에서 고객을 위한 맞춤 추천을 만들 때 윈백 특가를 소개할 수 있습니다 윈백 특가에 대해 더 알아보려면 WWDC24 세션 ‘App Store 특가 구현하기’를 확인하세요 이제 앱 내 구입을 판매하는 새로운 방법을 살펴보겠습니다 작년 WWDC23에서 StoreKit 뷰를 소개한 이후 많은 개발자들이 멋진 앱 내 구입 UI를 선보였습니다 개발자들의 피드백을 바탕으로 구독 스토어 뷰를 맞춤화하는 새롭고 멋진 방법을 설계했습니다 그리고 이 멋진 새 기능을 소개하는 가장 좋은 방법은 가장 좋아하는 스트리밍 앱의 구독 업셀을 구축하는 것입니다 바로 Destination Video죠 머천다이징 UI를 빠르게 반복하기 위해 Xcode 미리보기를 사용할 것이기 때문에 제품 메타데이터로 StoreKit 구성 파일을 미리 설정했습니다 In-App Purchase UI가 Xcode 미리보기와 작동하려면 필요한 단계입니다 Xcode에서 StoreKit 구성 파일을 설정하는 방법에 대한 자세한 설명은 WWDC22의 ‘StoreKit 테스트의 새로운 기능’과 WWDC20의 ‘Xcode의 StoreKit 테스트 소개’를 확인하세요 Destination Video에 대해 현재 빌드 중인 구독은 구독 시 고객에게 두 가지 선택을 제공합니다
프리미엄 요금제 또는 베이직 요금제를 할인된 가격으로 이용할 수 있습니다
그리고 구독을 매월 또는 매년 갱신할지 여부를 선택할 수 있습니다 Xcode에서 이러한 요금제를 상품화하는 구독 스토어를 만드는 방법을 보여드리겠습니다 전 이미 DestinationVideoShop이라는 보기를 생성했는데 구독 스토어를 만드는 데 사용할 겁니다 첫 번째 단계는 SubscriptionStoreView를 선언하고 구독에 대한 그룹 ID를 제공하는 것입니다
이 코드 한 줄만 사용해서 효과적으로 출발할 수 있습니다 하지만 고객에게 다양한 서비스 수준을 확실히 보여 주도록 스토어를 구성하고 싶습니다 이를 위해 각 프리미엄 및 기본 서비스 수준에 대한 구독 옵션 그룹을 선언할 수 있습니다 시작하기 위해 구독 스토어에 구독 옵션 그룹을 추가하겠습니다
어떤 제품이 포함되는지 나타내는 조건을 사용하여 구독 옵션 그룹을 정의합니다 이 첫 번째 그룹이 두 가지 프리미엄 옵션을 모두 나타내길 원했으므로 서비스 수준이 프리미엄인 모든 제품을 포함하도록 조건을 선언했습니다
구독 스토어를 더 쉽게 작업할 수 있도록 앞서 StreamingPassLevel이라는 enum을 생성했는데 프리미엄 및 기본 서비스 수준을 모델링하는 데 사용합니다 그룹을 선언한 조건과 일치하는 프리미엄 요금제만 표시되도록 스토어가 업데이트된 것을 확인할 수 있습니다
그룹에 레이블을 추가할 수도 있습니다 이 경우에는 프리미엄을 사용하겠습니다
두 번째 그룹을 선언하면 상황이 흥미로워지므로 기본 옵션을 나타내는 그룹을 추가하겠습니다
이제 두 그룹을 선언했으니 구독 스토어 보기에서 탭 보기가 자동으로 생성되어 기본 또는 프리미엄 요금제를 볼 수 있습니다
이 새로운 레이아웃은 구독 선택 사항을 훨씬 더 쉽게 이해할 수 있게 해 줍니다
SubscriptionStoreView의 중요한 기능 중 하나는 맞춤화된 마케팅 콘텐츠로서 SwiftUI 보기를 제공할 수 있다는 것입니다 일반적으로 이 보기를 SubscriptionStoreView에 직접 제공하는데 저는 계층적 구조를 선언했기 때문에 마케팅 콘텐츠를 그룹에 직접 제공합니다
서비스의 가치를 설명하는 미리보기 업데이트를 확인해 보세요
구독 옵션 그룹을 사용하는 것이 좋습니다 활성 그룹에 따라 서로 다른 마케팅 콘텐츠 보기를 제공할 수 있기 때문이죠 이를 보여 드리기 위해 기본 요금제의 가치를 설명하는 수정된 보기를 추가하겠습니다
이제 활성 탭을 변경하면 마케팅 콘텐츠에 기본 요금제에 대한 설명이 표시됩니다
개별 옵션 그룹을 선언하는 것은 풍부한 표현력을 갖습니다 선언이 UI 모습과 매우 유사하게 보이기 때문입니다 이러한 경우 일련의 구독 옵션 그룹을 선언하여 구현을 간소화할 수 있습니다
이제 조건 대신 각 제품에 해당하는 StreamingPassLevel 값을 제공하기만 하면 됩니다
그룹 세트는 이 첫 번째 클로저에서 반환하는 각 고유 값에 대한 그룹을 나타냅니다 그리고 여기, 프리미엄 그룹과 기본 그룹을 각각 한 개씩 반환했습니다
또한 마케팅 콘텐츠 보기에 Streaming Pass 수준을 제공하기만 하면 되므로 마케팅 콘텐츠를 더 쉽게 선언할 수 있습니다
Streaming Pass+는 고객에게 많은 가치를 제공하므로 마케팅 콘텐츠에 이를 반영하고 싶습니다
이제 제 마케팅 콘텐츠는 유익한 정보를 제공합니다
하지만 화면 공간에서 매우 큰 부분을 사용합니다 스토어의 높이를 줄이기 위해 subscriptionStoreControlStyle 한정자를 사용할 수 있고 작은 크기의 새 선택기 스타일도 사용할 수 있습니다
이제 구독 옵션 선택기가 이전보다 훨씬 더 적은 공간을 차지합니다 다른 요금제 옵션을 더욱 쉽게 찾을 수 있도록 하단 막대에 제어기를 배치했습니다 기본적으로 하단 막대에는 구독 버튼만 포함되어 있습니다 제어기 스타일이 매우 간결하므로 제어기 스타일 한정자의 배치 매개변수로 bottomBar를 제공할 수 있습니다
이제 마케팅 콘텐츠에서 서비스 혜택을 스크롤할 때에도 구독 옵션이 하단 막대에 항상 표시됩니다
이렇게 하면 강력한 새 구독 옵션 그룹 API와 편리한 API 구독 옵션 그룹 세트를 사용할 수 있습니다 또한 작은 크기의 새 선택기 제어기 스타일과 제어기 배치 API도 살펴보았습니다 하지만 올해 StoreKit 보기에 추가되는 것은 이뿐만이 아닙니다 여러 업데이트된 내용을 공유해 드리겠습니다 이제 시작해 보죠 방금 구독 옵션 그룹을 사용하여 스토어 콘텐츠의 구조를 선언하는 방법을 보여 드렸습니다 앞서 빌드한 스토어에서는 탭 스타일을 사용하여 구독 옵션 그룹을 도출했는데 이는 다양한 서비스 수준처럼 구독 요금제 옵션 간에 명확한 구분이 필요한 경우에 유용합니다
탭은 구독 옵션 그룹을 표시하는 데 사용할 수 있는 스타일 중 하나입니다 여러분이 선택하는 그룹 스타일은 StoreKit가 그룹을 표시하는 방식을 정의하고 여러분은 SubscriptionStoreView에서 subscriptionOptionGroupStyle 한정자를 사용하여 설정합니다 이것이 선택할 수 있는 유일한 스타일은 아닙니다 링크 스타일을 사용할 수도 있습니다 링크는 탐색 컨테이너 내에서 고객에게 더 많은 요금제 옵션을 표시하려는 경우에 유용합니다 만약 없는 경우 탐색 링크를 탭할 때마다 다른 요금제 옵션이 있는 시트가 스토어 위에 표시됩니다 구독 옵션 그룹은 구독 옵션을 여러분이 정의한 계층 구조로 구성하는 기본 요소입니다 그룹 내에 그룹을 만들거나 인라인 그룹까지 만들 수 있게 하는 간단하지만 강력한 API입니다
또한 하나의 선언으로 여러 그룹을 만들 수 있도록 하는 그룹 세트 API도 만들었습니다 구독 기간별로 그룹화하는 것 같은 가장 일반적인 사용 사례를 위해 SubscriptionPeriodGroupSet와 같은 편리한 API를 만들었습니다
앞서 Destination Video 스토어를 빌드할 때 배치 API를 사용하는 방법을 보여 드렸습니다
이것은 구독 스토어에서 구독 제어기를 배치할 위치를 선택할 수 있는 새로운 API입니다
모든 제어기 스타일에 모든 배치를 사용할 수 있는 것은 아닙니다 일부 제어기 스타일에는 특정 배치에만 호환되는 레이아웃이 있기 때문입니다
이 API를 더 쉽게 보유할 수 있도록 특정 제어기 스타일에 사용할 수 있는 배치를 알 수 있도록 설계했습니다
또한 플랫폼마다 다른 디자인 패턴을 가지고 있기 때문에 iOS 18 및 관련 릴리즈부터 새로운 레이아웃을 잠금 해제할 수 있는 플랫폼별 배치를 도입했습니다 무슨 말인지 보여 드리죠 tvOS 18용 개발 시 제어기 스타일 한정자에 대해 자세히 살펴보겠습니다 tvOS에서는 버튼 스타일이 유일하게 사용할 수 있는 표준 제어기 스타일입니다
하지만 이 제어기 스타일에는 많은 배치를 사용할 수 있는데 automatic, leading, trailing, bottom이 포함됩니다 leading 배치부터 시작하여 각각에 대해 자세히 살펴보겠습니다 tvOS 18의 새로운 기능인 구독 스토어 보기는 가로로 배치할 수 있고 구독 제어기는 배치 값으로 표시된 화면 가장자리에 마케팅 콘텐츠는 제어기 반대편 가장자리에 배치할 수 있습니다 여기서는 leading 배치를 사용했습니다 하지만 trailing 배치를 사용하여 새로운 가로 레이아웃에도 접근할 수 있습니다 trailing 배치는 tvOS 18 SDK로 빌드된 앱의 새로운 기본값입니다 또한 마케팅 콘텐츠가 세로 높이의 작은 크기에 더 잘 맞는 경우 bottom 배치를 사용할 수 있습니다
제어기 배치 API는 이미 익숙한 기존 제어기 스타일과 함께 사용할 수 있습니다 제어기 스타일의 경우 iOS 18의 새로운 표준 스타일 세 가지를 공유하겠습니다 각각 자세히 살펴보도록 하죠 첫 번째는 앞서 소개한 compactPicker 스타일입니다 가로 레이아웃을 가진 최초의 선택기 유형 제어기 스타일입니다 이 스타일의 작은 크기는 요금제 간의 명확한 차이를 강조하는 데 이상적입니다 예를 들어 구독 요금제의 기간이 서로 다르지만 동일한 수준의 서비스를 이용할 수 있는 경우입니다
compact 선택기 스타일은 화면에 구독 옵션을 한 번에 표시하는 것을 권장하므로 구독 스토어에 2~3개 요금제 옵션만 표시하여 고객이 스토어를 스크롤할 필요가 없는 경우에 가장 적합합니다
다음으로 새로운 스타일은 pagedPicker 스타일입니다 compact 선택기 스타일처럼 이 스타일도 가로 레이아웃을 사용하지만 compact 선택기는 2~3개의 요금제를 연속으로 표시하는 반면 paged 선택기는 가로 페이징 효과가 있고 요금제에 대해 자세히 표시한다는 차이가 있습니다 마지막으로 pagedProminentPicker 스타일입니다 이 스타일은 paged 선택기 스타일과 가장 유사하지만 선택한 구독 옵션에 대해 눈에 띄는 테두리와 확장 효과를 추가합니다
이 새로운 스타일은 수직 공간 사용을 줄이는 데 유용합니다 몇 가지 구독 요금제만 상품화하고 스토어에 마케팅 콘텐츠와 같은 다른 중요한 디자인 요소를 위해 일부 공간을 확보하려는 경우에 이상적입니다
이러한 제어기 스타일을 추가하여 선택할 수 있는 표준 스타일이 총 3개에서 6개로 늘어납니다 구독 스토어 제어기 스타일은 구독 스토어의 필수 요소이며 이러한 새로운 표준 스타일은 배치 및 그룹화 API와 조합하여 App Store 앱에 동급 최고의 앱 내 구입 경험을 제공할 수 있도록 해 줍니다 그리고 구독 스토어의 모습을 추가로 맞춤화하려는 경우 iOS 18부터는 맞춤화된 제어기 스타일을 만들 수 있습니다
맞춤화된 스타일을 만들 수 있도록 이미 익숙한 표준 스타일을 만드는 데 사용하는 것과 동일한 기본 요소를 StoreKit에서 사용할 수 있도록 하고 있습니다 나만의 스타일을 구현하는 것이 얼마나 쉬운지 보여 드리기 위해 구독 스토어를 처음부터 만들어 보겠습니다
가족 공유 요금제를 위한 특별한 배지를 추가하는 선택기 유형 레이아웃으로 맞춤화된 제어기 스타일을 만들겠습니다
맞춤화된 제어기 스타일을 만드는 첫 번째는 SubscriptionStoreControlStyle 프로토콜을 준수하는 유형을 선언하는 것입니다 이 프로토콜에는 필수 메서드인 makeBody가 하나만 있습니다
makeBody 함수에 전달된 구성 값에는 맞춤화된 제어기를 만드는 데 필요한 모든 정보가 있습니다 이 구성 값을 새로운 SubscriptionPicker API와 함께 사용할 수 있습니다
구독 선택기에는 다음 두 번의 클로저가 예상됩니다 첫 번째 클로저의 경우 판매된 각 구독 옵션을 나타내는 데 사용되는 보기를 반환합니다 이 사양에서는 맞춤화된 SwiftUI 보기를 처음부터 생성합니다
먼저 VStack과 선택기 옵션의 표시 이름을 추가해 보겠습니다
앞서 만든 헬퍼 메서드를 사용하여 옵션의 현지화된 가격 표시를 추가하겠습니다
그런 다음 선택기 옵션에 가족 공유가 활성화되어 있는지 확인합니다 그렇다면 가족 공유 가능 배지를 추가합니다
다음으로 구독 옵션의 현지화된 설명을 추가합니다
어떤 옵션이 선택되었는지 나타내기 위해 이 보기를 HStack으로 래핑하고 선택 표시기를 추가하여 선택기 옵션의 선택된 상태를 전달하겠습니다
두 번째 클로저의 경우 고객이 선택한 요금제를 구독할 수 있게 하는 보기를 제공하려고 합니다 의미상 이 보기는 사용자가 상호 작용하면 선택한 옵션에 대한 구매가 트리거된다는 점에서 버튼과 같습니다 첫 번째 클로저와 마찬가지로 자체 구독 버튼을 빌드하거나 새로운 SubscribeButton API를 사용하여 클로저에 제공된 옵션 인수를 전달할 수 있습니다
새로운 맞춤화된 제어기 스타일을 사용하려면 제어기 스타일 한정자를 사용하여 구독 스토어 보기를 수정하고 사용자 지정 제어기 스타일 유형의 인스턴스를 전달하면 됩니다 SubscriptionStoreView를 사용하면 자신만의 제어기 스타일 구현 방식을 쉽게 사용할 수 있습니다 맞춤화된 제어기 스타일은 App Store 데이터 흐름과 같은 StoreKit의 강력한 인프라를 활용할 수 있는 좋은 방법입니다 구독 스토어가 앱 내 구입을 상품화하는 방식에 대한 전체적인 창의적 영역을 확보하면서 말이죠 SubscriptionStoreView의 새로운 기능 몇 가지를 소개해 드렸습니다 이제 Xcode의 테스트 환경에 대한 몇 가지 개선 사항을 보여 드리겠습니다 App Store 앱을 더욱 쉽게 테스트할 수 있게 할 것입니다 Xcode의 StoreKit Testing은 빌드를 시작하는 순간부터 앱 내 구입 경험을 최상의 상태로 유지할 수 있는 가장 좋은 방법입니다
Xcode의 StoreKit Testing을 사용하면 App Store Connect에서 제품 구성을 연기할 수 있습니다 앱이 예상대로 작동하는지 확인할 때까지 말이죠 따라서 앱을 특별하게 만드는 핵심 기능을 개발하는 데 집중할 수 있습니다 올해에는 Xcode 내에서 앱을 테스트할 수 있는 다양한 방법이 추가되었으니 이제 자세히 알아보겠습니다 먼저 StoreKit 구성에 대한 업데이트입니다 Xcode 16의 새로운 기능으로 앱의 개인정보 처리방침과 사용권 계약을 로컬에서 테스트할 수 있습니다 이 새로운 설정은 StoreKit 구성 파일 편집기의 새로운 앱 정책 섹션에서 찾을 수 있습니다 이 옵션을 클릭하면 앱의 사용권 계약 및 개인정보 처리방침을 위한 편집기가 열립니다 이 필드에 입력된 값은 서비스 약관 및 개인정보 처리방침 버튼을 탭하면 앱의 SubscriptionStoreView에 표시됩니다
또한 Xcode 16의 새로운 기능으로 구독 그룹의 표시 이름에 대한 현지화를 테스트할 수 있습니다 이 새 설정은 StoreKit 구성 편집기에서 구독 그룹으로 이동하여 찾을 수 있습니다 그룹에 포함된 구독 요금제 아래에 새로운 현지화 섹션이 있는 것을 확인할 수 있습니다 이 섹션의 하단 가장자리에 있는 더하기 버튼을 클릭하면 현지화된 그룹 표시 이름을 추가할 수 있는 편집기가 열립니다
또한 윈백 특가에 대한 새로운 구성 설정을 추가하고 있습니다 테스트 구성에 윈백 특가를 추가하는 것은 여러분에게 이미 익숙한 다른 구독 특가 유형과 비슷합니다 StoreKit 구성에 추가하는 방법을 알아보려면 WWDC24 세션 ‘App Store 특가 구현하기’를 확인하세요
다음으로 테스트 구성에서 앱 내 구입 이미지를 테스트할 수 있도록 지원을 추가하고 있습니다 이 새로운 설정은 제품 편집기의 새로운 ‘이미지’ 섹션에서 찾을 수 있습니다 StoreKit 구성에서 제공하는 이미지는 로컬 테스트 용도로만 사용되므로 원하는 이미지를 추가할 수 있습니다 물론 이 이미지가 앱에서 어떻게 표시되는지 테스트하는 가장 쉬운 방법은 ProductView 또는 StoreView를 사용하고 prefersPromotionalIcon 플래그를 true로 설정하는 것입니다
ProductView에 대해 자세히 알아보려면 WWDC23의 SwiftUI용 StoreKit 알아보기를 확인하세요 StoreKit 구성 파일에 대한 또 하나의 업데이트는 대화상자라는 새 섹션입니다
이 설정을 사용하면 앱 내 구입과 관련된 시스템 대화상자의 활성화 또는 비활성화를 선택할 수 있습니다
기본적으로 시스템 대화상자는 항상 활성화되어 있습니다 시스템 대화상자를 비활성화하면 앱 내 구입 등 대화상자가 표시될 때마다 자동으로 기본 옵션이 선택됩니다 UI 자동화 테스트나 수동 테스트를 수행하면서 앱의 앱 내 구입 로직의 기본 흐름만 테스트하려는 경우 특히 유용합니다 이제 Xcode의 트랜잭션 매니저에 어떤 업데이트가 적용되었는지 보여 드리겠습니다 트랜잭션 매니저는 앱 내 구입을 테스트하고 디버깅하는 데 필수적입니다 여기에서 Xcode에서 설치된 모든 앱에 대해 트랜잭션을 검사하고 다양한 종류의 구매를 시뮬레이션하는 등 작업을 수행할 수 있으며 Xcode의 StoreKit Testing을 사용할 수 있습니다 이는 모든 기기와 시뮬레이터에서 작동합니다 Xcode로 넘어가 보겠습니다 트랜잭션 매니저에게 업데이트되는 내용을 보여 드릴 수 있는데 이 새 기능을 시연하기 위해 Destination Video를 실행하는 시뮬레이터를 사용하고 있습니다 Xcode 15.2부터 Xcode에서 바로 앱으로 purchase intent를 보낼 수 있습니다
앱 외부에서 누군가 App Store에서 프로모션 제품 등의 구매를 시작하면 앱은 purchase intent를 수신합니다
그러면 구매 데이터가 앱으로 전송되어 구매를 완료하는 데 사용할 수 있습니다
앱이 purchase intent를 수신했을 때 앱이 어떻게 작동하는지 테스트하는 것은 매우 중요하며 이제 App Store를 거치지 않고도 쉽게 수행할 수 있습니다 앱 내 구입 프로모션과 앱에서 purchase intent를 구현하는 방법에 대해 자세히 알아보려면 WWDC23의 ‘StoreKit 2 및 Xcode 내 StoreKit Testing의 새로운 기능’을 참고하세요 Destination Video 앱에 purchase intent를 수신하는 코드를 추가했으니 테스트하는 방법을 보여 드리겠습니다 앱으로 purchase intent를 보내려면 먼저 트랜잭션 매니저 윈도우의 필터 막대 왼쪽에 있는 더하기 표시를 클릭합니다 앱의 구성된 제품 목록 아래에 일반 구매와 purchase intent를 결정할 수 있는 새로운 제어기가 있습니다
purchase intent를 보낼 제품을 선택하고 구매 유형을 Purchase Intent로 설정한 다음 완료를 클릭하면 테스트 기기로 purchase intent가 전송됩니다 수신되는 purchase intent를 처리하기 위해 이미 SwiftUI를 사용하여 몇 가지 맞춤화된 UI를 빌드했습니다 수신되는 purchase intent를 처리하도록 선택하면 제품을 상품화하기 위한 자체 UI를 만들 수도 있습니다 아무 조치도 취하지 않으면 앱이 실행될 때 결제 시트가 자동으로 표시되어 고객이 구매 흐름을 완료할 수 있습니다 이것이 바로 Xcode에서 purchase intent를 테스트하는 방법입니다 iOS 18부터의 새로운 기능으로 이제 앱에서 바로 청구 문제 메시지를 테스트할 수 있습니다 청구 문제로 인해 구독을 갱신할 수 없는 경우 앱에 청구 문제 메시지가 표시됩니다 이 경우 StoreKit에서는 고객에게 시트를 통해 문제를 해결하라는 메시지를 표시합니다 Xcode에서 트랜잭션 매니저로 이를 테스트할 수 있습니다 기기에서 iOS 18을 실행 중인 경우 구독 취소 또는 문제 해결을 선택할 수 있는 시트가 앱에 표시됩니다 청구 문제를 테스트하려면 StoreKit 구성의 구성 설정에서 청구 재시도 옵션을 활성화합니다
테스트하는 동안 구독이 갱신을 시도하면 거래 옆에 이 배지가 표시되어 청구 재시도에 진입했음을 알 수 있습니다
시뮬레이터가 이미 메시지를 수신하고 문제 해결을 위한 시트를 표시했습니다 해결을 탭하면 청구 문제가 해결되고 구독이 갱신된다는 메시지가 표시됩니다
이것이 바로 Xcode 내에서 청구 문제 메시지를 테스트하는 방법입니다 앱에서 여전히 앱 내 구입에 Original API를 사용하고 계시는 경우 공유해 드리고 싶은 중요한 업데이트가 있습니다 iOS 18 및 관련 OS 릴리즈부터 통합 영수증을 포함하여 앱 내 구입용 Original API는 더 이상 사용되지 않습니다 기존의 앱은 계속 작동하지만 레거시 API는 향후 운영 체제 릴리즈에서 개선되거나 새로운 기능이 제공되지 않습니다 최상의 앱 내 구입 환경을 제공하려면 기존 앱을 업데이트하여 StoreKit 2를 사용할 것을 강력히 권장합니다 StoreKit 2는 Original StoreKit API에 비해 많은 개선 사항을 제공합니다 고객 거래 내역 및 구독 갱신 정보와 같은 정보는 앱에서 항상 사용할 수 있습니다 또한 프레임워크가 자동으로 암호화 유효성 검사를 수행합니다 또한 StoreKit 2는 Swift async/await 패턴과 같은 최신 언어 기능을 사용하여 제품 메타데이터 구매 가져오기 고객 거래 내역 검색과 같은 작업을 수행합니다
마지막으로 Swift의 @backDeployed 속성 덕분에 App Store 2를 사용하여 새로운 App Store 기능에 접근할 수 있습니다 이전 운영 체제가 설치된 기기에 앱이 설치되어 있어도 마찬가지입니다 이것이 전부는 아닙니다 StoreKit 2는 앱 내 구입을 매우 쉽게 처리할 수 있는 전체 도구 모음을 제공합니다 지금 앱에서 사용할 수 있는 API에 대해 자세히 알아보려면 Apple Developer 웹사이트에서 StoreKit 문서를 확인하세요 오늘은 여기까지입니다 공유한 내용을 빠르게 요약해 보겠습니다 고객에게 최고의 앱 내 구입 경험을 제공하는 것은 StoreKit 2를 사용하는 것부터 시작됩니다 앱 내 구입 상품화가 간편해집니다 구독 스토어 보기에 추가되는 모든 새로운 기능을 소개해 드렸듯이 말이죠 앱 내 구입 흐름을 테스트할 준비가 되었으면 Xcode의 StoreKit Testing을 사용해 보세요 이러한 정보 및 기타 StoreKit 기능에 대한 자세한 내용은 ‘StoreKit 2 소개’, ‘StoreKit 테스트의 새로운 기능’ ‘SwiftUI용 StoreKit 알아보기’와 같은 이전 세션을 참조하세요 StoreKit를 사용하여 어떤 작품을 만드실지 기대가 됩니다 시청해 주셔서 감사합니다
-
-
4:26 - Destination Video Shop
import StoreKit import SwiftUI struct DestinationVideoShop: View { var body: some View { SubscriptionStoreView(groupID: Self.subscriptionGroupID) { SubscriptionOptionGroupSet { product in StreamingPassLevel(product) } label: { streamingPassLevel in Text(streamingPassLevel.localizedTitle) } marketingContent: { streamingPassLevel in StreamingPassMarketingContent(level: streamingPassLevel) StreamingPassFeatures(level: streamingPassLevel) } } .subscriptionStoreControlStyle(.compactPicker, placement: .bottomBar) } }
-
9:06 - Subscription Option Groups - Tabs style
SubscriptionStoreView(groupID: Self.subscriptionGroupID) { SubscriptionOptionGroupSet { product in StreamingPassLevel(product) } label: { streamingPassLevel in Text(streamingPassLevel.localizedTitle) } marketingContent: { _ in StreamingPassMarketingContent() } } .subscriptionStoreControlStyle(.compactPicker, placement: .bottomBar) .subscriptionStoreOptionGroupStyle(.tabs)
-
9:20 - Subscription Option Groups - Links style
SubscriptionStoreView(groupID: Self.subscriptionGroupID) { SubscriptionOptionGroupSet { product in StreamingPassLevel(product) } label: { streamingPassLevel in Text(streamingPassLevel.localizedTitle) } marketingContent: { _ in StreamingPassMarketingContent() } } .subscriptionStoreControlStyle(.compactPicker, placement: .bottomBar) .subscriptionStoreOptionGroupStyle(.links)
-
13:41 - Custom control style implementation
import StoreKit import SwiftUI struct BadgedPickerControlStyle: SubscriptionStoreControlStyle { func makeBody(configuration: Configuration) -> some View { SubscriptionPicker(configuration) { pickerOption in HStack(alignment: .top) { VStack(alignment: .leading) { Text(pickerOption.displayName) .font(title2.bold()) Text(priceDisplay(for: pickerOption)) if pickerOption.isFamilyShareable { FamilyShareableBadge() } Text(pickerOption.description) } Spacer() SelectionIndicator(pickerOption.isSelected) } } confirmation: { option in SubscribeButton(option) } } } struct DestinationVideoShop: View { var body: some View { SubscriptionStoreView(groupID: Self.subscriptionGroupID) { SubscriptionPeriodGroupSet { _ in StreamingPassMarketingContent() } } .subscriptionStoreControlStyle(BadgedPickerControlStyle()) } }
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.