質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.09%

ios アプリ内課金されたことをローカルに保存する方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,073

Ryo1012

score 11

質問させていただきます。
iosにて消耗型のプロダクトを用いたアプリ内課金のアプリを開発しています。

■ご教示いただきたいこと
課金されたことをローカルに保存する方法

■詳細
Appleのドキュメントによれば、消耗型のプロダクトを課金された場合は、課金したユーザーが利用する全ての端末でサービスを提供できるようにする必要があると書いてありました。
そのため以下の方法でアプリを作成しました。

1.アプリ内でユーザーにユーザー登録していただく。
2.ログイン後、「課金」ボタンを表示
3.課金後コンテンツを表示可能にする
4.また、課金されたらユーザーが登録したアドレスに紐づけて課金されたことを独自サーバーのDBに保存
5.別端末でログインされた場合も、独自サーバーの情報に課金されたことが記録されていた場合はコンテンツを表示可能にする。
※コンテンツは複数あるため、課金は複数回あります。

以上のような内容でアプリを開発し審査に通したところ、Appleにリジェクトされてしまいました。
理由は

・課金のためにユーザー登録を必須にしてはならない。
・あくまでユーザーの任意でユーザー登録を行い複数端末で利用できるようにする。
・そのため、ユーザー登録をしなくても課金できる必要がある。
・その場合サーバーではなくローカルに課金されたことを保存しておく必要がある。

とのことでした。
今までサーバーで課金されたことを管理することばかりに目を向けていたため、ローカルで課金されたことを保存する方法が分からなくて悩んでいます。
UserDefaultなどいくつか方法があることは分かったのですが、どの方法が一番いいのか分からない状態です。
このような情報をiosのローカルに保存する最適な方法をご教示していただけたらと思います。

■保存したい情報
課金したコンテンツのコンテンツIDと購入した日付(複数)

■環境
Xcode7.3 swift2.2

よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

Appleのドキュメントによれば、消耗型のプロダクトを課金された場合は、課金したユーザーが利用する全ての端末でサービスを提供できるようにする必要があると書いてありました。 

いや、これは定期購読型の課金の話でいわゆる「リストア」と呼ばれる処理です。消耗型プロダクトはアカウントでなくデバイス単位での管理となります。

消耗型プロダクトにおいて、購入履歴の管理にローカル保存が必要なのは、アップル側でレシートに履歴を残さないからです(定期型だとレシートにアペンドされていく)。自前管理の際、一番確実なのはUUIDとトランザクション情報を都度自サバのDBに書くことでしょうか。ローカルストレージのみだと再インスールで消えちゃいますし。

ちなみにあちらのリジェクト理由ですが言いたいことはおそらくこうです。。

・課金のためにユーザー登録を必須にしてはならない。 
→消耗型はアカウント管理する必要がないよね。
・あくまでユーザーの任意でユーザー登録を行い複数端末で利用できるようにする。 
→会員登録が必要なら消耗型でなく購読型にしてリストア可能なコンテンツにしてね。
・そのため、ユーザー登録をしなくても課金できる必要がある。 
→消耗型は端末単位での購入なのでユーザ登録いらないよね。
・その場合サーバーではなくローカルに課金されたことを保存しておく必要がある。
→アップルでは消耗型の購入履歴はレシートに残らないからトランザクションごとに自分でやってね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/27 16:10

    ご回答ありがとうございます。
    大変勉強になりました。

    リストアの件、ものすごく勘違いしておりました。
    ドキュメントに消耗型の場合のリストア方法が「独自でサーバを用意して実装」と記載があったため、勝手に実装必須と思っていました。

    独自サーバーのDBで端末識別ID(UUID等)を保存した方が修正が簡単なためこの方法で進めていきたいと思います。
    DBには

    ・端末識別ID(UUID等)
    ・コンテンツID
    ・購入日付

    等を保存しようと思います。

    ここでUUIDについて現在調査中なのですが、もしよろしければ質問させてください。

    [[NSUUID UUID] UUIDString]

    で取得したUUIDはメソッドを呼び出す度に変更されてしまうため

    [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString]
    [[UIDevice currentDevice].identifierForVendor UUIDString]

    を利用しようと思うのですが、一般的には何を使うのがいいのでしょうか。

    ※アプリを再インストールされた場合の課金情報は必ずしも引き継ぐ必要はありません。


    よろしくお願い致します。

    キャンセル

  • 2016/10/27 16:45

    本当の意味での機種識別IDは現在とれないですね。一般的かどうかは別として、ユニーク性の高いのはIDFAですが、ご存知だとは思いますが広告以外に使うとリジェクトされます(広告が出てればたぶんバレませんが)。

    キャンセル

  • 2016/10/29 12:07

    アップルに電話するとやはり消耗型でも複数間のデバイスで購入済のコンテンツを表示させる機能は必須と言われてしまいました。
    デバイス単位で課金ができることが前提で、ユーザーの任意で他の端末でも購入済み情報を引き継げる仕組みが必要とのことです。
    よくゲームである一度コインを手に入れるために課金して、そのコインを使ってアイテムを購入できるアプリ等であれば、

    ・使ったらなくなるコイン:他端末に引き継ぐ必要はない
    ・購入後なくならないアイテム:他端末に引き継ぐ必要がある

    そうです。
    今回の場合は一度購入すると永久的にコンテンツを表示する機能なので、後者のパターンに当てはまるそうです。
    色々と複雑ですね。
    これに当たりユーザー登録⇒ログイン⇒複数端末間で情報を共有する機能でもいいと言われたのですが、引き継ぎコードを発行して他の端末でも情報を引き継ぐ仕様でもOKと言われたのでユーザーに負担の少ない後者で進めていくことになりました。

    色々とご相談にのっていただきありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる