まとまりのないブログ

something which something is something

雑記・雑学

swift – app内課金の実装

投稿日:

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

-雑記・雑学

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

関連記事

世界各国の婚姻件数と離婚件数

適当に調べたもの。調査年代は各国で統一はされていない。現時点(2018年)で調査できるデータのなるべく新しいもの。 離婚率1 = 離婚件数÷婚姻件数×100 離婚率2 = 離婚件数÷人口×1000 国 …

no image

firefly ROC-RK3566-PC のメモリがECC使ってる模様

ROC-RK3566-PC fireflyというメーカー(ブランド?)のSBCの新しい製品でROC-RK3566-PCという型番の製品が新しく発売された様子。CPUはRockChip RK3566 C …

cocos2d-x javascript no.2 タッチイベントの追加

イベントはシーンまたはレイヤー、スプライトに追加することができる。イベントを定義し、addListnerにてそのイベントと対象オブジェクトを設定することでタッチイベントを受けることができるようになる。 …

no image

Asrock Phantom Gaming 4 B365M にPS/2端子があるのに気付いた

1年ほど前に購入したAsrock Phantom Gaming 4 B365Mのバックパネルをふと見てみたらPS/2端子が存在していたことに今更ながら気付いた。一応第8・9世代対応のマザーでそこそこ新 …

no image

html5でcanvas要素の下部に7pxのマージンが発生してしまう件

htmlのレンダリングに関することで、canvas要素を3つほど連続して配置したときに謎の空白が下部に発生するのを確認した。意味がわからないのは、<!DOCTYPE html> を文書先頭 …