今回の記事はSwiftのiOSアプリ開発で課金処理を簡易的に行える「SwiftyStoreKit」の使い方をご紹介します。「StoreKit」はコード量が多く難しい為「SwiftyStoreKit」を使って簡単にアプリ課金処理を実装していきます。是非参考にしてみてください。
「SwiftyStoreKit」の使い方 〜全体の流れ〜
「SwiftyStoreKit」の使い方の流れは下記です。
- アプリで購入処理を行うテスト環境の作成(Sandboxへのテストユーザーの登録)
- 配信するアプリに課金用のアイテムを配置
- アプリから購入アイテムの情報を取得する
- アプリ内で固有のIDに対して購入(消耗系・サブスク系)
①②が「AppleStoreConnect」、③④はアプリ実装の内容です。
アプリで購入処理を行うテスト環境の作成
「StoreKit」の場合は手順が多いですが、「SwiftyStoreKit」の場合はAppleStoreConnectにテストユーザーを登録するのみで、あとはモジュールの中でテスト時のPOST通信先の変更などを行なってくれる為楽です。
AppleDevelopperへの登録とAppleStoreConnectへのアプリ登録はすでに完了していることを前提に話を進めます。もし完了していない方がいれば下記記事で手順を簡単にまとめているのでご参考にして下さい。
まずはAppleStoreConnectのユーザーを開きます。
再度メニューの「Sandbox」の「テスター」をクリックし、ページ内部の「+マーク」をクリックします。
入力フォームが表示されるので、全て入力していきましょう。メールアドレスとパスワードがテストユーザーのアップルIDとパスワードになるので、購入時に必要になります。控えておきましょう。
これでユーザーの登録は完了です。
補足として「AppleStoreConect」の「契約」に関しても無料・有料アプリ両方のステータスを「アクティブ」の下記画像のようにする必要があります。こちらも合わせて処理を行いましょう。
アプリ内課金用のアイテムを作成
まずは購入アイテムの登録を行なっていきます。
まずはAppleDevelopperからアプリのアプリ内課金アイテム情報の登録を行います。
「+マーク」をクリックするとアイテムのタイプを選択できます。
「作成」をクリックすると下記の詳細入力が必要です。
このページにある下記情報の入力が必要です。
- 参照名
- 製品ID(アプリ内からこのIDを使って購入を行う(一度登録すると消しても2度と使えなくなる))
- ローカリゼーションされた参照名(支払い時に表示される)
- 説明(支払い時に表示される)
- アプリ内課金アイテムの画像
これらを保存するとまだステータスは準備中のままです。ページ上部にサブスクリプショングループに登録するとの記述があるのでクリックしてページを遷移するとサブスクリプショングループがあれば選択・無ければ新規で作成する必要があります。
サブスクリプションを複数購入する可能性がある場合はサブスクリプションごとにグループを作成する必要があります。この登録が完了すればアイテムのステータスは「送信準備完了」になっているのでこれでアプリ内からテスト的に購入が可能になります。
ではアプリの中で実装を行なっていきましょう。
「SwiftyStoreKit」の使い方 〜 ソースコード 〜
基本的に公式のgithubに詳しく記載されているのでそちらを参考すると問題なく使用できると思うのですが、日本語でできるだけわかりやすく記載していきますので読み比べて下さい。
まずはプロジェクト作成時から生成されている「AppDelegate.swift」に下記を追加しますこちらはおまじないのような感じでこちらに記載しておきます。
import UIKit
import SwiftyStoreKit//ここ追加
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
//追加場所///////////////////////////////////////////////////////////////
SwiftyStoreKit.completeTransactions(atomically: true) { purchases in
for purchase in purchases {
switch purchase.transaction.transactionState {
case .purchased, .restored:
if purchase.needsFinishTransaction {
SwiftyStoreKit.finishTransaction(purchase.transaction)
}
// Unlock content
case .failed, .purchasing, .deferred:
break // do nothing
default:
print("error")
}
}
}
// ////////////////////////////////////////////////////////////////////
return true
}
...以下省略
長いので追加した部分のみの記載です。こちらはアプリ立ち上げ時に一度実行されるものですが、課金アイテムがあればfor文が周り、課金アイテムの状態をコンソールに出力します。
これを応用することもできるとは思いますが、基本的に「AppDelegate.swift」をあまり汚したくはないので私は付けているだけです。
次にAppleStoreConnectに登録した課金アイテムを取得するコードです。
「SwiftyStoreKit」で課金アイテムの取得
func Getproducts(puroduct:String) {
SwiftyStoreKit.retrieveProductsInfo([puroduct]) { result in
if let product = result.retrievedProducts.first {
//購入アイテムのプロダクションID(登録した製品IDになっている)
print(product.productIdentifier)
//購入アイテムの参照名(登録した参照名になっている)
print(product.localizedTitle)
//購入アイテムの金額(登録した金額になっている)
print(product.price)
} else if let invalidProductId = result.invalidProductIDs.first {
print("Invalid product identifier: \(invalidProductId)")
} else {
print("Error")
}
}
}
関数の引数には先ほどAppleStoreConnectに登録したプロダクションIDを入れます。「product」にはいくつもの情報が入っているので他にも使える情報があるかもしれません。「.」を打って何があるか興味がある方は確認してみて下さい。
次に課金アイテムを購入する場合のコードです。
「SwiftyStoreKit」で課金アイテムの購入
func Purcharge(purchaseitem:String){
SwiftyStoreKit.purchaseProduct(purchaseitem, quantity: 1, atomically: true) { result in
switch result {
//成功
case .success(let purchase):
break
//失敗
case .error:
break
}
}
}
こちらも引数に登録した課金アイテムのプロダクションIDを入力します。購入が成功したかどうかを判別できます。
こちらを実際に実装すると一番初めはSandbox環境用のアップルIDとパスワードを求められるので、先ほど作成したテストユーザーでログインします。こちら一度登録したユーザの変更も可能なのでその方法はこの記事の一番下の関連記事にリンク用意しておきます。
これで購入が完了です。最後にサブスクリプションの期限が切れていないかどうかの確認を行います。
「SwiftyStoreKit」でサブスクリプションの状態確認
func Getsubusuku(productId:String){
//アプリ固有のsharesecretセット(このままだとエラー記事下参照)
let appleValidator = AppleReceiptValidator(service: .production, sharedSecret: sharesecret)
SwiftyStoreKit.verifyReceipt(using: appleValidator) { result in
switch result {
case .success(let receipt):
// Verify the purchase of a Subscription
let purchaseResult = SwiftyStoreKit.verifySubscription(
ofType: .autoRenewable, // or .nonRenewing (see below)
productId: productId,
inReceipt: receipt)
switch purchaseResult {
case .purchased(let expiryDate):
print("\(productId) の期限は「 \(expiryDate)」")
print("購入済み")
case .expired(let expiryDate):
expiredflag = true
if (productId == sabusuku[sabusuku.count-1]) {
maesyoriflag = true
}
print("\(productId) の期限は「 \(expiryDate)」")
print("期限切れ")
case .notPurchased:
print("未購入 \(productId)")
}
case .error(let error):
print("エラー: \(error)")
}
}
}
}
サブスクリプションが絡むと少し大変ですが、上記の関数で状態を確認できます。少し変えてくるまで時間がかかります。関数の引数に先ほど登録した課金アイテムのプロダクションIDを入力します。「sharesecret」にはアプリ固有の共有シークレットをセットします。
共有シークレットの取得方法がわからない方は下記記事を参考にして下さい。
「SwiftyStoreKit」verifyReceiptの「your-shared-secret」とは?
以上で今回の記事は終了です。可能な限りわかりやすく解説できていると思うので是非参考にしていただければ幸いです。他にもiOSアプリに広告をつける方法や、アプリ配信手順に関しても記事にしているので興味があればそちらも参考にしてみて下さい。
コメント