😱

StoreKit Testingを使う際には「改行」に注意する

に公開

個人で開発しているアプリに課金を実装しようとしています。Store Kit 2を用いた Products の一覧の取得がどうしてもできず、合計10時間近くハマっていたのですが、Xcodeの不親切な挙動のせいだったので、注意喚起です。

Store KitのLocal Testing

Xcode 12以降では、StoreKit testingが追加され、App Store Connectを使用せずとも、アプリ内課金のテストが行えるようになりました。

https://developer.apple.com/documentation/xcode/setting-up-storekit-testing-in-xcode

詳しくは上記リンクにまとまっていますが、 .storekit ファイルを作成し、そこに課金できるアイテムの情報を入力した後、ビルド時にそのファイルを指定することで、ローカルで課金のテストを行うことができます。

try await Product.products(for: PRODUCT_IDENTIFIERS))

設定した後、上記コードを使って課金アイテムの一覧を取得しようとしたのですが、APIのコール自体は成功するものの、空配列しか返ってきませんでした。

GUIがペースト時に改行を受け付けるようになっている

数時間の格闘の末、 .storekit ファイルをテキストエディタで開くと、 productID の部分が正しくないことがわかりました。

正しくは app.svadilfari.small_tip としたかったのですが、改行と共に違うデータが入ってしまっています。

しかし、Xcode上では最初の1行しか確認できないので、見た目では複数行のテキストが入力されていることに気付けません(後で気づきましたが、矢印キーなどを使うと2行目以降に進むことができます)。

このテキストエリアは、エンターを押すとフォーカスが解除されるようになっており、普通は改行を入力することができません。しかし、ペーストすると改行を入れることができ、見た目では改行以前は何も入力されなかったように見えます。

私は、Product IDを別のエディタで下書きしてからコピーしたのですが、その際に app.svadilfari.small_tip\n となってしまい、問題が発生したと考えられます。

App Store Connect経由のテストも動かす...

Local Testingが動作しなかった際に、問題の特定のため、App Store Connect経由でProductを取得することを試みました。その際に、App Store Connectに銀行口座や税金の情報を入力することが必要だと知らず、そちらでも空の製品一覧しか取得できませんでした。

https://zenn.dev/hi629/articles/65b1b23076c544

ローカルでもオンラインでも同じ現象が発生したため、StoreKitの使い方に問題があると信じ込んでしまい、原因特定により時間がかかってしまいました。

まとめ

  • StoreKit configurationファイルは、ペーストすることでProduct IDに改行を入れることができてしまい、問題の原因となる可能性があります。
  • コピーペーストするときは、改行に気をつけましょう。
  • XcodeのGUIを信じすぎず、怪しいと思ったらテキストエディタで開いたり、ファイルを作り直したりすると、道が拓けるかもしれません。
  • 問題の切り分けはデバッグにおいて重要ですが、間違った前提で時間を浪費しすぎないようにしましょう。

Discussion