Martin Bayly
Martin Bayly

Reputation: 2503

iPhone - How to retrieve duration for auto-renewable subscription for in app purchases

I'm looking at setting up In App Purchases for an iPhone app. I'm planning on using the new auto-renewable subscription type. However, I want to offer multiple durations for a particular subscription, but can't see how I can retrieve the duration from the SKProduct that is returned in the SKProductsResponse.products array.

The SKProduct object has price, localizedTitle and localizedDescription. However, if you set up a subscription family with multiple durations the title/description are set once for the family so you cannot include the duration, and the docs explicitly say don't include the duration in the title/description. However, can't see any other field where I can retrieve the duration for displaying in my custom in app store. Either I'm missing something or it isn't going to be available until 4.3?

Pointers greatly appreciated!

Upvotes: 14

Views: 5600

Answers (3)

pronebird
pronebird

Reputation: 12260

iOS 11.2 brings the subscriptionDuration property to SKProduct. I don't think there is a fallback for older iOS though.

https://developer.apple.com/documentation/storekit/skproduct/2936884-subscriptionperiod

Upvotes: 6

Peter Kramer
Peter Kramer

Reputation: 231

You can use a specific productIdentifier for each duration (in the code below the productIdentifier for a 1 month subscription is "com.domainname.myapp.sub1month" and for a 7 day duration it is "com.domainname.myapp.sub7day") and search for that in the paymentQueue:

-(void) paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{
   for(SKPaymentTransaction *transaction in transactions){
     switch (transaction.transactionState){
        case SKPaymentTransactionStatePurchasing:
            break;
        case SKPaymentTransactionStatePurchased:
            if([transaction.payment.productIdentifier isEqualToString:@"com.domainname.myapp.sub1month"]{
                newSubscriptionEndDate=[transaction.transactionDate timeIntervalSinceReferenceDate]+3600*24*31;
            }
            if([transaction.payment.productIdentifier isEqualToString:@"com.domainname.myapp.sub7day"]  ){
                newSubscriptionEndDate=[transaction.transactionDate timeIntervalSinceReferenceDate]+3600*24*7;
            }
            [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
            break;

Upvotes: 9

Clad
Clad

Reputation: 1559

You need to have some mapping product_id => length somewhere, either in your app or retrived from your app's backend.

Upvotes: 11

Related Questions