Skip to main content

Cheat sheet for working with iOS, iTunes, AppStore auto-renewables or Android, GooglePlay subscriptions

How to test auto-renewable subscriptions on iOS and Android?

Test purchases

Sandbox Live
iOS Sandbox account TestFlight internal/external
Android License testing group via Alpha Channel

Release Management > App releases > Manage Alpha > Manage testers
License testing account via Alpha/Internal Channel

Settings > Account details > Gmail accounts with testing access


Reduced test subscription time

Test subscriptions renew more quickly than normal to aid in testing. The following table identifies the testing renewal times for subscriptions of various durations.

Note: Test subscriptions will renew a maximum of 6 times.


iOS AppStore Connect



Note: Test subscriptions will renew a maximum of 6 times; after that you can continue testing with the user.


Actual Duration
Test Duration
1 week3 minutes
1 month5 minutes
2 months10 minutes
3 months15 minutes
6 months30 minutes
1 year1 hour


Android Google Play


Production subscription periodTest subscription renewal
1 week5 minutes
1 month5 minutes
3 months10 minutes
6 months15 minutes
1 year30 minutes

The time-based features available for subscriptions, such as free-trials, are also shortened for testing. The following table identifies the testing time periods associated with time-based subscription features:

Feature
Test period
Free trial3 minutes
Introductory price periodSame as subscription test period
Grace period (both 3- and 7-day) 5 minutes
Account hold10 minutes



Testing Google Play Billing Responses


There are three reserved product IDs for testing static Google Play Billing responses:

android.test.purchased

When you make an Google Play Billing request with this product ID, Google Play responds as though you successfully purchased an item. The response includes a JSON string, which contains fake purchase information (for example, a fake order ID).

android.test.canceled

When you make an Google Play Billing request with this product ID Google Play responds as though the purchase was canceled. This can occur when an error is encountered in the order process, such as an invalid credit card, or when you cancel a user's order before it is charged.

android.test.item_unavailable

When you make an Google Play Billing request with this product ID, Google Play responds as though the item being purchased was not listed in your application's product list.

Cancelling test purchases or sandbox purchases


Android
Google Play accumulates completed test purchases for each user but does not pass them on to financial processing.

Test purchases are not automatically canceled, so you might want to manually cancel a test purchase to continue testing. To do so, open the app page in the Play Store. If the test purchase that you want to cancel is a subscription, you can also use the cancel() method of the Purchases.subscriptions API.

Important: The refund() and revoke() methods of the Purchases.subscriptions API don't support test purchases.


iOS
You cannot continue to test the auto-renewing aspect of the subscription for that test user after 5 renewals. To test the auto-renewing aspect you must create a new test user.


Server-side real-time update of subscription changes



There are events available for iOS:
To receive status update notifications, configure a subscription status URL for your app in App Store Connect. The App Store will deliver JSON objects via an HTTP POST to your server for the key subscription events. Your server is responsible for parsing, interpreting, and responding to all statusUpdateNotification posts.

Apple Developer
How we implemented Apple Server To Server notifications


And Android:
Google Play Billing provides server push notifications that let you monitor state changes for Play-managed subscriptions. By enabling Real-Time Developer Notifications, you'll receive a purchase token directly from Cloud Pub/Sub anytime there is an update to an existing subscription.

Android Developer

iOS Deeplinks


Additionally, your app can deep link customers to the payment details page within App Store on their device by opening this URL


For users who wish to cancel their subscription, your app can open the following URL:


Links


iOS

Comments

Most Favorite Posts

Server-driven UI (SDUI): Meet Zalandos AppCraft and AirBnB Lona

A short WTF: Joe Birch:  SERVER DRIVEN UI, PART 1: THE CONCEPT Zalando seems to follow the SDUI principle as well - defining a common design language and construct the screens on the backend while displaying them natively on the clients. They even go one step further; they implemented a mighty toolset to enable non-technical stakeholders to define their own native app screens Compass: Web tooling to create screens and bind data Beetroot: Backend service that combines the screen layout definition with the data Lapis/Golem: iOS/Android UI render engines Crazy cool! Good job, guys (when you do an open-source release?) To even move faster a Flutter based UI render engine implementation was great! See also AirBnB Lona SDUI approach Building a Visual Language Why Dropbox sunsetted its universal C++ mobile project and AirBnB its React Native implementation

Google Drive versus Dropbox

MacWorld: Online Storage Face-Off: Google Drive vs. Dropbox

CloudApp

CloudApp allows you to share images, links, music, videos and files. Here is how it works: choose a file, drag it to the menubar and let us take care of the rest. We provide you with a short link automatically copied to your clipboard that you can use to share your upload with co-workers and friends. Additionally you can view, track and delete files right from your menubar. CloudApp

CFPropertyList

The PHP implementation of Apple's PropertyList plist can handle XML PropertyLists as well as binary PropertyLists. It offers functionality to easily convert data between worlds, e.g. recalculating timestamps from unix epoch to apple epoch and vice versa. A feature to automagically create (guess) the plist structure from a normal PHP data structure will help you dump your data to plist in no time. github

App Indexing

A better search experience for apps and users with linking to in-app content. Google is working with app developers and webmasters to index the content of apps and relate them to websites. When relevant, Google Search results on Android will include deep links to apps. App Indexing

j2obc - A Java to iOS Objective-C translation tool and runtime

What J2ObjC Is J2ObjC is an open-source command-line tool from Google that translates Java code to Objective-C for the iOS (iPhone/iPad) platform. This tool enables Java code to be part of an iOS application's build, as no editing of the generated files is necessary. The goal is to write an app's non-UI code (such as data access, or application logic) in Java, which is then shared by web apps (using GWT), Android apps, and iOS apps. J2ObjC supports most Java language and runtime features required by client-side application developers, including exceptions, inner and anonymous classes, generic types, threads and reflection. JUnit test translation and execution is also supported. J2ObjC is currently between alpha and beta quality. Several Google projects rely on it, but when new projects first start working with it, they usually find new bugs to be fixed. Apparently every Java developer has a slightly different way of using Java, and the tool hasn't translated all possib...

In-App Purchase Receipt Validation on iOS

A vulnerability has been discovered in iOS 5.1 and earlier related to validating in-app purchase receipts by connecting to the App Store server directly from an iOS device. An attacker can alter the DNS table to redirect these requests to a server controlled by the attacker. Using a certificate authority controlled by the attacker and installed on the device by the user, the attacker can issue a SSL certificate that fraudulently identifies the attacker’s server as an App Store server. When this fraudulent server is asked to validate an invalid receipt, it responds as if the receipt were valid. iOS 6 will address this vulnerability. If your app follows the best practices described below then it is not affected by this attack. iOS Developer Library In-App-Klau jetzt auch im Mac App Store ( Heise )