-
Novedades en las compras dentro de la app de Apple
Descubre cómo las suscripciones mensuales con un compromiso de 12 meses ofrecen a los usuarios una opción más asequible para pagar su suscripción y garantizan un compromiso a más largo plazo. Descubre cómo configurar y probar esta nueva opción de pago mediante App Store Connect, las API de StoreKit, las pruebas de Xcode y mucho más. Además, conoce las mejoras en las API de canje de códigos de oferta y las optimizaciones en la experiencia de envío para App Review.
Capítulos
- 0:01 - Introducción
- 0:51 - Descripción general de las suscripciones mensuales con plazo mínimo de 12 meses
- 1:42 - Configúralas en App Store Connect
- 2:28 - Promociona suscripciones con StoreKit
- 6:55 - Monitorea suscripciones con las API del servidor del App Store
- 8:50 - Paquetes y Suites
- 9:26 - Canje de códigos de oferta
- 10:35 - Experiencia mejorada de envío
- 12:38 - Próximos pasos
Recursos
- 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
Videos relacionados
WWDC26
WWDC24
WWDC23
WWDC22
-
Buscar este 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 } } } }
-