itunes connectやdeveloper centerで下準備は済ませているものとして。コードの実装部分のみ。課金の商品は1度きりの購入のよくある広告非表示の商品をイメージ。
処理の流れとしては、viewDidLoadにて初めの画面表示の時に製品IDで商品情報を取得して、ボタンを押したら購入処理を開始するというもの。商品が一つだけなら下記のような感じにできるが、普通は複数でテーブルビューなどに表示して配列で商品管理をやっている模様。出来るだけ簡単で少ないコードでの実装を目指す・・・
購入処理
デリゲートの追加
class ClassName: UIViewController SKProductsRequestDelegate, SKPaymentTransactionObserver{
…
}
必要なデリゲートメソッド
func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
}
func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]){
}
実装例
import UIKit
import StoreKit
class ClassName: UIViewController SKProductsRequestDelegate, SKPaymentTransactionObserver{
var storeBt:UIButton!
var productID = “com.sample.product100”
var vProduct: SKProduct!
override func viewDidLoad() {
storeBt = UIButton()
storeBt.frame = CGRectMake(0, 0, 200, 22)
storeBt.setTitle(“”, forState: UIControlState.Normal)
storeBt.setTitleColor(UIColor.orangeColor(), forState: UIControlState.Normal)
storeBt.setTitle(“”, forState: UIControlState.Highlighted)
storeBt.setTitleColor(UIColor.blackColor(), forState: UIControlState.Highlighted)
storeBt.titleLabel!.adjustsFontSizeToFitWidth = true
storeBt.addTarget(self, action: “byAc:”, forControlEvents: .TouchUpInside)
self.view.addSubview(storeBt)
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
getProductInfo()
}
func getProductInfo(){
if SKPaymentQueue.canMakePayments() {
let request = SKProductsRequest(productIdentifiers:
NSSet(objects: self.productID) as! Set
request.delegate = self
request.start()
} else {
print(“Please enable In App Purchase in Settings”)
}
func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
let count : Int = response.products.count
if (count>0) {
var validProducts = response.products
var validProduct: SKProduct = response.products[0] as SKProduct
if (validProduct.productIdentifier == self.produto_value) {
print(validProduct.localizedTitle)
print(validProduct.localizedDescription)
print(validProduct.price)
vProduct = validProduct
//
storeBt.setTitle(“\(validProduct.localizedTitle) \(validProduct.price)円”, forState: UIControlState.Normal)
storeBt.setTitle(“\(validProduct.localizedTitle) \(validProduct.price)円”, forState: UIControlState.Highlighted)
} else {
print(validProduct.productIdentifier)
}
} else {
print(“not found”)
}
}
func byAc(sender: AnyObject){
if(vProduct != nil){
let payment = SKPayment(product:vProduct)
SKPaymentQueue.defaultQueue().addPayment(payment)
}
}
func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]){
for transaction: SKPaymentTransaction in transactions {
switch transaction.transactionState {
case .Failed:
SKPaymentQueue.defaultQueue().finishTransaction(transaction)
NSLog(“%@”, “失敗”)
case .Purchasing:
NSLog(“%@”, “購入中”)
case .Restored:
SKPaymentQueue.defaultQueue().finishTransaction(transaction)
NSLog(“%@”, “リストア”)
case .Purchased:
SKPaymentQueue.defaultQueue().finishTransaction(transaction)
NSLog(“%@”, “成功”)
// レシートを取得して検証
var receiptURL: NSURL = NSBundle.mainBundle().appStoreReceiptURL!
var receiptData: NSData = NSData(contentsOfURL: receiptURL)!
var base64receiptData: String = receiptData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
NSLog(“%@”, base64receiptData)
default:
print(transaction.transactionState.rawValue)
break
}
}
}
}