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

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

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

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

Q&A

解決済

1回答

217閲覧

課金情報の順番がなぜかずれます

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2023/10/26 06:30

編集2023/10/27 18:47

実現したいこと

課金情報の順番を直したい

前提

消耗型課金の情報を取得し決済する処理を実装しています。
試しに課金情報を取得してプリントしたところ配列の順番が設定した順番と違う順番でプリントされてきました。

これだと正しい順番ごとに課金情報を渡せないので困っています。

発生している問題・エラーメッセージ

(順番が入れ替わってしまう) 全課金アイテムは... 課金情報1 課金情報3 課金情報2

該当のソースコード

swift

1// 2// PurchaseManager.swift 3// 4// 5// Created by Apple on 2023/10/04. 6// 7 8import PKHUD 9import StoreKit 10 11enum StoreError: Error { 12 case failedVerification 13} 14 15final class PurchaseManager { 16 17 static let shared = PurchaseManager() 18 19 private(set) var products: [Product] = [] 20 private var updateListenerTask: Task<Void, Error>? 21 22 deinit { 23 updateListenerTask?.cancel() 24 } 25 26 func initialize() { 27 updateListenerTask = listenForTransactions() 28 Task { 29 // 初期化時にプロダクト(AppStoreに登録した全課金アイテム)を取得 30 await loadProducts() 31 } 32 } 33} 34 35extension PurchaseManager { 36 37 // 課金アイテム情報を取得 38 private func loadProducts() async { 39 do { 40 // 課金アイテム情報を取得する 41 self.products = try await Product.products(for: [ 42 "課金情報1", 43 "課金情報2", 44 "課金情報3"] 45 ) 46 47 print("=======================") 48 print("全課金アイテムは...") 49 print(self.products) 50 print("=======================") 51 52 } catch { 53 print("=======================") 54 print("¥product request失敗: \(error)") 55 print("=======================") 56 } 57 } 58 59 60 // 購入処理 61 func purchase(_ product: Product) async throws { 62 let result: Product.PurchaseResult = try await product.purchase() 63 64 switch result { 65 case .success(let verification): // 成功時 66 // 決済情報を取得する 67 let transaction = try checkVerified(verification) 68 // 課金処理が成功したら即座に終了すること 69 await transaction.finish() 70 71 case .pending: // 失敗時 72 // SCA (Strong Customer Authentication)等 ユーザーのアクション待ち 73 // Transaction.updatesで購入コンテンツを提供する 74 break 75 case .userCancelled: 76 print("=======================") 77 print("キャンセルボタンを押したよ") 78 print("=======================") 79 break 80 @unknown default: 81 break 82 } 83 } 84 85 86 // 購入状況を確認する 87 func isPurchased(_ productIdentifier: String) async throws -> Bool { 88 89 guard let result = await Transaction.latest(for: productIdentifier) else { 90 return false 91 } 92 // 取得する 93 let transaction = try checkVerified(result) 94 // 返す 95 return transaction.revocationDate == nil && !transaction.isUpgraded 96 } 97} 98 99private extension PurchaseManager { 100 // 検証が成功しているかチェック 101 func checkVerified<T>(_ result: VerificationResult<T>) throws -> T { 102 switch result { 103 case .unverified: // 失敗時 104 throw StoreError.failedVerification 105 case .verified(let safe): // 成功時 106 return safe 107 } 108 } 109 110 111 // 購入処理中にアプリがクラッシュするなどで中断した場合 112 // バックグラウンドでfinishを行えていない(コインの付与に失敗した) 113 // transactionを監視して付与に成功したらtransactionをfinishする 114 func listenForTransactions() -> Task<Void, Error> { 115 return Task(priority: .background) { 116 for await result in Transaction.unfinished { 117 do { 118 // 途中経過を取得する 119 let transaction = try self.checkVerified(result) 120 121 // 完了後は処理を速やかに終了すること 122 await transaction.finish() 123 } catch { 124 print("=======================") 125 print("Transaction検証失敗: \(error)") 126 print("=======================") 127 } 128 } 129 } 130 } 131} 132

試したこと

1:Appstore Connectで再度課金情報を作り直して ID の連番を修正→変化なし
2:self.productsの配列の中身の順番を変更→変化なし
3:self.products.sort()する→エラー

補足情報(FW/ツールのバージョンなど)

課金初めての実装です。
お手柔らかにお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

結果

自己解決しました。

原因

非同期処理でプロダクト情報を取得している のが原因でした。
結果処理が完了している順番で帰ってくるのでずれが生じるようでした。

解決方法

products はソートできるのでソートで価格順に修正しました。

Swift

1 // ソートする 2self.products.sort(by: { $0.price < $1.price }) 3

投稿2023/10/27 09:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.53%

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

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

質問する

関連した質問