RORK LABEN
MAX — Rork MaxはWeb上でSwiftアプリを開発・公開できる初のビルダーをうたい、Xcode不要・2クリックでApp Store公開まで到達できますAPPLE — iPhone・iPad・Apple Watch・Apple TV・Vision Pro向けのネイティブSwiftアプリを生成しますEXPO — 通常版はReact Native(Expo)基盤。自然言語の要件記述からネイティブiOS/Androidアプリを生成しますFUNDING — Rorkがa16zから$2.8Mを調達。AIノーコードのモバイル領域で存在感を強めていますPRICE — 無料で開始でき、有料プランは$25/月から。個人開発者が試しやすい価格帯ですWWDC — WWDC 2026でApple Intelligenceが前進。ネイティブ機能の価値が上がり、ノーコード生成アプリのAI統合の選択肢も広がりますMAX — Rork MaxはWeb上でSwiftアプリを開発・公開できる初のビルダーをうたい、Xcode不要・2クリックでApp Store公開まで到達できますAPPLE — iPhone・iPad・Apple Watch・Apple TV・Vision Pro向けのネイティブSwiftアプリを生成しますEXPO — 通常版はReact Native(Expo)基盤。自然言語の要件記述からネイティブiOS/Androidアプリを生成しますFUNDING — Rorkがa16zから$2.8Mを調達。AIノーコードのモバイル領域で存在感を強めていますPRICE — 無料で開始でき、有料プランは$25/月から。個人開発者が試しやすい価格帯ですWWDC — WWDC 2026でApple Intelligenceが前進。ネイティブ機能の価値が上がり、ノーコード生成アプリのAI統合の選択肢も広がります
記事一覧/ビジネス
ビジネス/2026-06-14上級

StoreKit 2 のサブスクをサーバー側で検証する — 端末を信じない権利付与の設計

サブスクの「課金したのに機能が開かない」「解約後も使えてしまう」を防ぐには、端末の判定を信じず、サーバー側で権利を確定させる設計が要ります。StoreKit 2 の署名付きトランザクション、App Store Server API での検証、App Store Server Notifications V2 による状態同期まで、個人開発の収益化で詰めた実装を共有します。

StoreKit 212サブスクリプション57収益化57App Store Server API3Rork394iOS76

プレミアム記事

個人開発でサブスク課金を入れたとき、最初に作ったのは「購入が成功したら端末側で Pro フラグを立てる」という素朴な実装でした。これは課金直後はうまく動きますが、解約・返金・別端末でのログインといった現実の運用に入った途端に崩れます。端末の中だけで権利を判断していると、解約したユーザーの端末がいつまでも「Pro です」と言い張ってしまうからです。

収益に直結する部分だからこそ、判定の正本はサーバーに置く。これが StoreKit 2 時代のサブスク設計の出発点でした。AdMob の広告収益と違い、サブスクは「いま権利があるか」を毎回正しく言い当てる必要があります。ここを甘く作ると、課金率を上げても解約後の使い逃げで実質 LTV が削られます。

なぜ端末の判定を信じないのか

StoreKit 2 は端末側で Transaction.currentEntitlements を見れば、いまの権利を取得できます。手元で完結するので手軽ですが、これだけに頼ると2つの穴が空きます。

ひとつは、別端末や再インストール時の同期です。ユーザーが機種変更すると、新しい端末は購入履歴を復元するまで権利を知りません。もうひとつは、改ざんとオフライン継続です。端末のローカルフラグだけで開錠していると、解約後もアプリを開かずにいれば権利が残り続けます。

サーバーに正本を置けば、どの端末からでも同じ答えを返せますし、解約・返金をサーバー主導で即座に反映できます。私は収益に関わる権利判定は、必ずサーバーの応答を最終判断とする方針にしています。

署名付きトランザクションをサーバーへ送る

StoreKit 2 のトランザクションは JWS(JSON Web Signature)で署名されています。端末はこの署名済みの文字列をそのままサーバーへ送り、サーバーは Apple の公開鍵で署名を検証してから中身を信用します。生の購入情報を JSON で送って信じるのではなく、署名を検証する点が肝心です。

import StoreKit
 
func syncPurchases() async {
    for await result in Transaction.currentEntitlements {
        guard case .verified(let transaction) = result else { continue }
        // jwsRepresentation は署名付き文字列。これをそのままサーバーへ
        await postToServer(signedTransaction: result.jwsRepresentation,
                           productID: transaction.productID)
    }
}
 
func purchase(_ product: Product) async throws {
    let result = try await product.purchase()
    if case .success(let verification) = result,
       case .verified(let transaction) = verification {
        await postToServer(signedTransaction: verification.jwsRepresentation,
                           productID: transaction.productID)
        await transaction.finish()
    }
}

ここで transaction.finish() を呼ぶのは、サーバーへ送って権利を確定させた後にしてください。送信前に finish すると、ネットワークが落ちたときにトランザクションが失われ、ユーザーは課金したのに権利が付かない状態になります。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
署名付きトランザクションをサーバーで検証し、ユーザーに権利を付与する一連の流れを、動く Swift と Node.js の実コードで追える
App Store Server Notifications V2 を受けて DID_RENEW・EXPIRED・REFUND を権利状態へ反映する、状態同期テーブルの設計を持ち帰れる
「解約後も Pro が開く」「返金されたのに使える」という収益にも信頼にも響く2つの抜け穴の塞ぎ方がわかる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

ビジネス2026-05-02
Rorkでサブスク売上を最大化する Subscription Group とイントロオファーの実装パターン
Rorkで作ったアプリの月額サブスクで「初月解約率が高い」と悩んでいる方向けに、Subscription Group の階層化設計と3種類のイントロオファーを使い分けるための実装テンプレートをまとめます。
ビジネス2026-06-13
サブスクの値上げで既存ユーザーの価格をどうするか — App Store と Google Play の価格改定実務
サブスク値上げの最初の関門は既存購読者の扱いです。増収になる追加解約率の上限の試算、App Store と Google Play の同意フローの違い、PRICE_INCREASE・EXPIRED 通知の処理、改定後のコホート計測までを個人開発の視点で整理します。
ビジネス2026-05-05
Rork Max × RevenueCat Paywalls SDK で変わるペイウォール開発 — A/B テスト・リモート更新・コンバージョン改善の実装ガイド
RevenueCat Paywalls SDK を Rork Max アプリに統合し、審査なしでペイウォールをリモート更新・A/B テストする完全実装ガイド。コンバージョン率を改善するデザイン原則と実践コードを徹底解説します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →