RevenueCat vs Adapty
iOS・Android向けサブスクリプション管理SaaSを比較 — RevenueCat(市場のリーダー)とAdapty(ペイウォール・A/Bテストに強み)。機能の網羅性、料金、導入のしやすさを検証。
マルチストア対応のサブスク基盤をSDK+バックエンドとしてレンタルする
Appleのファーストパーティフレームワークだが、サーバー側は自分で書く
閾値は明確だ。月間トラッキング収益(MTR)が2,500ドル未満ならRevenueCatは事実上無料——そこで比較すべきは1%ではなくゼロコストであり、自前基盤は常にそれより高くつく。App Storeのみで販売する単一製品かつ個人情報保護に敏感な製品では、純粋なStoreKit 2も擁護できる。マルチストアの場合、RTDNの18種類の通知タイプとApp Store V2通知を並行して同期させ続けるのはコストがかさむ。おおまかな経験則として、MTRが50,000ドル以上になったら判断を再検討すべきだ。
| カテゴリー | RevenueCat | StoreKit 2 (kendi altyapın) |
|---|---|---|
| パフォーマンス | 8/10 | 8/10 |
| 学習のしやすさ | 8/10 | 5/10 |
| エコシステム | 8/10 | 6/10 |
| コミュニティ | 6/10 | 5/10 |
| 求人市場 | 5/10 | 6/10 |
| 将来性 | 8/10 | 8/10 |
// RevenueCat - エンタイトルメント確認と購入(iOS SDK 5.x)
import RevenueCat
func configureRevenueCat() {
Purchases.logLevel = .debug
Purchases.configure(withAPIKey: "appl_XXXXXXXXXXXX")
}
func unlockProIfEntitled() async {
do {
let customerInfo = try await Purchases.shared.customerInfo()
if customerInfo.entitlements["pro"]?.isActive == true {
print("Pro エンタイトルメント有効")
}
} catch {
print("customerInfo エラー: \(error)")
}
}
func purchasePro() async {
do {
let offerings = try await Purchases.shared.offerings()
guard let package = offerings.current?.availablePackages.first else { return }
let result = try await Purchases.shared.purchase(package: package)
if result.customerInfo.entitlements["pro"]?.isActive == true {
print("購入成功、Pro 有効")
}
} catch {
print("購入エラー: \(error)")
}
}// StoreKit 2 - トランザクションの監視とエンタイトルメント確認(自前基盤)
import StoreKit
func listenForTransactions() -> Task<Void, Error> {
Task.detached {
for await result in Transaction.updates {
switch result {
case .verified(let transaction):
await grantEntitlement(for: transaction)
await transaction.finish()
case .unverified(_, let error):
print("検証失敗: \(error)")
}
}
}
}
func checkCurrentEntitlement() async -> Bool {
for await result in Transaction.currentEntitlements {
guard case .verified(let transaction) = result else { continue }
if transaction.productID == "pro_monthly" {
return true
}
}
return false
}
func purchase(product: Product) async throws {
let result = try await product.purchase()
switch result {
case .success(let verification):
guard case .verified(let transaction) = verification else { return }
await grantEntitlement(for: transaction)
await transaction.finish()
case .userCancelled, .pending:
break
@unknown default:
break
}
}
func grantEntitlement(for transaction: Transaction) async {
// サーバーにJWSを送信し、App Store Server APIでクロス検証する
}閾値は明確だ。月間トラッキング収益(MTR)が2,500ドル未満ならRevenueCatは事実上無料——そこで比較すべきは1%ではなくゼロコストであり、自前基盤は常にそれより高くつく。App Storeのみで販売する単一製品かつ個人情報保護に敏感な製品では、純粋なStoreKit 2も擁護できる。マルチストアの場合、RTDNの18種類の通知タイプとApp Store V2通知を並行して同期させ続けるのはコストがかさむ。おおまかな経験則として、MTRが50,000ドル以上になったら判断を再検討すべきだ。
無料相談を受ける月間トラッキング収益(MTR)が2,500ドル未満ならRevenueCatは事実上無料で、マルチストアのサーバー側検証、Webhook、返金管理を引き受けてくれる——この場合は概してRevenueCatが合理的だ。単一プラットフォームでシンプルな単一製品、かつ収益データを第三者に渡したくないアプリでは、純粋なStoreKit 2も擁護できる選択肢だ。マルチストアで成長中の製品では、自前基盤を書くことは通常より高くつく。