RubyMotionでのIn App Purchaseの実装について
RubyMotion Advent Calendar18日目はIn App Purchase(IAP)の実装についてです。とは言いつつも、自分はまだAppStoreでアプリをリリースしたことがなく、Sandbox環境での動作確認までの話をします。
まず大前提として、RubyMotionを利用していても、IAPを実装する際に利用するのはStoreKit Frameworkとなります。ですので、基本的なところは全てAppleの公式ドキュメントに準拠した実装を行うため、公式ドキュメントをしっかりと読みます。
StoreKitについて
- https://developer.apple.com/library/ios/DOCUMENTATION/NetworkingInternet/Conceptual/StoreKitGuide/StoreKitGuide.pdf
- https://developer.apple.com/jp/devcenter/ios/library/documentation/StoreKitGuide.pdf
IAPについて
また、実装方法の解説に関してはこちらの資料を読むのが分かりやすいと思います。
基本的には↑にしたがって実装すれば全く問題ないのですが、RubyMotionで開発にかかわらず、StoreKitのテスト環境に関する前提知識がないと、動作しない場合の原因が全く分からず、自分が躓いたポイントがあったので紹介したいと思います。
躓きポイント
- Bundle IDを設定してない
RubyMotionでは、Info.plistファイルは存在せず、そのような設定などは全てRakefile上で管理します。
XCodeだと専用の設定画面があり、そもそもBundle IDの存在を意識できそうですが、RubyMotionからiOS開発に入った自分にとっては全く意識の外で、これが原因でStore Kitのサンプルコードを動かしてみて、動作しなくても原因が一切わかりませんでした。
アプリをリリースする前にIAPを実装しようとしたらこの罠に陥りやすそうです。
# -*- coding: utf-8 -*- $:.unshift("/Library/RubyMotion/lib") require 'motion/project/template/ios' begin require 'bundler' Bundler.require rescue LoadError end Motion::Project::App.setup do |app| # Use `rake config' to see complete project settings. app.name = 'motion-store-kit-sample' app.identifier = "jp.ainame.sk-sample" # <= コレ!!!!!!!!!!!!!!!! app.frameworks += ['StoreKit'] app.info_plist['UIMainStoryboardFile'] = 'Storyboard' end
- テストアカウントの概念
これはRubyMotionかどうかはあまり関係ありませんが、IAPの動作確認は実機かつ、テストアカウントでないと出来ません。
作り方自体は、同様に公式ドキュメントを参照されたいところですが、
重要:Store settingsパネルにはテストアカウントを入力しないでください。テストアカウントが無効になる可能性があります。
と書いてあるとおり、設定画面からテストアカウントのID/passは入力すべきではないので、日常利用しているメールアドレスと似たアドレスで、テストアカウントを作成していると「あっ・・・(察し)」みたいな状態になることもありました。
ちなみに、実機で動作確認する際には、RubyMotion 2.7から導入されたmotion device:console
コマンドを活用すると、アプリの状態が把握できて良いかと思われます。
rubygems
最後に、ちょっとしたgemの紹介。 StoreKitのwrapperとしてHeluというgemがあり、かなり薄いので自分で一からコードを書いて、typoのせいで泣いたりするよりは良い(typoで泣くのはRubyMotionあるあるだと思います。)、ということがあります。なので、IAPを気軽に実装するためのお試しには良いかと思います。
- helu
- heluを使ったサンプルアプリ
どうでしたでしょうか。Rakefileにidentifierを設定するのは当たり前かもしれませんが、何も前提知識がない状態にいきなり記述するのは難しく、何日も悩んでしまったため、こうしてAdvent Calendarとしてブログ記事にしたためておきました。
以上RubyMotion AdventCalendar18日目でした!