In App purchase na iOS

płatności w aplikacji ios

Tworząc aplikację mobiną, nieważne czy na iOS czy nie, dobrze jest ja rozbudować o wersję Premium, czyli taka, która była by pozbawiona ograniczeń i limitów (np. ilości zapisanych danych) lub reklam. Nie chodzi w żaden sposób o pobieranie dodatkowych treści na platformę a jedynie o odblokowanie niektórych fukcji aplikacji. Można zrobić druga wersję aplikacji, która była by już płatna i widniała w sklepie jako osobna do kupna, ale po co, skoro można łatwo i szybko przejeść do wersji PREMIUM z poziomu darmowej aplikacji poprzez tak zwane płatności wewnętrzne in-app purchase.

Do takiej płatności na pewno potrzeba samej aplikacji, która powinna coś robić normalnie i dodatkowo powinna zrobić coś po udanej płatności. Chodzi o event, który by się wywołał na zwrtokę z App Store na transakcję zakończona powodzeniem.

Konfiguracja w iTunes Connect

Takwięc po całej procedurze nadania appId oraz podpisywania aplikacji w iTunes Connect i xCode należy wgrać apkę na iTunes Connect i skonfigurowac ustawienia do momentu statusu „Prepare for submission” – bez tego nie pójdzie. Dalej w zakładce Features należy dodać In-App Purchase np typu Non-Consumable czyli taka jednorazową i wporwadzić wszelkie potrzeba dane wraz z ceną, Reference Name, Display Name, Description, Review Information (dodać screen ) i najważniejsza pozycja „Product ID” – to właśnie po tej wartości odwołujemy się z kodu aplikacji do tej konkretnej płatności. Cleared for Sale również powinno być zaznaczone. Dobrze jest też dodać sobie testowego użytkownika i iTunes Connect, którym można testowo, bez obciążeń finansowych dokonuwac płatności.

To tyle jeżeli chodzi o konfigurację w sklepie, teraz to co faktycznie ma działać – kod objective-c

plik *.header:

//  Created by abc on 25/08/17.
//  Copyright (c) 2015 pan z pogodna. All rights reserved.

#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>

@interface CategoriesViewController : UIViewController <SKProductsRequestDelegate, SKPaymentTransactionObserver>{
   
}

- (IBAction)restore;
- (IBAction)removeAds;


@end

plik *.m

#define prodId @"myappProdId"

- (IBAction)removeAds{

    NSLog(@"i want to remove ads");

    if([SKPaymentQueue canMakePayments]){
   
        NSLog(@"User can make payments");
        SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:prodId]];
        productsRequest.delegate=self;
       
    }else{
        NSLog(@"User cannot make payments due to parental controls");
    }
  
}

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
   
    SKProduct *validProduct = nil;
    int count = [response.products count];
   
    if(count > 0){
        validProduct = [response.products objectAtIndex:0];
       
        NSLog(@"Product title: %@" , validProduct.localizedTitle);
        NSLog(@"Product description: %@" , validProduct.localizedDescription);
        NSLog(@"Product price: %@" , validProduct.price);
        NSLog(@"Product id: %@" , validProduct.productIdentifier);
       
        NSLog(@"Products Available!");
        [self purchase:validProduct];
    }else if(!validProduct){
        NSLog(@"No products available");
    }

}

- (void)purchase:(SKProduct *)product{

    SKPayment *payment = [SKPayment paymentWithProduct:product];
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
    
}

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{
   
    for(SKPaymentTransaction *transaction in transactions){
       
        switch(transaction.transactionState){
               
            case SKPaymentTransactionStatePurchasing:
               
                NSLog(@"Transaction state -> Purchasing");
                
            break;
               
            case SKPaymentTransactionStatePurchased:
               
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                [sharedManager upgradeFullVersion];
                NSLog(@"Transaction state -> Purchased");
                
            break;
               
            case SKPaymentTransactionStateRestored:
               
                NSLog(@"Transaction state -> Restored");
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                
            break;
               
            case SKPaymentTransactionStateFailed:
            
                NSLog(@"Error = %ld", transaction.error.code);
                if (transaction.error.code != SKErrorPaymentCancelled) {
                    NSLog(@"Error payment cancelled");
                    NSLog(@"transaction.error %@", transaction.error);
                   
                }
                [self performSelector:@selector(stopLoader) withObject:nil afterDelay:0.2];
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                
            break;
               
            default:
               
            break;
        }
    }
}

U tak oto jest akcja removeAds, którą należy podpiąć po jakiś przycisk w aplikacji i reszta sama już powinna zadziałać. Jeżeli prodId jest poprawny i user testowy stworzony to aplikacja odpalana z telefonu (z symulatora może nie zadziałać) powinna połączyć się App Store, pobrać wszekie dane dotyczące tej konkretnej płatności (cena, opips, tytuł) i po potwierdzeniu hasła do konta winna zwrócić Transaction state -> Purchased


Opublikowano: 22 sierpnia, 2017 przez Pan z Pogodna

Leave a Reply