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
