-
Novidades na Compra no App com a Apple
Descubra como as assinaturas mensais com compromisso de 12 meses oferecem aos usuários uma alternativa mais econômica para pagar por uma assinatura e asseguram um compromisso prolongado. Veja como configurar e testar essa nova opção de pagamento usando o App Store Connect, APIs do StoreKit, testes no Xcode e muito mais. Além disso, conheça as melhorias nas APIs para resgate de códigos de oferta e na experiência de envio para análise de apps.
Capítulos
- 0:01 - Introdução
- 0:51 - Visão geral das assinaturas mensais com compromisso de 12 meses
- 1:42 - Configurar no App Store Connect
- 2:28 - Comercialize com StoreKit
- 6:55 - Monitore assinaturas com as APIs do App Store Server
- 8:50 - Pacotes e conjuntos
- 9:26 - Resgate de códigos de oferta
- 10:35 - Experiência aprimorada de envio
- 12:38 - Próximas etapas
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
Vídeos relacionados
WWDC26
WWDC24
WWDC23
WWDC22
-
Buscar neste vídeo...
-
-
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 } } } }
-