実現したいこと
今回初めて課金のプランを実装したいと思っております。
その中でtableViewにて表示した際プランの並び順が指定した並び順にならずに困っております。
対応法などご存知の方いらっしゃいましたらご教示頂けましたら幸いです。
前提
課金プランが、
プラン1、プラン2、プラン3
とあり、これをそのまま
プラン1
プラン2
プラン3
とテーブルビューに並べたい。
発生している問題・エラーメッセージ
必ず
プラン2
プラン3
プラン1
と並んでしまう。
該当のソースコード
※製品IDは例としてわかりやすく変えてあります。
---KakinView.swift--- テーブルビューがあるページとなります。 var paymentManager:PaymentManager! var productRequest:SKProductsRequest? var products: Array<SKProduct>? func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = UITableViewCell(style: .default, reuseIdentifier: nil) cell.textLabel?.text = products?[indexPath.row].localizedTitle return cell } ---ProductManager.swift--- 製品IDの設定 func productIds() -> Set<String> { return Set(arrayLiteral: "プラン1", "プラン2", "プラン3" ) ---PaymentManager.swift--- func startProductRequest(_ productIds:Set<String>) -> SKProductsRequest { print("リクエストがスタートされました1") let productsRequest = SKProductsRequest(productIdentifiers: productIds) productsRequest.delegate = self productsRequest.start() return productsRequest } // プロダクト情報の取得が成功したときに呼び出される public func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { // invalidProductIdentifiersがあればログに出力する for invalidIds in response.invalidProductIdentifiers { print(invalidIds) } delegate?.finishRequest(request, products:response.products) }
試したこと
製品IDの紐付けがAppStoreConnectでの設定で間違えていたのかと思いましたが問題はありませんでした。
Set は順番が保証されないので、普通jに配列を使えば良いのでは。
返信が遅くなり申し訳ございません。
なるほど!Set(arrayLiteral:)ではなく、Set([])にすれば良いという事ですね。
たぶん違います。表示の際には配列で用意しておいて、SKProductsRequest とかに渡す際に配列を Set に変換すれば良いかと…。
たびたびのご教示ありがとうございます。
今回本をアプリ課金に関しては本を読みながら学び、「func productIDs() -> Set<string>」の所でプロダクト情報をリクエストして受け取る事がわかりました。
そこで使っている配列を「var products: Array<SKProduct>?」としているのですが、これとは別に表示用で配列を用意するという事なのでしょうか?
この質問自体意味不明な内容なのかも知れないのでお恥ずかしいですがお教え頂けたら幸いです。
こちらこそ、課金は詳しくないのと、その本を持ってないので「func productIDs() -> Set<string>」が何のメソッドで、どう使われるかよく分からなくてごめんなさい。ソースコードはなるべく省略せずに貼ってもらえると助かります。
これまで情報が足りない中でもお教え頂き本当にありがとうございます。
情報の取得と表示周りの部分を追加してみましたので、お分かりになりましたら何卒よろしくお願い致します。
もし何か足りない部分がありましたらおっしゃって下さい。
まだコードが断片的で良く分かりませんが、delegate?.finishRequest の products 配列を KakinView でテーブルに表示してるってことでしょうか? request には Set を渡して、response には配列で返ってくるけど、その順番が気に入らないってことなら、受け取ってから並べ直すことになるかと…。
https://stackoverflow.com/questions/9074129/how-to-sort-products-by-price-in-app-purchases
おっしゃる通り
自分的には並び順を指定しているのでその通りに並ぶのかと思っていたのですが、リンク先を拝見した所自分で順番を変えないといけないのですね。
みなさんそうやっていたのですね・・・。
今回は本当に色々とありがとうございました。
また機会がありましたらお知恵をお貸し頂けると幸いです。
あなたの回答
tips
プレビュー