Product.SubscriptionInfo subscriptionPeriod does not provide the same result between the Sandbox/App Store environment and the StoreKit Testing in Xcode for a "1 week" subscription. "1 week" vs "7 days"

Hello,

I noticed the Product.SubscriptionInfo subscriptionPeriod (of type Product.SubscriptionPeriod) is different for the same product between StoreKit Testing in Xcode and the sandbox/App Store (production) environment.

For a “1 week” auto-renewable subscription, we get the following:

  • StoreKit Testing in Xcode: 1 week gives a subscriptionPeriod with value of 1 and a unit of Product.SubscriptionPeriod.Unit.week
  • Sandbox/App Store: 1 week gives a subscriptionPeriod with value of 7 and a unit of Product.SubscriptionPeriod.Unit.day

This created issues in my app because I used the localizedDescription of a Product.SubscriptionPeriod to display a text similar to “$4.99 per week”. This is what I obtain with the StoreKit Testing in Xcode, but in the Sandbox/App Store environment, it displays “$4.99 per day” (because the subscriptionPeriod is “7 Days” and the unit is then .day). Obviously, this is not what I wanted to display.

Other periods like “1 month”, “2 months”, “3 months”, “6 months, and “1 year”, the period provided by both StoreKit Testing and Sandbox/App Store correspond to the period unit specified in App Store Connect.

In addition, I want to report that for a weekly subscription/offer or a 2 weeks offer, Product.SubscriptionInfo.subscriptionPeriod or Product.SubscriptionOffer.period == .weekly or .everyTwoWeeks is always false.

We observe the following:

With Sandbox or App Store live production:

  • 1 week, Product.SubscriptionInfo.subscriptionPeriod == .weekly is false (because it’s “7 days”)
  • 1 week, Product.SubscriptionOffer.period == .weekly is false (because it’s “7 days”)
  • 2 weeks (offer), Product.SubscriptionInfo.subscriptionPeriod == .everyTwoWeeks is false (because it’s “14 days”)
  • 2 weeks (offer), Product.SubscriptionOffer.period == .everyTwoWeeks is false (because it’s “14 days”)

But with an Xcode StoreKit configuration file:

  • 1 week, Product.SubscriptionInfo.subscriptionPeriod == .weekly is true (because it’s “1 week”)
  • 1 week, Product.SubscriptionOffer.period == .weekly is true (because it’s “1 week”)
  • 2 weeks, Product.SubscriptionInfo.subscriptionPeriod == . everyTwoWeeks is true (because it’s “2 weeks”)
  • 2 weeks, Product.SubscriptionOffer.period == . everyTwoWeeks is true (because it’s “2 weeks”)

So in sandbox and production, .weekly and .everyTwoWeeks is never possible.

If someone from Apple could check the feedback FB19605865 🙂

Thank you Regards, Axel, @alpennec

Code:

do {
                        let productIDs: [String] = ["revenueSocks_weekly_trial"]
                        let products: [StoreKit.Product] = try await Product.products (for: productIDs)
                        let weeklySubscription: StoreKit.Product = products.first!
                        let displayPrice: String = weeklySubscription.displayPrice
                        
                        // For a weekly subscription in App Store Connect
                        // With an Xcode StoreKit configuration file: subscriptionPeriod unit is Week (week), value is 1 → "1 Week"
                        // With the Sandbox + App Store: subscriptionPeriod unit is Day (.day), value is 7 → "7 Days"
                        let unitString: String = weeklySubscription.subscription!.subscriptionPeriod.unit.localizedDescription
                        
                        print("\(displayPrice) per \(unitString.localizedLowercase)")
                        // StoreKit configuration file → "$4.99 per week"
                        // Sandbox + App Store → "$4.99 per day"
                    } catch {
                        print(error)
                    }
Product.SubscriptionInfo subscriptionPeriod does not provide the same result between the Sandbox/App Store environment and the StoreKit Testing in Xcode for a "1 week" subscription. "1 week" vs "7 days"
 
 
Q