Improved Support for Subscription Products

This documentation will eventually live in the manual, but for the time being, here is some details about the SubscriptionManager class.

Unity IAP supports Product subscription information queries through the SubscriptionManager class. For example code, please review the IAPDemo.cs script included in the Unity IAP SDK (1.19+).

SubscriptionManager class methods
This class supports the Apple store and Google Play store. For Google Play, this class only supports Products purchased using IAP SDK 1.19+.

public SubscriptionInfo getSubscriptionInfo() Returns a SubscriptionInfo object (see below)

SubscriptionInfo class methods
The SubscriptionInfo class is a container for a Product’s subscription-related information.

  • public string getProductId()

  • Returns a Product’s store ID

  • public DateTime getPurchaseDate()

  • Returns the Product’s purchase date.

  • For Apple, the purchase date is the date when the subscription was either purchased or renewed.

  • For Google, the purchase date is the date when the subscription was originally purchased.

  • public Result isSubscribed()

  • Returns a Result enum to indicate whether this Product is currently subscribed or not.

  • Non-renewable Products in the Apple store return a Result.Unsupported value.

  • Auto-renewable Products in the Apple store and subscription products in the Google Play store return a Result.True or Result.False value.

  • public Result isExpired()

  • Returns a Result enum to indicate whether this Product has expired or not.

  • Non-renewable Products in the Apple store return a Result.Unsupported value.

  • Auto-renewable Products in the Apple store and subscription products in the Google Play store return a Result.True or Result.False value.

  • public Result isCancelled()

  • Returns a Result enum to indicate whether this Product has been cancelled.

  • A cancelled subscription means the Product is currently subscribed, but will not renew on the next billing date.

  • Non-renewable Products in the Apple store return a Result.Unsupported value.

  • Auto-renewable Products in the Apple store and subscription products in the Google Play store return a Result.True or Result.False value.

  • public Result isFreeTrial()

  • Returns a Result enum to indicate whether this Product is a free trial.

  • Products in the Google Play store return Result.Unsupported if the application does not support version 6+ of the Android in-app billing API.

  • Non-renewable Products in the Apple store return a Result.Unsupported value.

  • Auto-renewable Products in the Apple store and subscription products in the Google Play store return a Result.True or Result.False value.

  • public Result isAutoRenewing()

  • Returns a Result enum to indicate whether this Product is auto-renewable.

  • Non-renewable Products in the Apple store return a Result.Unsupported value.

  • Auto-renewable Products in the Apple store and subscription products in the Google Play store return a Result.True or Result.False value.

  • public TimeSpan getRemainingTime()

  • Returns a TimeSpan to indicate how much time remains until the next billing date.

  • Products in the Google Play store return TimeSpan.MaxValue if the application does not support version 6+ of the Android in-app billing API.

  • `public Result isIntroductoryPricePeriod()

  • Returns a Result enum to indicate whether this Product is within an introductory price period.

  • Non-renewable Products in the Apple store return a Result.Unsupported value.

  • Auto-renewable Products in the Apple store and subscription products in the Google Play store return a Result.True or Result.False value.

  • Products in the Google Play store return Result.Unsupported if the application does not support version 6+ of the Android in-app billing API.

  • public TimeSpan getIntroductoryPricePeriod()`

  • Returns a TimeSpan to indicate how much time remains for the introductory price period.

  • Subscription products with no introductory price period return TimeSpan.Zero.

  • Products in the Apple store return TimeSpan.Zero if the application does not support iOS version 11.2+, macOS 10.13.2+, or tvOS 11.2+.

  • public long getIntroductoryPricePeriodCycles()

  • Returns the number of introductory price periods that can be applied to this Product.

  • Products in the Apple store return 0 if the application does not support iOS version 11.2+, macOS 10.13.2+, or tvOS 11.2+

  • public string getIntroductoryPrice()

  • Returns a string to indicate the introductory price of the Product.

  • Products with no introductory price return a "not available" value.

  • Apple store Products with an introductory price return a value formatted as “0.99USD”.

  • Google Play Products with an introductory price return a value formatted as “$0.99”.

  • Products in the Apple store return “not available” if the application does not support iOS version 11.2+, macOS 10.13.2+, or tvOS 11.2+.

  • public DateTime getExpireDate()

  • Returns the date of the Product’s next auto-renew or expiration (for a cancelled auto-renewing subscription).

  • Products in the Google Play store return TimeSpan.MaxValue if the application does not support version 6+ of the Android in-app billing API

Result
enumeration

Properties

  • Trueindicate a bool value true
  • Falseindicate a bool value false
  • Unsupportedindicate this is a unsupported property for this subscription product

For more complete example code, please view the IAPDemo.cs within Plugins/Purchasing/script.

#if SUBSCRIPTION_MANAGER
       Dictionary<string, string> dict = m_AppleExtensions.GetIntroductoryPriceDictionary();
#endif
foreach (Product item in controller.products.all)
{
#if SUBSCRIPTION_MANAGER
   // this is the usage of SubscriptionManager class
   if (item.receipt != null) {
       if (item.definition.type == ProductType.Subscription) {
          string intro_json = (dict == null || !dict.ContainsKey(item.definition.storeSpecificId)) ? null :  dict[item.definition.storeSpecificId];
           SubscriptionManager p = new SubscriptionManager(item, intro_json);
           SubscriptionInfo info = p.getSubscriptionInfo();
           Debug.Log(info.getProductId());
           Debug.Log(info.getPurchaseDate());
           Debug.Log(info.getExpireDate());
           Debug.Log(info.isSubscribed());
           Debug.Log(info.isExpired());
           Debug.Log(info.isCancelled());
           Debug.Log(info.isFreeTrial());
           Debug.Log(info.isAutoRenewing());
           Debug.Log(info.getRemainingTime());
           Debug.Log(info.isIntroductoryPricePeriod());
           Debug.Log(info.getIntroductoryPrice());
           Debug.Log(info.getIntroductoryPricePeriod());
           Debug.Log(info.getIntroductoryPricePeriodCycles());
       } else {
           Debug.Log("the product is not a subscription product");
       }
   } else {
       Debug.Log("the product should have a valid receipt");
   }
#endif
}
9 Likes