Flutterでrevenue catを消耗型アイテム利用で導入した感想

こんにちは、株式会社Pentagonでアプリ開発をしている石渡港です。
https://pentagon.tokyo

今回はFlutterでrevenue catを利用した感想をまとめました。
その結果、Androidの課金テストが大変でしたが、iOSの課金設定が簡単にできることがわかりました。

【この記事を読むメリット】

  • revenue catの料金プランについて理解できます。
  • revenue catの実装手順がわかります。
  • revenue catの実装で時間がかかった点がわかります。

【こんな方に参考にしていただきたい】

  • Flutterでrevenue catを導入したい人。

【調査の動機】
今後開発するプロジェクトで、Flutterでアプリ内課金を導入する必要がありました。そこで、導入コストを減らすために、SaaSであるrevenue catを調査しました。

【調査結果】

  • Flutter側の呼び出しは簡単でした。
  • iOSの課金設定は簡単でした。
  • Androidの課金をテストする際、いくつか事前準備をする必要があります。(新規アプリに関して)
目次

【結論】

今回revenue catを利用して気づいた点を3つまとめました。

料金プラン
revenue catの実装手順
実装において時間のかかった点

一つずつ解説していきます。

1. revenue catの料金プランについて

プランは以下の4つがあります。

料金タイプ 支払い 上限 特徴 コメント
Free 売上の0% $10k 基本的な課金対応が揃っています。 個人アプリでしたらこちらが良さそうです。
Starter 売上の0.8% $10k 分析、チーム開発、Slack連携などの対応ができます。 スタートしたてで、チームで開発するならばこちらが良さそうです。
Pro 売上の1.2% $10k レポート、エクスポート、更に大きいチーム開発などの対応ができます。 スタートしたてで、チームで開発するならばこちらが良さそうです。
Enterprise 応相談 なし さらなる細かい対応ができます。 かなり細かく対応したい場合はこちらが良さそうです。

https://i.gyazo.com/547a14033cc54d82a6757e8fc932c9d4.png

今回は、Starterで実装しました。

2. revenue catの実装手順

登録はこちらから

https://i.gyazo.com/5f802f54cf254e40ba31624699b3f82e.png

設定方法

  1. 新規プロジェクトの登録

    https://i.gyazo.com/c27e63a9ed6e5fe627abf37d75af5fa8.jpg

    Create New Projectから登録します。

    https://i.gyazo.com/b938bfc0aba650ddee8d1924f4f41e82.jpg

    こちらにプロジェクト名を記入して、Create Projectを押します。

    https://i.gyazo.com/2eecd62187dd459fdf82084f7e61bc8b.png

    今回はFlutterで両プラットフォームに対応するため、iOS・Android両方登録を行います。
    まずは、iOSから登録を行います。

    https://i.gyazo.com/a8b5a2f9dc814fb7b96043cb767db855.png

    App name:とApp Bundle ID:とApp Store Connect App-Specific Shared Secret:を登録します。Secretはこちらを参考に取得してください。

    https://i.gyazo.com/92ad07b647981a5cfae2fe58344a578b.png

    次にAndroidの登録を行います。

    https://i.gyazo.com/bf0f110c6365dc65aa6aaebefe7f5d0d.png

    App name:とGoogle Play package:とService Account credentials JSON:を登録します。JSONはこちらを参考に取得してください。

  2. 課金アイテムの設定

    https://i.gyazo.com/c8040b6b5dd7352d80c935ab566bad29.png

    iOSのProductから登録を行います。
    https://i.gyazo.com/35863333230c49b96453d4c69fe90ae9.jpg

    AppはAppStoreのものを選択します。
    https://i.gyazo.com/2f17542146608f8daa6796981ee4c3c0.png

    こちらの製品IDをIdentifierへ記入します。

    https://i.gyazo.com/1de4ba9bd2486a7db8e568f63491fef8.png

    Identifierは任意のもので良いですがわかりやすいものを指定します。

    https://i.gyazo.com/99c2937a14feddb94e24fd1d48df7300.png

    Packageを選択します。

    https://i.gyazo.com/053bc34753c22702f8abd87de510e55c.png

    Packageを新規追加します。

    https://i.gyazo.com/c9fee9f7efeeee355823653264f49f56.png

    販売期間を選びます。Annualで通年利用となります。

    https://i.gyazo.com/808358214f7955c66f83e3edf39e5291.png

    Productを割り当てます。

    https://i.gyazo.com/a7273f72d42455bdc50f271ad252e246.png

    前工程で作成したProductを割り当てます。
    https://i.gyazo.com/b39e488fa7441e2194e367e7ea90ee96.png

    次にElementsを作成します。

    https://i.gyazo.com/3795ac3f85908500cb90c5751f93be82.png

    Identifierは任意のもので良いですがわかりやすいものを指定します。

    https://i.gyazo.com/b2f4ebe669dbed7c0105a461a15182df.png

    Productを割り当てます。
    https://i.gyazo.com/d5593a2a8131ebea8f3f29529d9f3942.png

    Attachを選択します。
    https://i.gyazo.com/c581e7974dd0f8725e9c99d48a65cc66.png

    前工程で作成したProductを割り当てます。

    AndroidはProductをAndroid用に作成して、ElementsとPackageそれぞれのProductにAttachすることで利用できます。

