Jawaban Yudha Prama dari Pertanyaan Bagaimana menambahkan fitur in-app-purchase di aplikasi iOS? di SETO.CO.ID

Lihat jawaban selengkapnya di SETO.CO.ID

Pertama kita definisikan kRemoveAdsProductIdentifier. Tujuannya kita ingin hapus iklan untuk paid user. Juga kBuyCurrencyProductIdentifier untuk pemilihan mata uang. Koding sebagai berikut:

# define kRemoveAdsProductIdentifier @"taruh productId disini"

- (IBAction)tapsRemoveAds{
  NSLog(@"User requests untuk remove iklan");

  if([SKPaymentQueue canMakePayments]){
    NSLog(@"User bisa melakukan pembayaran");

    // Jika kamu memiliki lebih dari satu in-app purchase, 
    // dan pengen user membeli produk lain, kamu hanya perlu mendefinisikan fungsi lain 
    // dan mengganti kRemoveAdsProductIdentifier dengan identifier untuk produk lainnya

    SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:kRemoveAdsProductIdentifier]];
    productsRequest.delegate = self;
    [productsRequest start];

  }
  else{
    NSLog(@"User tidak bisa melakukan pembayaran karena parental controls");
    // block koding in case user tidak dapat melakukan pembayaran karena parental controls
  }
}

Bagaimana jika dalam kasus tertentu productId tidak valid? Berikut kodingnya:

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
  SKProduct *validProduct = nil;
  int count = [response.products count];
  if(count > 0){
    validProduct = [response.products objectAtIndex:0];
    NSLog(@"Products Available!");
    [self purchase:validProduct];
  }
  else if(!validProduct){
    NSLog(@"No products available");
    // Blok koding disini akan dipanggil ketika productId tidak valid.
  }
}

Bagaimana jika user ingin restore pembelian? Ini kodingnya:

- (void)purchase:(SKProduct *)product{
  SKPayment *payment = [SKPayment paymentWithProduct:product];

  [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
  [[SKPaymentQueue defaultQueue] addPayment:payment];
}

- (IBAction) restore{
  [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
  [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}

- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
  NSLog(@"received restored transactions: %i", queue.transactions.count);
  for(SKPaymentTransaction *transaction in queue.transactions){
    if(transaction.transactionState == SKPaymentTransactionStateRestored){
      // ini akan dipanggil jika user berhasil restore pembelian
      NSLog(@"Transaction state -> Restored");

      [self doRemoveAds];
      [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
      break;
    }
  }   
}

Koding berikut akan dipanggil ketika proses transaksi berlangsung. Ketika proses transaksi berhasil, saya akan remove iklan.

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{
  for(SKPaymentTransaction *transaction in transactions){
    switch(transaction.transactionState){
      case SKPaymentTransactionStatePurchasing: NSLog(@"Transaction state -> Purchasing");
      // koding ini akan dipanggil ketika proses transaksi dimulai
      break;
      case SKPaymentTransactionStatePurchased:
      // koding ini akan dipanggil ketika proses transaksi berhasil
      [self doRemoveAds]; // karena transaksi berhasil maka kita remove iklan
      [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
      NSLog(@"Transaction state -> Purchased");
      break;
      case SKPaymentTransactionStateRestored:
      NSLog(@"Transaction state -> Restored");
      // kode dari SKPaymentTransactionStatePurchased ditaruh disini
      [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
      break;
      case SKPaymentTransactionStateFailed:
      // kode jika transaksi gagal
      if(transaction.error.code == SKErrorPaymentCancelled){
        NSLog(@"Transaction state -> Cancelled");
        // pembayaran dicancel ;(
      }
      [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
      break;
    }
  }
}

Bagaimana jika proses transaksi berhasil? Dalam kasus ini kita akan remove iklan.

- (void)doRemoveAds{
  ADBannerView *banner;
  [banner setAlpha:0];
  areAdsRemoved = YES;
  removeAdsButton.hidden = YES;
  removeAdsButton.enabled = NO;
}

Tambahkan koding berikut di viewDidLoad method, sehingga apakah user berhasil beli atau tidak, view tetap diload. Gunakan NSUserDefaults sehingga aplikasi akan diload tidak peduli apakah user berhasil beli atau tidak. Akan lebih baik menggunakan akses keychain, atau sesuatu yang lebih aman untuk menyimpan data pengguna karena NSUserDefaults dapat diubah.

areAdsRemoved = [[NSUserDefaults standardUserDefaults] boolForKey:@"areAdsRemoved"];
[[NSUserDefaults standardUserDefaults] synchronize];

Lalu tambahkan kode berikut ke dalam file header .h projectmu:

BOOL areAdsRemoved;

- (IBAction)restore;
- (IBAction)tapsRemoveAds;

Selanjutnya, kamu perlu mengimpor StoreKit framework ke file .m, juga tambahkan SKProductsRequestDelegate dan SKPaymentTransactionObserver setelah mendefinisikan @interface:

# import <StoreKit/StoreKit.h>

// taruh name dari view controller di MyViewController
@interface MyViewController() <SKProductsRequestDelegate, SKPaymentTransactionObserver>

@end

@implementation MyViewController // nama dari view controller (same as above)
  // kode diatas akan ditambahkan disini
@end

Enjoy!

Tulisan ini dipost melalui Aplikasi Seto di tanya jawab seputar Pengembangan Aplikasi Mobile, iOS, iPhone, Objective C, dan Programming.