-
What’s new in Apple In-App Purchase
Discover how monthly subscriptions with a 12-month commitment give people a more affordable option to pay for your subscription and secure a longer-term commitment. Explore how to configure and test this new payment option using App Store Connect, StoreKit APIs, Xcode testing, and more. Plus, learn about improvements to offer code redemption APIs, and enhancements to the App Review submission experience.
Chapters
- 0:01 - Introduction
- 0:51 - Overview of monthly subscriptions with a 12-month commitment
- 1:42 - Set up in App Store Connect
- 2:28 - Merchandise with StoreKit
- 6:55 - Monitor subscriptions with App Store Server APIs
- 8:50 - Bundles and Suites
- 9:26 - Offer code redemption
- 10:35 - Enhanced submission experience
- 12:38 - Next steps
Resources
- In-App Purchase types
- Managing the life cycle of monthly subscriptions with a 12-month commitment
- Supporting monthly subscriptions with a 12-month commitment
- App Store Server Notifications V2
- Supporting offer codes in your app
- Implementing a store in your app using the StoreKit API
Related Videos
WWDC26
WWDC24
WWDC23
WWDC22
-
Search this video…
-
-
3:29 - Merchandise pricing terms with StoreKit views
// Merchandise pricing terms with StoreKit views import StoreKit import SwiftUI struct SubscriptionStore: View { var body: some View { SubscriptionStoreView(groupID: "3F19ED53") { // Custom marketing content } .preferredSubscriptionPricingTerms {_, subscriptionInfo in subscriptionInfo.pricingTerms.first { $0.billingPlanType == .monthly } } } } -
4:02 - Get subscription pricing terms and make a purchase
// Get subscription pricing terms and make a purchase import StoreKit var product: Product? // Fetch and assign product // Get the monthly billing plan's pricing terms for merchandising let pricingTerms = product?.subscription?.pricingTerms .first(where: {$0.billingPlanType == .monthly }) if let pricingTerms { let monthlyPrice = pricingTerms.billingDisplayPrice let totalCommitmentPrice = pricingTerms.commitmentInfo.price // Display both monthly and total commitment price to the customer } let result = try? await product?.purchase(options: [.billingPlanType(.monthly)]) switch result { // Verify the transaction, give the customer access to // the purchased content, and then finish the transaction } -
5:05 - Sheet to manage subscriptions by subscriptionGroupID
// Sheet to manage subscriptions by subscriptionGroupID import SwiftUI import StoreKit struct ManageSubscriptionsButton: View { let subscriptionGroupID: String @State var presentingManageSubscriptionsSheet: Bool = false var body: some View { Button("Manage Subscriptions") { presentingManageSubscriptionsSheet = true } .manageSubscriptionsSheet( isPresented: $presentingManageSubscriptionsSheet, subscriptionGroupID: subscriptionGroupID ) } } -
7:45 - JWSTransaction (decoded) for a monthly subscription with a 12-month commitment
// JWSTransaction (decoded) for a monthly subscription with a 12-month commitment { // … "expiresDate": 1783503660000, // for this billing period "price": 10990, // for this billing period "productId": "plus.pro.annual", "purchaseDate": 1780911660000, "type": "Auto-Renewable Subscription", "billingPlanType": "MONTHLY", "commitmentInfo": { "billingPeriodNumber": 1, "totalBillingPeriods": 12, "commitmentExpiresDate": 1812447660000, "commitmentPrice": 131880, } } -
7:59 - JWSRenewalInfo (decoded) for a monthly subscription with a 12-month commitment
// JWSRenewalInfo (decoded) for a monthly subscription with a 12-month commitment { // … "renewalBillingPlanType": "MONTHLY", "commitmentInfo": { "commitmentAutoRenewProductId": “plus.standard.annual”, "commitmentAutoRenewStatus": 0, "commitmentRenewalDate": 1812447660000, "commitmentRenewalPrice": 10990, "commitmentRenewalBillingPlanType": "BILLED_UPFRONT" } } -
9:58 - Sheet to redeem an offer code
// Sheet to redeem an offer code struct OfferCodeRedemption: View { @State var presentingOfferCodeSheet: Bool = false var body: some View { Button("Redeem Offer Code") { presentingOfferCodeSheet = true } .offerCodeRedemption(options: [], isPresented: $presentingOfferCodeSheet) {result in switch result { case .success(let verificationResult): switch verificationResult { // Verify the transaction, give the customer access to // the purchased content, and then finish the transaction } case .failure(let error): // Handle error } } } }
-
-
- 0:01 - Introduction
Learn how to merchandise products and grow your business with expanded subscription pricing options, updates to the offer code redemption API, and an enhanced App Store Connect submission experience.
- 0:51 - Overview of monthly subscriptions with a 12-month commitment
Monthly subscriptions with a 12-month commitment is a new pricing option that lets customers pay monthly for an annual subscription; can be added to new or existing one-year subscriptions in App Store Connect to reach a wider customer base.
- 1:42 - Set up in App Store Connect
Configure monthly subscriptions with a 12-month commitment in App Store Connect. Set up pricing, offers, and availability.
- 2:28 - Merchandise with StoreKit
Learn how SKDemo merchandises monthly subscriptions with a 12-month commitment using StoreKit and learn how to test with StoreKit Testing in Xcode.
- 6:55 - Monitor subscriptions with App Store Server APIs
New fields in App Store Server APIs to manage the subscription lifecycle of monthly subscriptions with a 12-month commitment.
- 8:50 - Bundles and Suites
Offering subscription Bundles and Suites is another way to provide customers with more value in their subscriptions across apps.
- 9:26 - Offer code redemption
The offer code redemption API is extended to take in a set of RedeemOption values and returns a VerificationResult.
- 10:35 - Enhanced submission experience
When you’re ready to submit an app to the App Store, you can utilize our enhanced submission experience for In-App Purchases in App Store Connect.
- 12:38 - Next steps
Utilize the new features; adopt the expanded subscription pricing, update offer code redemption call sites, test in Xcode 27 and sandbox, and submit through the enhanced App Review experience.