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
                        }
                }
        }
}