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

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

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

4000閲覧

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

Ryo1012

総合スコア13

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

1クリップ

投稿2016/10/27 05:15

編集2016/10/27 05:18

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

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

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

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

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

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

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

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

■環境
Xcode7.3 swift2.2

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

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

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

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

投稿2016/10/27 05:52

編集2016/10/27 05:56
fromageblanc

総合スコア2724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryo1012

2016/10/27 07:10

ご回答ありがとうございます。 大変勉強になりました。 リストアの件、ものすごく勘違いしておりました。 ドキュメントに消耗型の場合のリストア方法が「独自でサーバを用意して実装」と記載があったため、勝手に実装必須と思っていました。 独自サーバーのDBで端末識別ID(UUID等)を保存した方が修正が簡単なためこの方法で進めていきたいと思います。 DBには ・端末識別ID(UUID等) ・コンテンツID ・購入日付 等を保存しようと思います。 ここでUUIDについて現在調査中なのですが、もしよろしければ質問させてください。 [[NSUUID UUID] UUIDString] で取得したUUIDはメソッドを呼び出す度に変更されてしまうため [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString] [[UIDevice currentDevice].identifierForVendor UUIDString] を利用しようと思うのですが、一般的には何を使うのがいいのでしょうか。 ※アプリを再インストールされた場合の課金情報は必ずしも引き継ぐ必要はありません。 よろしくお願い致します。
fromageblanc

2016/10/27 07:45

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

2016/10/29 03:07

アップルに電話するとやはり消耗型でも複数間のデバイスで購入済のコンテンツを表示させる機能は必須と言われてしまいました。 デバイス単位で課金ができることが前提で、ユーザーの任意で他の端末でも購入済み情報を引き継げる仕組みが必要とのことです。 よくゲームである一度コインを手に入れるために課金して、そのコインを使ってアイテムを購入できるアプリ等であれば、 ・使ったらなくなるコイン:他端末に引き継ぐ必要はない ・購入後なくならないアイテム:他端末に引き継ぐ必要がある そうです。 今回の場合は一度購入すると永久的にコンテンツを表示する機能なので、後者のパターンに当てはまるそうです。 色々と複雑ですね。 これに当たりユーザー登録⇒ログイン⇒複数端末間で情報を共有する機能でもいいと言われたのですが、引き継ぎコードを発行して他の端末でも情報を引き継ぐ仕様でもOKと言われたのでユーザーに負担の少ない後者で進めていくことになりました。 色々とご相談にのっていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問