AppSeedのアプリ開発ブログ

アプリ開発会社AppSeed(アップシード)開発担当のブログです。iOS、Android、Unity、Cocos2d-xなどアプリ開発関連のTipsや備忘録、アプリ開発に役立つ情報を発信します。

【Unity】CodelessIAPは結構罠が多いから自分でスクリプト書いた方が確実で速いと思うよ

最近Unityでアプリ内課金を実装するために「CodelessIAP」を使ってみました。

簡単に実装できそうということで試してみましたが、結構罠があるので注意が必要そうです。

今回はUnityのCodelessIAPでアプリ内課金を実装した感想、つまづきポイントをまとめておこうと思います。

 

UnityのCodelessIAPについて

まず、UnityのCodelessIAPがどのようなものかというと、

Codeless IAP は、Unity アプリケーションでアプリ内課金 (IAP) を実装する最も簡易な方法です。

docs.unity3d.com

Unityのアプリ内課金を簡単に実装できる仕組み・サービスです。

「CodelessIAP」なので、コードをほとんど書かないでアプリ内課金を実装できるというのが特徴です。

僕自身、iOSAndroidもアプリ内課金を実装したことはありますが、アプリ内課金って結構ややこしいし、プラットフォーム側の設定や購入処理かがちゃんとしていないと泥沼にハマる危険があるんです。

「CodelessIAP」を使えば、スクリプトをほとんど書かずにアプリ内課金を実装できそう、簡単にアプリ内課金が実装できそうだったので、試してみました。

実装方法については、上記のUnityマニュアルを見れば一通りできると思います。

 

 

iOS版は簡単に実装できたけどAndroid版でハマる...

とりあえず、「CodelessIAP」を実装して、iOS版でテストしてみたところ、驚くほど簡単にアプリ内課金の「購入処理」と「リストア処理」が実装できました。

Android版もこの調子でサクッとできるかなと思ったのですが、やっぱりハマりどころがありました。

 

Android版で初期化時にNoProductAvailableのエラー

iOS版は何の問題もなくできたのですが、Android版でテストして見た所、

IAPの初期化時にNoProductAvailableのエラーが返ってきて初期化に失敗する現象が発生しました。

Google Playストア側のアプリ内課金アイテムの登録・反映に時間がかかっているのかな?」と思ったので、1日放置してから再度試してみたのですが、同様にNoProductAvailableのエラーが返ってきます。

これは困りました。

 

CodelessIAPはAndroidのRestoreに対応していない

さらに困ったことに、Android版の方でリストアを試して見た所、こんなエラーログが表示されました。

Android is not a supported platform for the Codeless IAP restore button

どうやら、Codeless IAPはAndroidのリストアに対応していないらしいです。

個人で作るアプリだったらAndroid版ではリストア無しでもOKかと思いますが、

受託開発だとAndroidでもリストアさせる場合が多かったりするので、リストアできないと困ります。

なので、もし「NoProduct Available」のエラーが解消できたとしても、コードは書かなきゃいけなくなりました。

 

自分で初期化してみる

Codeless IAPでは、自動でIAPを自動で初期化してくれる設定があるので最初はその設定にしていたのですが、「NoProductAvailable」利用できる製品がない状態なので、下記を参考に自分で初期化して、初期化時にプロダクトを追加してみることにしました。

qiita.com

 

「The product catalog has no product with the ID ""」のエラー

自分で初期化するコードを書いて、再度購入処理をテストしたところ、今度は下記のようなエラーが出ました。

The product catalog has no product with the ID ""

2019-05-24 08:27:47.067 17585-17608/? E/Unity: Purchase failed because Purchasing was not initialized correctly

    UnityEngine.Purchasing.CodelessIAPStoreListener:InitiatePurchase(String)

    UnityEngine.Events.UnityEvent:Invoke()

    UnityEngine.EventSystems.ExecuteEvents:Execute(GameObject, BaseEventData, EventFunction`1)

    UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchPress(PointerEventData, Boolean, Boolean)

    UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchEvents()

    UnityEngine.EventSystems.StandaloneInputModule:Process()

一応、アプリ起動時の初期化処理では正常に初期化できているはずなのですが、なぜか購入処理を行う段階では、初期化が完了していないという状態になります。

そしてさらにプロダクトIDがないというエラーが出ます。

 

 

CodelessIAPをやめて全部スクリプトで実装してみる

 

謎のエラーが出てしまったのですが、CodelessIAPに関する情報をネットで調べてもあまりヒットしないので、泥沼にハマる可能性が出てきました。

 

なので、どっちみちAndroidのリストア処理でコードを書くこともあり、CodelessIAPをやめて全てスクリプトで実装してみることにしました。

(多分それが一番確実)

 

 

初期化とプロダクトリストは取得できるけどやっぱりダメ

ということで全部スクリプトで書いてみたところ、

・アプリ起動時の初期化→OK

・初期化後に取得できるプロダクトリスト→OK

・購入処理→NG(Purchase failed because Purchasing was not initialized correctly)

って感じになりました。

アプリ起動時の初期化は成功しているのに、購入処理の時点で初期化できていないから購入処理に失敗したという謎の現象....

 

 

IAPの再インポートで解決!

 

https://forum.unity.com/threads/iap-troubleshooting-remove-and-reinstall-unity-iap.511747/

だんだん泥沼化してきたので、最終手段として上記を参考にIAPを再インポート(ライブラリ削除後、再インストール)してみました。

再インストールしてみたところ、購入処理が正常に処理されるようになりました...

結局原因はなんだったんだろう...

IAPのパッケージが途中でおかしくなったか、最初のインポートの段階でAndroid版の部分がおかしい状態でインポートされてしまっていたのかもです。

 

IAPのNoProductsAvailableエラー

ちなみに、CodelessIAPを使わずに実装した場合、マニュアル通りに実装し、ストア側にも課金アイテムを正しく登録したはずなのに、IAPからNoProductsAvailableエラーが返ってくる場合がありました。

このような場合はストアのアイテム登録反映に時間がかかっている可能性が高いので1〜2日くらい時間を置いてみると良さそうです。

 

参考:

【Unity】Unity IAP の OnInitializeFailed で InitializationFailureReason.NoProductsAvailable が返ってきた - コガネブログ

 

CodelessIAPを使わずにIAPを実装する場合の注意点

 CodelessIAPを使わずにIAPを実装する場合は以下の点に注意した方が良さそう。

・IAPの初期化処理・コールバック処理は永続化したゲームオブジェクトに追加する

・Unityプロジェクト上のIAP CATALOGへの登録は不要

・IAPListenerはInstecterから追加せずにコードからオーバーライドするようにする

・ストアへの課金アイテム登録後しばらくはNoProductsAvailableエラーが出る可能性あることを念頭に置く

  

 

まとめ

今回の件をまとめると、

  • UnityのCodelessIAPは罠にハマりやすいから注意(特にAndroid
  • UnityのCodelessIAPはAndroid版のリストアが使えないなどの制限がある
  • やっぱり自分でスクリプトを書いた方が確実で早いかも
  • IAPの挙動がおかしい場合は再インポートしてみた方がいいかも

って感じでした。

 

UnityのCodelessIAPでサクッとアプリ内課金を実装するはずが、なんだかんだで2日もかかってしまった...

最初からスクリプトで実装しておけばもっと早く実装できたのになー...

「CodelessIAP」は結構癖があるので、今後Unityでアプリ内課金はスクリプトで全部実装することにします。