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

How to link to TestFlight App in iOS

There are two things you need to do. First, check to see if TestFlight is installed. Then create a new link to your app. NSURL *customAppURL = [NSURL URLWithString:@"itms-beta://"]; if ([[UIApplication sharedApplication] canOpenURL:customAppURL]) {     // TestFlight is installed     // Special link that includes the app's Apple ID     customAppURL = [NSURL URLWithString:@"https://beta.itunes.apple.com/v1/app/978489855"];      [[UIApplication sharedApplication] openURL:customAppURL]; } This special https://beta.itunes.apple.com URL will be opened directly in TestFlight. Finally, if you are using iOS 9 (or later), you need to make an addition to your Info.plist to get the canOpenURL: method to work. If your app is linked on or after iOS 9.0, you must declare the URL schemes you want to pass to this method. Do this by using the LSApplicationQueriesSchemes array in your Xcode project’s Info.plist file. For each URL scheme you wan...

Validity Time Auto-Renewables in Sandbox

The subscription durations, sandbox durations and incentive durations of auto-renewables. Hint: In Sandbox the validity time differs from live environment!!! Durations Sandbox Duration Incentive Durations (optional) 7 days 3 minutes 7 days 1 month 5 minutes 7 days, 1 month 2 months 10 minutes 7 days, 1 month 3 months 15 minutes 1 month 6 months 30 minutes 1 month, 2 months 1 year 1 hour 1 month, 2 months, 3 months After 6 extensions the abo is cancelled automatically in the sandbox environment.

Xcode 7.2: Refactoring not supported for Swift... but there is a plugin!

but... there is a plugin for that: Refactorator GitHub

Bundeskartellamt prüft Apples Tracking-Regelungen für Dritt-Apps (ATT, App Tracking Transparency Framework)

Das Bundeskartellamt hat gegen das Technologieunternehmen Apple ein Verfahren zur kartellrechtlichen Prüfung seiner Tracking-Regelungen sowie des App Tracking Transparency Framework eingeleitet. Das Bundeskartellamt geht dabei insbesondere dem Anfangsverdacht nach, dass diese Regelungen Apples eigene Angebote bevorzugt behandeln und/oder andere Unternehmen behindern könnten. 14.06.2022 Pressemeldung Bundeskartellamt

Working natively with JavaScript in iOS and Android without WebView

Using JavaScript code from native code without using a WebView (sic!) can be really useful to introduce dynamic functionality that was updatable without need of updating the app shorter iteration cycles share code between backend and native iOS and Android apps You can have business logic provided by a JavaScript that then controls the app that inject native functionality in the JavaScript context. You could even write an A/B testing framework based on this approach. iOS iOS offers the native JavaScriptCore: Evaluate JavaScript programs from within an app, and support JavaScript scripting of your app. So you can evaluate a script and read its return value natively: context.evaluateScript(myLib); let result = context.evaluateScript("myFunction();") let myFunction = context.objectForKeyedSubscription("myFunction"); let parametrizedResult = myFunction.invokeMethod(...) Or you can inject a native object into the JavaScript engine: @objc protoco...

Employee Development ...by Cards ...by Lego Brick Boards

Employee Development by using Skill Cards The goal is to build a hand of cards that make up that person’s most relevant personal growth areas. To do this, both the people leader and team member start with a deck of the same skill cards each. In private, each goes through this deck and sorts these cards into three stacks: not relevant, good enough, and to improve. By discussing why each card was placed where, with particular focus on those that do not match, a real, structured, and to-the-point conversation occurs. By focusing on reasoning—what led you to place this card here?—both can develop a shared understanding of the other's views. The main event, however, comes in focusing on those cards in “to improve”. To create focus and drive actual impact, these cards are discussed and prioritized. With a clear priority and a shared understanding of the individual aspects of each, tangible actions are crafted that can be taken to grow one’s career. LinkedIn Rob Sawyer mobi...

Microservice Micro-Feature architecture for mobile Apps

RIBs is the cross-platform architecture framework behind many mobile apps at Uber. The name RIBs is short for Router, Interactor and Builder, which are core components of this architecture. This framework is designed for mobile apps with a large number of engineers and nested states. The RIBs architecture provides: Shared architecture across iOS and Android. Build cross-platform apps that have similar architecture, enabling iOS and Android teams to cross-review business logic code. Testability and Isolation. Classes must be easy to unit test and reason about in isolation. Individual RIB classes have distinct responsibilities like: routing, business, view logic, creation. Plus, most RIB logic is decoupled from child RIB logic. This makes RIB classes easy to test and reason about independently. Tooling for developer productivity. RIBs come with IDE tooling around code generation, memory leak detection, static analysis and runtime integrations - all which improve developer product...