스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
App Store 특가 구현하기
App Store Connect와 최신 StoreKit 기능 및 API로 App Store 특가를 통해 사용자의 참여도를 높이는 방법을 알아보세요. 이전 구독자를 되찾고 구독 재참여를 유도하기 위한 특가 항목을 설정하는 방법과 Mac용 앱을 위한 특가 코드를 생성하는 방법을 설명합니다. 샌드박스 및 Xcode상의 테스트를 통해 특가 항목이 원활하게 작동하는지 확인하는 방법도 살펴보세요.
챕터
- 0:00 - Introduction
- 1:32 - Updates to offers
- 4:37 - Introducing win-back offers
- 7:10 - Configure win-back offers
- 16:50 - Support win-back offers
- 28:44 - Streamlined purchasing
리소스
- Forum: App Store Distribution & Marketing
- Generating a signature for promotional offers
- Merchandising win-back offers in your app
- Message
- offer
- PurchaseIntent
- Setting up StoreKit Testing in Xcode
- StoreKit views
- Submit feedback
- Supporting subscription offer codes in your app
- Supporting win-back offers in your app
- Testing win-back offers in the sandbox environment
- Testing win-back offers in Xcode
관련 비디오
WWDC24
WWDC23
-
다운로드
안녕하세요, ‘App Store 특가 구현하기’를 시작하겠습니다 저는 Xiaolan이고, App Store Connect 엔지니어입니다 안녕하세요, 저는 Ricky이고 StoreKit 팀의 엔지니어입니다 오늘은 App Store 특가에 대한 모든 멋진 업데이트와 이러한 기능을 통해 사용자의 참여도를 높이는 방법을 공유하겠습니다 먼저, App Store 특가를 간단히 요약할게요 구독 기반 비즈니스의 경우 장기적인 성공을 위해서는 고객을 유지하는 것이 매우 중요합니다 App Store 특가는 고객을 확보하고 유지하고, 고객의 재참여를 유도하는 좋은 방법입니다 App Store 특가를 사용하면 대상 고객에게 한정된 기간 동안 구독을 무료 또는 할인된 가격으로 제공할 수 있습니다
App Store에는 세 가지 유형의 특가가 있습니다 신규 구독 특가, 프로모션 특가 그리고 특가 코드이죠
신규 구독 특가를 설정하면 신규 구독자가 무료 체험이나 할인 가격으로 구독을 사용해 볼 수 있습니다
프로모션 특가는 더 유연합니다 비즈니스 요구 사항에 따라 고유한 할인을 생성하고 자체적인 자격 기준을 정의할 수 있습니다 특가 코드의 경우 App Store에서 생성된 고유한 일회용 코드를 사용하거나 나만의 맞춤형 코드를 생성하여 자체 마케팅 채널을 통해 배포할 수 있습니다 구독 특가 StoreKit API가 많이 개선되었는데 Transaction과 RenewalInfo의 새로운 offer 멤버와 macOS의 특가 코드에 대한 새로운 지원 등이 있죠 StoreKit에는 앱에서의 특가 지원을 매우 간단하게 만들어 주는 몇 가지 주요 API가 있으며 이러한 API를 더 좋게 만드는 몇 가지 개선 사항을 알려드릴게요
먼저, StoreKit와 App Store 서버 API에서 Transaction 및 RenewalInfo API를 일부 개선했습니다 Transaction 구조는 고객이 앱에서 하는 구입을 이해하는 데 중요합니다 RenewalInfo 구조는 구독 상태의 미래에 대해 알려줍니다
Transaction에서 offer라는 새 멤버는 모든 특가 관련 정보를 포함하는 새로운 유형입니다 이러한 정보에는 특가의 ID 유형, paymentMode 등이 있으며 paymentMode는 특가가 무료 체험인지, 분납 결제인지 또는 완납 결제인지를 알려 줍니다
offer 멤버는 선택 사항이기 때문에 고객이 구독을 구입할 때 특가를 사용하는 경우에만 StoreKit가 거래에 offer 멤버를 포함합니다
이 새로운 API는 iOS 17.2부터 StoreKit에서 사용할 수 있습니다 offer 멤버는 iOS 18.0부터 RenewalInfo API에서도 사용할 수 있습니다 구독의 다음 갱신 기간에 offer 멤버에 적용되는 특가가 있는 경우 StoreKit가 offer 멤버를 채웁니다
App Store 서버 API를 사용한다면 JWSTransaction 및 JWSRenewalInfo API에 있는 세 가지 필드에서 동일한 특가 데이터를 사용할 수 있습니다
이러한 필드로는 offerIdentifier와 offerType이 있는데 이미 현재 있는 필드죠 그리고 offerDiscountType은 새로운 필드로 이전 거래에 대해서도 사용할 수 있습니다
offerDiscountType의 값은 StoreKit API의 결제 모드와 유사하며 특가가 무료 체험인지 분납 결제인지 또는 완납 결제인지를 알려 줍니다
App Store API에 대한 자세한 내용은 ‘앱 내 구입을 위한 App Store Server API 살펴보기’를 확인하세요
다음으로, 앱에서 StoreKit 뷰를 사용해 구독을 판매하는 경우 SubscriptionStoreView의 UI에서 프로모션 특가를 표시할 수 있도록 하는 새로운 보기 한정자가 있습니다
이 보기 한정자는 subscriptionPromotionalOffer입니다
이 새로운 보기 한정자를 사용하여 보기에 프로모션 특가를 표시할지 결정합니다
StoreKit는 이 제품에 대한 프로모션 특가의 목록을 제공하므로 반환할 특가를 결정하는 로직에 집중할 수 있습니다
그런 다음 선택한 특가에 대한 서명을 생성하고 반환합니다 StoreKit는 UI에 세부 정보를 표시하는 작업을 처리하고 고객이 구독하기로 선택한 경우 특가를 구입에 추가합니다
프로모션 특가 지원과 서명 생성에 대한 자세한 내용은 이 세션의 관련 문서에서 확인하세요
마지막으로, 이제 macOS 15.0이 iOS 및 visionOS와 함께 특가 코드 사용 시트 제시를 지원합니다
SwiftUI 앱에서 iOS와 동일한 API를 사용하여 앱 사용 시트를 제시할 수 있습니다
기존 구독 특가의 새로운 StoreKit API를 알아보았습니다 올해는 이전 구독자를 다시 확보하기 위한 새 특가 유형이 있습니다 앱의 기존 구독자에게 더 쉽게 도달할 수 있는 방법인
윈백 특가가 도입되었습니다 App Store에서 제공된 고객 자격 기준을 사용하여 윈백 특가를 설정할 수 있고 App Store 소유의 채널을 활용하여 윈백 특가를 홍보할 수도 있습니다 윈백 특가는 구독이 만료되고 자동 갱신이 비활성화되어 구독을 취소한 구독자의 재참여를 유도하는 데 중점을 둡니다
앱에서 고객 자격을 처리하고 확인하는 대신 윈백을 사용하면 App Store를 통해 특정 규칙과 기준에 따라 고객을 세분화할 수 있습니다 고객과 더 관련 있는 새 특가를 효과적으로 만들 수 있습니다
기존 특가와 마찬가지로 자체 마케팅 채널을 통해 윈백 특가를 홍보할 수 있습니다
윈백 특가는 구독 페이지에 자동으로 표시되며 App Store에서 윈백 특가를 홍보할 수 있습니다 예시를 보겠습니다 App Store에 카드의 새로운 윈백 특가가 나와 있습니다 윈백 특가 카드에는 특가에 대한 설명과 가격 세부 정보 및 특가가 적용되는 구독에 대한 정보가 포함되어 있습니다
고객은 제품 페이지에서 윈백 특가를 찾을 수 있습니다 App Store에 사용 가능한 특가가 표시되죠
고객이 특가 카드를 탭하면 더 긴 설명과 더 큰 이미지가 포함된 상세 페이지가 표시됩니다 고객은 이 페이지에서 특가에 대한 부가 설명을 확인할 수 있죠
Apple 에디터 팀이 투데이, 게임, 앱 탭에서 고객을 위한 맞춤 추천을 만들 때 윈백 특가를 소개할 수 있습니다
마지막으로, 고객은 구독 페이지에서 사용 가능한 윈백 특가를 확인할 수 있습니다 오늘은 윈백 특가에 대해 자세히 알아보고 App Store Connect 구성을 소개해 드리겠습니다 그런 다음 Ricky가 예시를 통해 앱에서 윈백 특가를 지원하고 테스트하는 방법을 보여 드리겠습니다 그리고 마지막으로 구입 간소화 경험과 앱에서 이 구입 경험을 지원하는 방법에 대해 이야기하겠습니다
먼저 윈백 특가를 자세히 살펴보겠습니다 기존 특가와 마찬가지로 윈백 특가를 생성할 때는 분납 결제, 완납 결제 또는 무료 체험 중에 선택합니다 다양한 유형과 구독에 따라 특가 기간을 다르게 선택할 수 있습니다 윈백 특가를 고객에게 제공하는 시기를 조정할 수 있고 특가 종료일을 지정하는 옵션이 있습니다 특가 우선 순위 구성을 사용하면 보통 우선 순위 이벤트 및 특가보다 먼저 이 특가를 표시할지 여부를 지정할 수 있습니다 이는 App Store의 윈백 추천을 맞춤화하는 데 사용되는 요인 중 하나이기도 합니다 또한 이 특가를 받을 수 있는 특정 국가와 지역을 결정할 수 있습니다 App Store Connect 가격 도구를 사용하면 선택한 각 국가 또는 지역에 대한 가격을 설정할 수 있습니다
윈백 특가는 유료 구독 기간 마지막 구독 이후 시간 특가 간 대기 시간을 비롯한 다양한 고객 자격 기준을 지원합니다
유료 구독 기간은 고객이 서비스에 대한 비용을 지불한 시간의 양을 의미합니다 이 기준을 사용하면 고객이 구독한 기간에 따라 할인을 제공할 수 있습니다
최솟값을 월 단위로 지정할 수 있습니다
최근 몇 개월 연속의 유료 서비스만 고려됩니다
기간에는 그룹에서 고객이 구독을 구독한 시간이 포함됩니다 동일한 구독 그룹에서의 업그레이드와 다운그레이드는 자격 계산에 영향을 미치지 않습니다
마지막 구독 이후 시간은 최근에 활성화된 구독 이후 경과된 시간을 의미합니다 여기에는 월 단위의 최댓값과 최솟값이 필요합니다 이를 통해 구독하지 않은 기간에 따라 구독을 해지한 고객의 재참여를 유도하는 다양한 전략을 적용할 수 있습니다
예시를 통해 자세히 설명해 드릴게요 Destination Video 앱에는 Streaming Pass라는 구독 그룹이 있습니다 이 앱은 월별 요금제로 기본과 프리미엄을 제공합니다
이 윈백 특가는 대상 고객에게 기본 구독 1개월 무료 이용을 제공합니다 이 특가의 대상이 되려면 고객이 해당 구독의 비용을 3개월 이상 지불했고 구독이 2~24개월 전부터 활성 상태여야 합니다 그리고 고객이 이 특가를 마지막으로 사용한 지 6개월 이상 지나야 합니다
고객의 관점에서 살펴볼게요 먼저, 고객이 프리미엄 요금제를 구독했습니다
그런 다음 기본 요금제로 다운그레이드했습니다
그리고 두 달이 지난 후 고객이 구독을 취소했습니다 이 시점에서 고객은 이 윈백 특가에 대한 유료 구독 기간 자격 요건을 충족했습니다
이 취소 이후에 마지막 구독 이후 시간이 계산되기 시작합니다
2개월 후에 고객은 윈백 특가 대상이 됩니다 마지막 구독 이후 최소 시간을 2개월로 설정했기 때문이죠
이제 특가 간 대기 시간에 대해 이야기해 볼게요 이는 선택적인 요건으로 고객이 특가를 다시 사용하기 위해 기다려야 하는 최소 시간을 설정할 수 있습니다
윈백 특가 기간이 끝난 후 특가 간 대기 시간이 시작되고
그런 다음 고객이 구독을 갱신합니다
세 달 후에 고객이 구독을 취소했습니다
취소 후에 마지막 구독 이후 시간 계산이 시작됩니다
취소 후 2개월이 지나면 고객이 마지막 구독 이후 시간 요건을 충족합니다 하지만 고객이 이전에 특가를 사용했고 특가 간 대기 시간이 최소 6개월이기 때문에 특가가 종료되고 6개월이 지난 후에 윈백 특가 대상이 될 수 있습니다
지금까지 윈백 특가와 고객 자격 기준이 적용되는 방식을 간단히 알아봤습니다 이제 App Store Connect의 윈백 특가 설정에 대해 알아보죠
기존 구독에 대한 윈백 특가를 생성하려면 먼저 구독 가격 페이지로 이동합니다
여기에 윈백 특가라는 새로운 탭이 있습니다 이 탭을 처음 클릭하면 이런 페이지가 표시됩니다 새로운 윈백 특가 구성을 시작하기 위해 특가 생성 버튼을 클릭하면 모달 뷰가 나타납니다 첫 번째 단계는 특가의 참조 이름과 특가 식별자를 입력하는 것입니다 두 필드 모두 구독 그룹 내에서 고유해야 합니다 앱은 StoreKit API와 통신할 때 특가 식별자를 사용합니다 이 필드를 생성한 후에는 수정할 수 없습니다 특가에 일관된 명명 규칙을 사용하여 개발자가 더 쉽게 작업할 수 있도록 하세요 다음 단계는 시작일, 종료일, 특가 우선 순위를 선택하고 고객 자격 기준을 정의하는 것입니다
App Store에 특가를 게시하려면 시작일이 필요합니다
언제든지 특가 우선 순위를 조정할 수 있습니다 마지막으로, 자격 기준을 지정하여 고객이 이러한 기준에 따라 특가를 이용할 수 있게 되는 시기를 선택합니다 특가가 시작되기 전에 이 모든 설정을 조정할 수 있지만 특가 시작일 이후에는 설정이 모두 잠깁니다
다음 단계에서는 특가를 사용할 수 있는 국가와 지역을 선택합니다 그런 다음 특가가 분납 결제인지 완납 결제인지 아니면 무료 체험인지를 선택합니다 그리고 기간을 선택합니다
유료 특가인 경우 드롭다운에서 기본 통화를 기준으로 가격도 선택합니다 선택한 가격을 사용하여 App Store Connect는 특가에 대해 선택한 각 국가 및 지역에 대한 최적의 가격을 제시합니다 각 드롭다운 메뉴를 클릭하여 가격을 조정할 수 있습니다 특가가 생성된 후에는 해당 가격 설정을 변경할 수 없습니다
마지막으로, 윈백 특가 세부 정보를 검토, 확인할 수 있습니다 설정을 업데이트하려면 뒤로 버튼을 클릭해서 이전 단계로 돌아갑니다
구성이 괜찮아 보이면 확인을 클릭하여 이 새로운 특가의 생성을 완료합니다
이제 윈백 특가가 있으니 자체 마케팅 채널과 App Store에서 특가를 홍보할 수 있습니다
여기에 특가 링크도 포함할 수 있습니다
이렇게 하면 자체 마케팅 채널을 통해 특가를 배포할 수 있죠
App Store에서 윈백 특가를 홍보하고 싶은 경우 구독에 대해 구성해야 할 몇 가지 설정 세부 사항이 있습니다
특가 세부 사항 페이지에는 ‘App Store에서 홍보하기’라는 섹션이 있습니다 구독에 이미지가 없으면 이 섹션이 표시됩니다 링크를 클릭하여 구독에 대한 이미지를 업로드합니다
그리고 구독 세부 사항 페이지에서 이미지를 앱 심사에 제출합니다
구독에 대한 이미지가 승인되고 특가에 대해 App Store 특가를 활성화하면 특가 시작 시 App Store에서 윈백 특가가 자동 홍보됩니다
특가가 아직 시작되지 않았다면 App Store에서 홍보되지 않도록 특가를 취소할 수 있습니다 하지만 윈백 특가가 시작된 후에 App Store에 윈백 특가가 더 이상 표시되지 않게 하려면 윈백 특가를 삭제해야 합니다
App Store에서 홍보되는 윈백 특가는 세부 사항 보기에 새 특가 카드로 표시됩니다 승인된 구독 이미지와 앱 아이콘을 조합해서 이와 같은 새 이미지를 생성합니다
이렇게 App Store Connect에서 구독에 대한 윈백 특가를 설정할 수 있죠 App Store Connect API 3.6은 나만의 맞춤 흐름으로 윈백 특가를 설정할 수 있는 리소스를 제공합니다
새로운 WinBackOffers API에는 윈백 특가를 생성하고, 읽고, 업데이트하는 엔드포인트가 포함되어 있습니다 이러한 API를 사용하여 특가 절차를 쉽게 관리할 수 있습니다 구독과 inAppPurchase에 대한 새 이미지 리소스도 2개 추가되면서 기존의 PromotedPurchaseImages 리소스는 지원 중단되었습니다 이제 App Store Connect의 윈백 특가 설정에 대해 아셨으니 Ricky가 StoreKit 2를 통한 윈백 특가 지원을 설명하겠습니다 App Store Connect에서 윈백 특가를 구성하는 방법을 설명해 주셔서 고마워요, Xiaolan 다음 단계는 StoreKit 2를 사용해 이 새로운 특가를 지원하기 위한 코드를 앱에 추가하는 것입니다 먼저, 윈백 특가를 기존의 다른 특가 유형과 구별하는 방법을 알아보겠습니다 StoreKit 2는 OfferType 모델로 SubscriptionOffer 유형을 식별하죠 지원되는 유형은 신규 구독 특가, 프로모션 특가 그리고 iOS 18.0부터는 윈백 특가입니다 앱의 특가 가격과 기간은 Product 모델 아래의 구독 정보에서 확인할 수 있는데 여기에는 사용 가능한 각 특가 유형의 멤버가 있죠 신규 구독 특가와 프로모션 특가 목록 그리고 iOS 18.0부터 제공되는 윈백 특가 목록입니다 이 정보는 앱에서 특가에 대한 지원을 구축할 때 중요하며 이 정보를 통해 SubscriptionOffer 객체가 어떤 특가 유형인지 알리고 구독에 대해 구성된 특정 특가 유형 정보를 가져옵니다 이제 윈백 특가를 사용하여 구독 판매 및 구입에 대한 지원을 추가하는 방법을 알아보겠습니다
StoreKit Message API는 고객에게 윈백 특가를 보여 주는 가장 빠르고 쉬운 방법입니다 StoreKit 뷰는 훌륭한 판매 UI를 빌드하고 특가 세부 사항과 함께 구독을 표시할 수 있는 옵션을 제공합니다 마지막으로, 구독 판매와 UI를 더 세밀하게 제어하고 싶다면 핵심 StoreKit 2 API를 사용할 수 있습니다 달성하려는 맞춤화 수준에 따라 이러한 옵션 중 하나 이상을 선택할 수 있습니다
앱에서 winBackOffer 메시지를 수신하면 StoreKit이 고객에게 이런 시트를 표시합니다 구독과 특가 가격에 대한 자세한 설명이 나와 있고 고객은 아래의 버튼을 사용해 수락하고 서비스를 다시 구독할 수 있죠
이를 지원하기 위해 Message API는 이제 winBackOffer라는 새 Reason을 제공합니다
고객이 윈백 특가 대상인 경우 앱에서 이 메시지를 자동으로 수신합니다
앱의 거래 업데이트도 놓치지 않아야 합니다 고객의 구입에 대한 알림을 받고 잠금 해제된 콘텐츠에 대한 액세스 권한을 고객에게 부여할 수 있어야 하니까요
곧 iOS 샌드박스 계정 설정으로 이동하여 샌드박스에서 윈백 특가를 테스트할 수 있습니다 Display Win-back Offers(윈백 특가 표시) 스위치를 활성화해 새 특가를 이용할 수 있을 때 앱에서 메시지를 수신합니다
StoreKit Message를 사용해 iOS 18.0에서 앱의 윈백 특가를 지원하고 샌드박스에서 이를 테스트하는 방법을 알아보았습니다
판매 UI를 더 맞춤화하고 싶다면 WWDC23에서 StoreKit 뷰를 사용하는 방법을 소개했습니다 앱 내 구입을 표시하고 판매할 수 있는, 즉시 사용 가능한 API죠 StoreKit 뷰는 고객이 특가 대상일 때 윈백 특가를 비롯한 모든 구독 특가의 가격 세부 정보 표시를 자동으로 지원합니다 따라서 추가 작업이 필요하지 않죠 고객이 두 개 이상의 특가를 사용할 수 있는 경우에는 몇 가지 추가 로직을 실행하여 보기에 어떤 특가를 표시할지 결정해야 할 수 있습니다 이를 달성하기 위해 StoreKit 뷰에는 새로운 보기 한정자인 preferredSubscriptionOffer가 있습니다
preferredSubscriptionOffer를 SubscriptionStoreView와 조합하면 사용 가능한 특가가 두 개 이상일 때 무엇을 사용할지 정하고 StoreKit에서 사용자를 대신해 특가 메타데이터 가져오기와 구입 설정을 처리하도록 할 수 있습니다
SubscriptionStoreView에서 새 한정자를 사용하려면 이렇게 하세요
Destination Video 앱에서 구독 요금제를 판매하기 위해 Streaming Pass 요금제의 구독 그룹 ID를 사용하여 SwiftUI 뷰를 설정합니다 SubscriptionStoreView는 이 월간 요금제와 같은 사용 가능한 특가의 세부 정보를 자동으로 표시합니다 여기서 StoreKit이 자동 선택한 특가의 가격을 볼 수 있죠
preferredSubscriptionOffer 한정자를 추가해서 사용 가능한 다른 특가를 확인하고 어떤 걸 표시할지 결정할 수 있습니다
preferredSubscriptionOffer API는 하나의 매개변수를 사용합니다 그룹의 각 구독에 대해 호출하는 함수이죠 이 함수에서 StoreKit은 제품 객체 구독 정보 고객이 현재 사용할 수 있는 모든 특가 목록을 제공하죠
자체 로직을 실행하고 어떤 특가를 사용할지 결정하기 위해 StoreKit에서 필요한 정보는 이게 전부입니다 하나를 선택하면 SubscriptionOffer 객체를 여기에 반환합니다
여러분이 nil을 반환하고 구독에 고객이 사용할 수 있는 신규 구독 특가가 있는 경우 앱의 보기에 항상 신규 구독 특가가 표시됩니다 이 예에서는 가장 긴 무료 체험을 제공하는 특가를 찾습니다 무료 체험 특가가 없는 경우 대신 목록에서 첫 번째 특가를 선택합니다 앱에서 특가의 가격과 기간에 따라 여기에 더 많은 로직을 추가할 수 있습니다 고객이 월간 구독의 3개월 무료 체험 특가를 사용할 수 있으므로 SwiftUI 뷰에 반영된 새로운 가격 세부 정보를 확인할 수 있습니다
이렇게 SubscriptionStoreViews를 맞춤화하여 고객에게 다양한 특가를 표시할 수 있습니다 구독의 판매를 더 세밀하게 제어해야 하거나 맞춤 UI를 만들고 싶은 경우 핵심 StoreKit API를 사용할 수 있고, 직접 특가 판매를 관리할 수 있습니다
앞서 Product 모델에서 특가 세부 정보를 찾을 수 있는 위치를 보여 드렸지만, 윈백 특가에는 자격 요건 측면도 있으며 이는 고객마다 다릅니다 Xiaolan이 App Store Connect에서 자격 요건 구성 방법을 보여 드렸죠
작업을 단순화하고 고객에게 올바른 특가를 표시할 수 있게 StoreKit은 eligibleWinBackOfferIDs라는 새 API를 통해 각 고객에게 제공되는 윈백 특가의 맞춤형 목록을 제공합니다
구독 상태 모델의 RenewalInfo 객체에서 이 새 API를 찾고, 고객이 즉시 사용할 수 있는 윈백 특가의 ID 목록에 빠르게 접근할 수 있습니다 이 목록을 사용하여 구독 정보에서 해당 특가를 검색하고 보기에 가격 세부 정보를 표시합니다
이 새로운 API를 사용하여 Destination Video에서 윈백 특가에 대한 지원을 추가하는 방법을 시연해 보겠습니다 제 앱에는 고객에게 판매를 표시하기 전에 구독 상태와 신규 구독 특가 자격을 확인하는 기존 로직이 있습니다 이를 위해 이 함수를 사용하여 고객의 현재 구독 상태를 확인하고 고객이 특가 대상인지 확인합니다 이 함수는 두 개의 매개변수를 사용합니다 상태를 확인하려는 구독의 그룹 ID와 해당 제품 ID 목록이죠
가장 먼저 할 일은 구독의 현재 상태를 가져오는 것입니다
그리고 이전에 만든 데이터 구조를 사용하여 구문 분석하고 고객에게 서비스를 이용할 권한이 있고 자동 갱신이 활성화됐는지 확인합니다
이 정보로 이 enum을 사용하여 판매 UI를 표시해야 하는지 결정할 수 있습니다
고객이 자동 갱신을 활성화한 경우 판매를 표시하지 않는 플래그를 반환합니다
고객이 현재 구독 중이지 않은 경우 판매 UI를 보여 줄 수 있습니다 이 경우, 먼저 판매하려는 구독에 대한 제품을 로드합니다 그런 다음 고객이 신규 구독 특가 대상인지 확인하고 적격한 대상인 경우 보기에 표시할 구독 제품과 특가를 반환합니다
고객이 신규 구독 특가 대상이 아닌 경우 이전에 검색한 구독 상태를 확인하여 고객이 대신 윈백 특가 대상인지 확인합니다
윈백 특가는 이 제품을 더 이상 구독하지 않는 고객에게만 제공되기 때문에 고객이 소유한 구독의 상태를 확인해야 합니다 고객이 가족 공유를 통해 서비스를 이용할 수 있을 수도 있으니까요
윈백 특가 자격은 해당 구독 상태의 갱신 정보에서 확인할 수 있습니다 이 정보를 토대로, 항상 목록의 첫 번째 객체인 최적의 윈백 특가 ID를 찾을 수 있지만, 사용 가능한 특가가 둘 이상인 경우 다른 특가를 고려할 수도 있습니다 한 개 이상의 윈백 특가가 있는 경우, 이를 해당 제품과 함께 반환하여 고객이 사용하도록 할 수 있습니다 보기를 생성해야 하는 특가 세부 정보를 얻으려면 구독 정보의 모든 특가 목록에서 SubscriptionOffer 객체를 검색하면 됩니다
적격한 윈백 특가 ID 목록이 비어있다면 고객이 사용할 수 있는 특가가 없다는 의미이므로 일반 구독 가격으로 판매 보기를 표시할 수 있습니다
이러한 방식으로 고객이 윈백 특가 대상인지와 함께 기본 구독 상태 작업 흐름을 확인할 수 있습니다 고객이 특가를 사용하기로 선택한 경우 여러분이 마지막으로 해야 할 작업은 윈백 특가를 구입에 추가하는 것입니다
이 작업은 간단합니다 iOS 18.0에서는 winBackOffer라는 새 PurchaseOption API를 사용하여
윈백 특가를 나타내는 SubscriptionOffer 객체를 구입에 추가합니다 그런 다음 구입 옵션을 구입 API에 전달합니다 App Store에서 고객이 해당 특가 대상인지 확인한 후 StoreKit에서 앱에 구입 시트를 표시합니다
지금까지 앱에서 윈백 특가를 지원하는 방법을 알아보았습니다 StoreKit Message는 고객에게 윈백 특가를 보여 주는 가장 빠른 옵션입니다 StoreKit 뷰를 사용하면 경우에 따라 코드를 추가하지 않아도 되고 멋진 구독 판매 UI를 만들 수도 있습니다 StoreKit 뷰의 다른 새 기능에 대해 자세히 알아보려면 2024년 세션 ‘StoreKit 및 앱 내 구입의 새로운 기능’을 확인하세요 앱 및 구독 서비스에 대한 맞춤형 작업 흐름과 UI를 생성해야 하는 경우 SubscriptionStatus와 SubscriptionInfo에서 새로운 StoreKit API를 사용하여 고객에게 적절한 특가를 찾고 이를 자체 판매 보기에 표시할 수 있습니다
윈백 특가를 지원하기 위해 앱에 코드를 추가한 후에는 다양한 시나리오와 다양한 구독 상태에서 테스트해야 합니다 샌드박스에서 윈백 특가를 구현하는 모든 지원 메소드를 테스트할 수 있습니다 앞서 윈백 특가 StoreKit Message를 테스트하는 방법을 알아봤죠
StoreKit 뷰나 핵심 StoreKit API 중에 하나를 사용하거나 둘을 조합하여 사용하려는 경우 Xcode의 StoreKit Testing을 사용하여 테스트할 수도 있습니다 앱을 개발하는 동안 특가를 테스트하는 가장 빠른 방법이죠
Xcode에는 앱에서 윈백 특가를 테스트할 수 있는 새 기능이 있습니다
Xcode에서 윈백 특가를 구성하려면 먼저 로컬 앱 내 구입을 설정한 StoreKit 구성을 엽니다 그런 다음 자동 갱신 구독 머리말 아래에서 구독을 찾고 윈백 특가 섹션이 나올 때까지 아래로 스크롤하면 표가 보입니다
더하기(+) 버튼을 클릭하여 새 특가를 구성하고 특가 이름
특가 ID
다른 모든 특가 유형과 결제 모드
기간
그리고 해당하는 경우 가격 등 필요한 세부 정보를 입력합니다
App Store Connect에서 고객이 특가를 사용하기 위해 충족해야 하는 다양한 규칙, 상태, 조건에 따라 윈백 특가의 자격 요건을 구성할 수 있습니다 고객 자격의 결과를 빠르고 효율적으로 테스트하기 위해 특가별로 자격 요건을 변경하는 토글이 Xcode에 추가되어 구독 상태나 기타 자격 기준에 대해 걱정할 필요가 없습니다
이 고객 자격 토글을 사용하여 구독을 해지했을 때 앱에서 윈백 특가를 받아야 하는지 결정합니다 그리고 디버깅하는 동안 이를 변경하여 고객의 특가 자격에 대한 여러 시나리오를 테스트해서 앱의 반응을 확인합니다
저장을 클릭하면 이제 이 구독에 대한 새 윈백 특가가 설정되죠 더 많은 특가를 구성하려면 테스트 요구 사항에 따라 다양한 설정을 사용하여 이 단계를 반복합니다
이제 앱에서 윈백 특가 테스트를 시작할 준비가 됐습니다 Xcode의 StoreKit Testing은 구독 특가를 테스트하는데 유용한 도구로, 윈백 특가에 대한 다양한 설정과 고객 상태를 빠르게 테스트할 수 있습니다 고마워요, Ricky 마지막 주제는 윈백 특가에 추가된 구입 간소화 경험에 관한 것입니다 App Store에서 윈백 특가를 홍보하는 방법을 이미 보여 드렸죠 윈백 특가를 홍보하면 고객이 구입 간소화라는 기능을 사용하여 App Store에서 해당 특가를 사용하고 서비스를 구독하는 작업을 한 번에 할 수 있습니다 구입 간소화는 기본적으로 앱에서 활성화되어 있습니다 App Store Connect를 통헤 이 설정을 구성할 수 있습니다
앱에서 윈백 특가에 대해 구입 간소화를 사용하는 경우 고객이 구독 버튼을 탭하여 특가를 사용하면 App Store에 결제 시트가 표시됩니다 여기서 고객은 구독과 특가의 세부 정보를 검토할 수 있습니다 고객이 구입을 확인하고 완료한 뒤 앱을 열면 즉시 구독 서비스에 접근할 수 있게 됩니다 윈백 특가의 구입을 계속 진행하고 이 특가를 사용하려면 특정 고객 작업이 발생해야 할 수 있습니다 이 경우 App Store Connect에서 설정을 사용하여 윈백 특가에 대한 구입 간소화를 끌 수 있습니다 구독 페이지로 이동하면 청구 유예 기간 아래에서 구입 간소화를 구성할 수 있는 새 섹션을 볼 수 있습니다 편집 버튼을 클릭하여 구입 간소화를 끌 수 있습니다
구입 간소화를 끄면 App Store가 앱에 구입 내역을 직접 전송하며, 여기에서 맞춤형 경험을 만들 수 있습니다 이를 지원하려면 앱에서 몇 가지를 변경해야 합니다
구입 간소화를 끄기로 결정했지만 App Store에서 계속 윈백 특가를 홍보하고 싶다면 앱에서 몇 가지 코드를 설정하여 고객이 App Store에서 시작한 구입을 수신해야 합니다 WWDC23에서 다룬 PurchaseIntent API를 사용하면 됩니다 고객이 앱 외부에서 홍보된 앱 내 구입 또는 윈백 특가와 같은 구입을 시작하면 App Store가 purchase intent를 전송합니다 새 purchase intent를 수신하면 즉시 구입을 계속 진행하고 결제 시트를 표시하거나 나중에 사용할 수 있게 intent를 저장할 수 있죠
PurchaseIntent를 사용하여 고객이 App Store에서 사용하기 시작한 윈백 특가를 수신할 수 있습니다 이를 지원하기 위해 iOS 18.0과 macOS 15.0에서 offer라는 새 멤버가 제공되는데, 이는 선택적 SubscriptionOffer 유형이며 윈백 특가가 포함된 purchase intent에 대해서만 채워집니다
윈백 특가가 포함된 purchase intent를 수신하면 제공된 특가 정보를 사용하여 고객에게 전체 특가 세부 정보와 판매를 표시합니다 그런 다음 평소처럼 구입을 시작하고 구입 옵션에 선택한 특가를 추가합니다
Xcode 16에서는 Xcode의 StoreKit Testing을 사용하여 purchase intent 리스너와 deferral 로직을 테스트합니다 StoreKit 세션 ‘StoreKit 및 앱 내 구입의 새로운 기능’을 확인하세요 Rudy가 자세히 설명해 드릴 거예요
지금까지 윈백 특가에 대한 구입 간소화 기능과 이 기능을 꺼야 하는 경우 앱에서 이러한 구입을 처리하는 방법을 알아봤습니다 오늘은 여기까지입니다 StoreKit의 새롭고 업데이트된 특가 API에 대해 알아봤습니다 윈백 특가에 대한 개요를 소개했고 윈백 특가를 다양한 방법으로 구성하여 앱에서 새 특가 유형을 지원하는 방법도 시연했습니다 마지막으로 App Store에서 윈백 특가를 홍보하는 방법과 고객이 구입 간소화를 사용해 특가를 사용하는 방법도 보여 드렸죠
지금 바로 지원을 추가하고 윈백 특가를 테스트할 수 있습니다 여러분이 만들 새로운 경험을 기대하고 있습니다 피드백 지원을 사용해서 피드백을 공유해 주세요 더 자세한 내용을 알아보고 싶다면 개발자 웹사이트에서 관련 문서를 참조하세요 놓치지 말아야 할 다른 멋진 세션이 많이 있으니 ‘StoreKit 및 앱 내 구입의 새로운 기능’과 ‘App Store Connect의 새로운 기능’을 확인하세요 이 세션에서 영감을 받아 앱에 특가를 추가해 보시기 바랍니다 함께해 주셔서 감사합니다
-
-
4:25 - Present offer code redemption sheet on macOS - SwiftUI API
// Present offer code redemption sheet on macOS - SwiftUI API import SwiftUI import StoreKit struct MyView: View { @State var showOfferCodeRedemption: Bool = false var body: some View { Button("Redeem Code") { showOfferCodeRedemption = true } .offerCodeRedemption(isPresented: $showOfferCodeRedemption) { result in // Handle result } } }
-
20:15 - Choose preferred offer in a SubscriptionStoreView
// Choose preferred offer in a SubscriptionStoreView import SwiftUI import StoreKit struct MyView: View { let groupID: String var body: some View { SubscriptionStoreView(groupID: groupID) .preferredSubscriptionOffer { product, subscription, eligibleOffers in let freeTrialOffer = eligibleOffers .filter { $0.paymentMode == .freeTrial } .max { lhs, rhs in lhs.period.value < rhs.period.value } return freeTrialOffer ?? eligibleOffers.first } } }
-
23:05 - Check subscription entitlement and offer eligibility
// Check subscription entitlement and offer eligibility import StoreKit func shouldShowMerchandising( for groupID: String, productIDs: [Product.ID] ) async throws -> MerchandisingVisibility { // Get subscription status let statuses = try await Product.SubscriptionInfo.status(for: groupID) // Check if the customer is already entitled to the subscription let entitlement = SubscriptionEntitlement(for: statuses) if entitlement.autoRenewalEnabled { return .hidden } // Check for offers to show in merchandising UI let products = try await Product.products(for: productIDs) let isEligibleForIntroOffer = await Product.SubscriptionInfo.isEligibleForIntroOffer(for: groupID) if isEligibleForIntroOffer { let subscriptions = products.map { ($0, $0.subscription?.introductoryOffer) } return .visible(subscriptions) } // Check for eligible win-back offers let purchasedStatus = statuses.first { $0.transaction.unsafePayloadValue.ownershipType == .purchased } let renewalInfo = try purchasedStatus?.renewalInfo.payloadValue let bestWinBackOfferID = renewalInfo?.eligibleWinBackOfferIDs.first // Return the product with the offer if there is one if let bestWinBackOfferID { let subscriptions: [(Product, Product.SubscriptionOffer?)] = products.map { let winBackOffer = $0.subscription?.winBackOffers.first { $0.id == bestWinBackOfferID } return ($0, winBackOffer) } return .visible(subscriptions) } // Only return the product if there is no offer return .visible(products.map { ($0, nil) }) } struct SubscriptionEntitlement { let isEntitled: Bool let autoRenewalEnabled: Bool init(for statuses: [Product.SubscriptionInfo.Status]) { let entitledStatuses = statuses.filter { $0.state == .subscribed || $0.state == .inBillingRetryPeriod || $0.state == .inGracePeriod } isEntitled = !entitledStatuses.isEmpty autoRenewalEnabled = entitledStatuses.contains { $0.renewalInfo.unsafePayloadValue.willAutoRenew } } } enum MerchandisingVisibility { case hidden case visible([(Product, Product.SubscriptionOffer?)]) }
-
25:26 - Add a win-back offer to a purchase
// Add a win-back offer to a purchase import StoreKit func purchase( _ product: Product, with offer: Product.SubscriptionOffer? ) async throws { // Prepare the purchase options var purchaseOptions: Set<Product.PurchaseOption> = [] // Add win-back offer to the purchase if let offer, offer.type == .winBack { purchaseOptions.insert(.winBackOffer(offer)) } // Make the purchase try await product.purchase(options: purchaseOptions) }
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.