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

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

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

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

Xcode

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

Swift

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

App Store

App Storeは、Apple社が運営する、iPhone、iPod touch、iPad向けアプリケーションソフトのダウンロードサービスです。携帯電話、Wi-Fiによる無線通信に対応しており、多くのアプリケーションをダウンロード、インストールすることができます。世界中の開発者によってアプリケーションが登録されており、有償のソフトもあればフリーソフトも多く登録されています。

解決済

Xcode Apple審査のリジェクト(課金のレシート検証?)修正について

kenben
kenben

総合スコア16

iOS

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

Xcode

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

Swift

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

App Store

App Storeは、Apple社が運営する、iPhone、iPod touch、iPad向けアプリケーションソフトのダウンロードサービスです。携帯電話、Wi-Fiによる無線通信に対応しており、多くのアプリケーションをダウンロード、インストールすることができます。世界中の開発者によってアプリケーションが登録されており、有償のソフトもあればフリーソフトも多く登録されています。

1回答

0評価

0クリップ

374閲覧

投稿2020/09/26 07:38

こんにちは。
Xcodeでの課金部分でAppleの審査が通らず困っております。ご助言いただければ幸いです。
いずれもソフトは最新バージョンです。
以下引用の通りAppleより2度リジェクトされております。
なんとなくレシートがSandbox用なのにProductサーバーに送っちゃってるからどこかで条件分岐しろみたいなことだと理解しているんですが、コードのどこでどう分岐してどう記述すれば良いのかわかりません。
そもそも自身の環境では、SandboxでもTestFlight環境でもうまく動作するため、よくわからずにいます。
ネット上では課金部分のコードサンプルが少なく、ここ数日困っています。
よろしくお願いいたします。

We found that your in-app purchase products exhibited one or more bugs when reviewed on iPad running iOS 14.0 on Wi-Fi.

We were still unable to purchase your in-app purchase products because nothing occurred after tapped action buttons.

Next Steps

When validating receipts on your server, your server needs to be able to handle a production-signed app getting its receipts from Apple’s test environment. The recommended approach is for your production server to always validate receipts against the production App Store first. If validation fails with the error code "Sandbox receipt used in production," you should validate against the test environment instead.

Swift

import UIKit import SwiftyStoreKit import Firebase class BillingViewController: UIViewController { @IBOutlet weak var pointLabel: UILabel! var userPoint = Int() let userid = Auth.auth().currentUser?.uid let indicator = UIActivityIndicatorView() @IBOutlet weak var buy500PointButton: UIButton! @IBOutlet weak var buy1000PointButton: UIButton! @IBOutlet weak var buy1500PointButton: UIButton! @IBOutlet weak var buy2000PointButton: UIButton! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } func purchase(PRODUCT_ID:String,POINT:Int){ SwiftyStoreKit.purchaseProduct(PRODUCT_ID) { (result) in self.indicator.stopAnimating() // ボタンを元の状態に戻す self.changeButton() switch result{ case .success(_): // 購入成功 // 購入検証 self.verifyPurchase(PRODUCT_ID: PRODUCT_ID,POINT: POINT) break case .error(let error): // 購入失敗 print(error) break } } } func verifyPurchase(PRODUCT_ID:String,POINT:Int){ let appleValidator = AppleReceiptValidator(service: .production, sharedSecret: "aaaaaaaaaaaaaaaaaaaaa") SwiftyStoreKit.verifyReceipt(using: appleValidator) { (result) in switch result{ case .success(let receipt): let purchaseResult = SwiftyStoreKit.verifyPurchase(productId: PRODUCT_ID, inReceipt: receipt) switch purchaseResult { // リストア成功 // 購入があったときの処理を記載 case .purchased: self.updateUserPoint(point: POINT) break case .notPurchased: break } break case .error(error: let error): print(error) } } } @IBAction func buy500PointAction(_ sender: Any) { buy500PointButton.isEnabled = false buy500PointButton.backgroundColor = .gray buy500PointButton.alpha = 0.5 purchase(PRODUCT_ID: "500point",POINT: 500) } @IBAction func buy1000PointAction(_ sender: Any) { buy1000PointButton.isEnabled = false buy1000PointButton.backgroundColor = .gray buy1000PointButton.alpha = 0.5 purchase(PRODUCT_ID: "1000point",POINT: 1000) } @IBAction func buy1500PointAction(_ sender: Any) { buy1500PointButton.isEnabled = false buy1500PointButton.backgroundColor = .gray buy1500PointButton.alpha = 0.5 purchase(PRODUCT_ID: "1500point",POINT: 1500) } @IBAction func buy2000PointAction(_ sender: Any) { buy2000PointButton.isEnabled = false buy2000PointButton.backgroundColor = .gray buy2000PointButton.alpha = 0.5 purchase(PRODUCT_ID: "2000point",POINT: 2000) } func changeButton(){ buy500PointButton.isEnabled = true buy500PointButton.backgroundColor = .systemPink buy500PointButton.alpha = 1 buy1000PointButton.isEnabled = true buy1000PointButton.backgroundColor = .systemPink buy1000PointButton.alpha = 1 buy1500PointButton.isEnabled = true buy1500PointButton.backgroundColor = .systemPink buy1500PointButton.alpha = 1 buy2000PointButton.isEnabled = true buy2000PointButton.backgroundColor = .systemPink buy2000PointButton.alpha = 1 } }

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

iOS

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

Xcode

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

Swift

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

App Store

App Storeは、Apple社が運営する、iPhone、iPod touch、iPad向けアプリケーションソフトのダウンロードサービスです。携帯電話、Wi-Fiによる無線通信に対応しており、多くのアプリケーションをダウンロード、インストールすることができます。世界中の開発者によってアプリケーションが登録されており、有償のソフトもあればフリーソフトも多く登録されています。