実装方法

https://i.gyazo.com/6a7523d7667145ce3dd539c9f72fad14.png

APIKeyを利用する必要があります。

iOSとAndroidそれぞれのKeyをコピーします。

実装コード

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:purchases_flutter/purchases_flutter.dart';

class PlayScreen extends StatefulWidget {
  const PlayScreen({Key? key}) : super(key: key);

  @override
  _PlayScreenState createState() => _PlayScreenState();
}

class _PlayScreenState extends State<PlayScreen> {
  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    Future(() async {
      await initPlatformState();
    });
  }

  Future<void> initPlatformState() async {
    final revenueCatAPIKey = Platform.isAndroid
        ? 'android api key'
        : 'ios api key';
    try {
      await Purchases.setDebugLogsEnabled(kDebugMode);
      await Purchases.setup(revenueCatAPIKey);
    } on Exception catch (e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Center(
          child: MaterialButton(
            onPressed: () async {
              try {
                final isSuccess = await purchase();
                if (!isSuccess) {
                  print('失敗');
                  return;
                }
                print('成功');
              } on PlatformException catch (e) {
                print(e);
              }
            },
            child: const Text('購入'),
          ),
        ),
      ),
    );
  }

    Future<bool> purchase() async {
    final offerings = await Purchases.getOfferings();
    final offering = offerings.all[今回Offeringに設定したIdentifier];
    if (offering == null) {
      return false;
    }
    final package = offering.annual; // 選択した期間
    if (package == null) {
      return false;
    }
    final purchaserDetail = await Purchases.purchasePackage(package); // こちらで購入処理が走る
    final isSuccess = purchaserDetail.entitlements.all[今回Elementsに設定したIdentifier]!.isActive;
    return isSuccess;
  }
}

参考はこちら

3. revenue catの実装で時間がかかった点

  • Androidのテスト開始までに時間がかかりました。
    • 理由としては、Androidの課金対応に慣れていないのもありましたが、クローズドテストをリリースするまで、revenue catが利用できないからです。
      正しく設定していても、Offeringが空で取得されます。
  • AndroidのJSON取得が権限の問題で行えませんでした。
    • GCPの権限の問題かJSON取得までの設定が行えず、管理者に対応してもらいました。
  • iOSの課金設定のトラップにかかってしまいました。
    • iOSの課金アイテムが送信準備完了となっておらず、対応に時間がかかってしまいました。こちらが参考になりました。
  • 開発時、参考コードをもとに実装したが、機能しませんでした。
    • 各項目の例はありますが、今回のようなアプリの対応用のソースコードは存在していなかったと思います。

【まとめ】

revenue catの料金プランと特徴、またiOS・Androidの実装方法・設定方法と詰まった点がわかりました。
revenue catを利用することでサーバを用意せずに、簡単に課金システムを組み上げられます。今後も課金機能があるアプリに関しては、revenue catを利用していこうと思います。

採用情報はこちら
目次