In App purchase na 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