質問: 質問させていただきます。 iosにて消耗型のプロダクトを用いたアプリ内課金のアプリを開発しています。 ■ご教示いただきたいこと 課金されたことをローカルに保存する方法 ■詳細 Appleのドキュメントによれば、消耗型のプロダクトを課金された場合は、課金したユーザーが利用する全ての端末でサービスを提供できるようにする必要があると書いてありました。 そのため以下の方法でアプリを作成しました。 1.アプリ内でユーザーにユーザー登録していただく。 2.ログイン後、「課金」ボタンを表示 3.課金後コンテンツを表示可能にする 4.また、課金されたらユーザーが登録したアドレスに紐づけて課金されたことを独自サーバーのDBに保存 5.別端末でログインされた場合も、独自サーバーの情報に課金されたことが記録されていた場合はコンテンツを表示可能にする。 ※コンテンツは複数あるため、課金は複数回あります。 以上のような内容でアプリを開発し審査に通したところ、Appleにリジェクトされてしまいました。 理由は ・課金のためにユーザー登録を必須にしてはならない。 ・あくまでユーザーの任意でユーザー登録を行い複数端末で利用できるようにする。 ・そのため、ユーザー登録をしなくても課金できる必要がある。 ・その場合サーバーではなくローカルに課金されたことを保存しておく必要がある。 とのことでした。 今までサーバーで課金されたことを管理することばかりに目を向けていたため、ローカルで課金されたことを保存する方法が分からなくて悩んでいます。 UserDefaultなどいくつか方法があることは分かったのですが、どの方法が一番いいのか分からない状態です。 このような情報をiosのローカルに保存する最適な方法をご教示していただけたらと思います。 ■保存したい情報 課金したコンテンツのコンテンツIDと購入した日付(複数) ■環境 Xcode7.3 swift2.2 よろしくお願い致します。
回答: > > Appleのドキュメントによれば、消耗型のプロダクトを課金された場合は、課金したユーザーが利用する全ての端末でサービスを提供できるようにする必要があると書いてありました。 > > > いや、これは定期購読型の課金の話でいわゆる「リストア」と呼ばれる処理です。消耗型プロダクトはアカウントでなくデバイス単位での管理となります。 消耗型プロダクトにおいて、購入履歴の管理にローカル保存が必要なのは、アップル側でレシートに履歴を残さないからです(定期型だとレシートにアペンドされていく)。自前管理の際、一番確実なのはUUIDとトランザクション情報を都度自サバのDBに書くことでしょうか。ローカルストレージのみだと再インスールで消えちゃいますし。 ちなみにあちらのリジェクト理由ですが言いたいことはおそらくこうです。。 ・課金のためにユーザー登録を必須にしてはならない。 →消耗型はアカウント管理する必要がないよね。 ・あくまでユーザーの任意でユーザー登録を行い複数端末で利用できるようにする。 →会員登録が必要なら消耗型でなく購読型にしてリストア可能なコンテンツにしてね。 ・そのため、ユーザー登録をしなくても課金できる必要がある。 →消耗型は端末単位での購入なのでユーザ登録いらないよね。 ・その場合サーバーではなくローカルに課金されたことを保存しておく必要がある。 →アップルでは消耗型の購入履歴はレシートに残らないからトランザクションごとに自分でやってね。