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

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

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

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

1347閲覧

Swift:非消耗型課金のリストアの方法について

nekogrammer

総合スコア33

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2021/12/13 16:53

編集2021/12/14 06:24

###分からないこと
iPhoneアプリで非消耗型の課金商品を考えています。
アプリ内での課金は実装出来たのですが、シミュレーター上でアプリを削除し、
再インストールしたときにリストアすることが出来ません。

###参考サイト
https://101010.fun/programming/swift4-swiftystorekit.html
の記事を参考にしながら作っています。

###想定と違う動作になってしまう箇所

Swift

1 // リストアボタンを押した時 2 @IBAction func restoreButton(_ sender: Any) { 3 // リストア処理 4 SwiftyStoreKit.restorePurchases(atomically: true) { result in 5 print("Store: リストア処理((result.restoredPurchases.count))") 6 for product in result.restoredPurchases { 7 if product.needsFinishTransaction { 8 SwiftyStoreKit.finishTransaction(product.transaction) 9 } 10 11 if product.productId == "XXXXXX" { 12 // プロダクトID1のリストア後の処理を記述する 13 print("Store: リストア後の処理") 14 UserDefaults.standard.set(true, forKey: "XXXXXX") 15 self.changeToSuperUser() 16 } 17 } 18 } 19 }

###問題の再現手順
まず、アプリ内で非消耗型の商品を購入します。
その後、リストアボタンを押すと、result.restoredPurchases.countは1となっており、
リストア後の処理とかかれたブロックを実行します。ココまでは問題ありません。
しかし、その後、iPhoneシミュレーター上でアプリを一度ホーム画面から削除し、
その後またXcodeからアプリをインストールし、起動後にリストアボタンを押すと
result.restoredPurchases.countは0となり、アンインストール前に購入した商品が
なかったことになります。(つまりリストア出来ない)
ここをリストア出来るようにしないとAppStoreの申請が通らないと思うのですが、
再インストール後にresult.restoredPurchases.countが0になるのは何故なのでしょうか?

###やりたいこと
アプリを再インストールしても、過去に購入済みであれば、
購入済みのユーザー用の処理を行いたい。

###環境・やったこと
iPhoneシミュレーターでiPhone11で実験をしています。
Configuration.storekitを追加してシミュレーター上で非消耗型アイテムを追加し、
スキームのOption設定でConfiguration.storekitを指定しています。
SwiftyStoreKitを使って実装しています。

iPhoneシミュレーター上でApple IDが設定されていないため、
過去の購入履歴がリストアできない可能性も考えて
シミュレーター上の設定で自分の本AppleIDを入力した上で
購入→アプリ削除→アプリ再インストール→リストア
を試しましたが、同じくresult.restoredPurchases.countは0で
過去の支払いが見当たらない状態です。

atomically: true
atomically: false

それぞれの設定での購入・リストアも試してみましたが、結果は同じでした。

どのサイトを見ても、同様のリストア方法のコード記述しか書いておらず、
これ以上何をトライしたらいいのか、何が原因なのか分からずに行き詰まっています。
AppStoreへの申請も、このリストア出来ない状態のため却下され続けています。

どうかお力、お知恵を貸していただけると幸いです m(_ _)m

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

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

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

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

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

guest

回答1

0

自己解決

自己解決したわけではありませんが、
コードを特に変えないまま(テスト環境でテスト出来ていない状態で)申請したら
無事承認されたので、実環境(本番AppStore)で

  1. アプリをインストールする
  2. 非消耗課金を購入する
  3. アプリをアンインストールする
  4. 再度AppStoreからインストールする
  5. リストアするSwiftyStoreKit.restorePurchases()

で、無事リストア出来ることが確認できました。
テスト環境で1〜4のフローを行うと過去の購入履歴がないためリストア出来ない状態は続いていて
テスト環境で実環境と同じ挙動をさせるためにはどうすればいいのかまだ分かりませんが、
この記述方法で実環境でリストア出来ることが分かったため、
一旦質問は「自己解決」ということで〆させて頂きます。

閲覧してくださった方、ありがとうございました。

投稿2021/12/15 03:40

nekogrammer

総合スコア33

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問