
StoreKit 2 を使ってアプリ内課金を実装する際、Product.purchase() の戻り値として登場する VerificationResult<Transaction>。
初心者にとっては「この <Transaction> の意味って何?」「どうやって使うの?」と戸惑う部分でもあります。
この記事では、VerificationResult の基本的な構造や種類、そして 〈Transaction〉 の意味(ジェネリクス)までを、わかりやすく丁寧に解説します。
VerificationResult とは?
VerificationResult<Transaction> は、App Store から返ってきた購入情報(Transaction)が、Appleの署名により正当であるかを示す結果を表す型です。
購入データがAppleによって正しく署名されているかどうかを示します。
Swiftではこのような仕組みを 関連値付きenum を使って表現しています。
enum の定義(内部イメージ)
|
1 2 3 4 5 |
enum VerificationResult<Value> { case unverified(Value, VerificationError) case verified(Value) } |
このenumには、2つのケースがあります。
.unverified:検証に失敗した場合。関連値として 「元の値」+「エラー」 を持つ.verified:検証に成功した場合。関連値として 「元の値」 を持つ
| ケース名 | 説明 | 取るべき対応 |
|---|---|---|
.unverified(let value, let error) |
検証に失敗(改ざん、不正な署名など) | 処理せずログ出力のみ |
.verified(let value) |
Appleの署名により検証に成功した値 | 正常な購入として扱う |
この構造によって、アプリ側で購入の正当性をきちんと確認することができるようになっています。
ここで使われているのが「関連値(associated value)」です。
関連値を使うことで、単に「成功/失敗」といった状態だけでなく、その状態に応じた具体的なデータ(成功なら取引情報、失敗ならエラー情報付き取引情報)をセットで持てるようになっています。
ジェネリクスとの組み合わせ
VerificationResult<Value> は総称型(ジェネリクス)になっており、扱うデータ型を自由に差し替えることができます。
課金の場合は Transaction が使われるので、VerificationResult<Transaction> という形になります。
つまりこれは:
- Transaction型の値が検証済みかどうか
- その結果に応じて、値やエラーを安全に取り出せる
という意味を持っています。
具体的な使用例
購入処理の具体的なコード例を見てみましょう。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
let result = try await product.purchase() switch result { case .success(let verificationResult): switch verificationResult { case .verified(let transaction): print("購入成功: \(transaction.productID)") await transaction.finish() case .unverified(_, let error): print("検証失敗: \(error)") } default: break } |
このコードでは、product.purchase() を呼び出すと PurchaseResult が返ってきます。
その中に .success(...) が含まれていた場合でも、さらに中身の VerificationResult<Transaction> をチェックする必要があります。
-
.verified(let transaction)の場合
Appleの署名により検証に成功した正当な購入です。このときだけ購入を有効として扱い、transaction.finish()を呼んで処理を完了させます。 -
.unverified(_, let error)の場合
改ざんや不正な署名などによって検証に失敗したケースです。購入としては扱わず、ログを残すなどの対応にとどめます。
このように、PurchaseResult.success(...) が返ってきても即座に「購入成功」とは限りません。
必ず VerificationResult<Transaction> をチェックし、.verified の場合だけ処理を進めるのが安全な実装方法です。
まとめ
StoreKit 2 を正しく、安全に使うためには、この VerificationResult<Transaction> の構造と意味を理解しておくことが非常に重要です。
| 項目 | 説明 |
|---|---|
| VerificationResult とは | Appleの署名検証結果を示すenum型 |
| verified | 検証に成功した場合(機能をアンロックしてOK) |
| unverified | 検証に失敗した場合(処理はスキップ) |
<Transaction> の意味 |
enumが扱う中身の型を指定するジェネリクス構文 |
| 活用場面 | 課金の安全性確認、サブスクリプション状態の検証など |
検証の流れをしっかり把握して、より安全な課金処理をアプリに組み込みましょう。
併せて関連値を理解しておくと、VerificationResult<Transaction>の理解がグッと深まるはずです!

