-
Nouveautés en matière d’achats intégrés Apple
Découvrez comment les abonnements mensuels avec un engagement de 12 mois offrent aux utilisateurs une option de paiement plus abordable et assurent un engagement sur une plus longue durée. Apprenez à configurer et tester cette nouvelle option de paiement à l'aide d'App Store Connect, des API StoreKit, des tests Xcode, et plus encore. Explorez les améliorations apportées aux API d'utilisation des codes d'offre et à l'expérience de soumission à App Review.
Chapitres
- 0:01 - Introduction
- 0:51 - Présentation des abonnements mensuels avec un engagement de 12 mois
- 1:42 - Configuration dans App Store Connect
- 2:28 - Commercialisation avec StoreKit
- 6:55 - Surveillance des abonnements avec les API App Store Server
- 8:50 - Les bundles et les suites
- 9:26 - Utilisation des codes d’offre
- 10:35 - Expérience de soumission améliorée
- 12:38 - Étapes suivantes
Ressources
- 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
Vidéos connexes
WWDC26
WWDC24
WWDC23
WWDC22
-
Rechercher dans cette vidéo…
-
-
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 } } } }
-