Closed13

Xcode 14 (iOS 16 SDK)でビルドしたアプリの場合、 SwiftyStoreKit のリストア処理でフリーズしてしまう

Kenji Wada (さくさん)Kenji Wada (さくさん)

2022/09/13、Xcode 14 がリリースされた。

動かない機能・動く機能などさまざまであったが、致命的だったのが「課金アイテムのリストア(復元)が動かない」点であった。

当該アプリではサブスクの管理に SwiftyStoreKit を使っていたが、Xcode 14 (iOS 16 SDK)でビルドしたアプリで iOS 16 デバイス上で、課金アイテムのリストア(復元)をおこなうと StoreKit からコールバックが返ってこずフリーズした。実機・シミュレータ両方とも同じ挙動であった。

つまり、以下の組み合わせとなる。

  • Xcode 14 でビルドしたアプリ + iOS 16 デバイス = NG
  • Xcode 13.4 でビルドしたアプリ + iOS 16 デバイス = OK
  • Xcode 13.4 でビルドしたアプリ + iOS 15 デバイス = OK

うちの環境だけで発生する問題かと思ったが、他のひとの環境でも発生していることがわかった。

https://github.com/bizz84/SwiftyStoreKit/issues/682

SwiftyStoreKit 側の修正を待ちたいが、SwiftyStoreKit の作者は既に更新の意欲が途絶えていることを表明しており、利用者がパッチを当てる必要がありそうだ。

とりあえず対応に時間がかかると思ったので Xcode 14対応を中断して Xcode 13.4.1 に戻した。

Kenji Wada (さくさん)Kenji Wada (さくさん)

paymentQueueController.restorePurchases のコールバックが返ってきていないところまで確認した。

    fileprivate func restorePurchases(atomically: Bool = true, applicationUsername: String = "", completion: @escaping (RestoreResults) -> Void) {
        
        paymentQueueController.restorePurchases(RestorePurchases(atomically: atomically, applicationUsername: applicationUsername) { results in
            
            let results = self.processRestoreResults(results)
            completion(results)
        })
    }
Kenji Wada (さくさん)Kenji Wada (さくさん)

OS側から paymentQueueRestoreCompletedTransactionsFinished が呼ばれないのが、コールバックが返ってこない原因なのはわかったが、なぜ paymentQueueRestoreCompletedTransactionsFinished が呼ばれないのかがわからない。

Kenji Wada (さくさん)Kenji Wada (さくさん)

2022/09/14、Xcode 14.1 Betaが公開された。

SwiftyStoreKit のデモアプリが動くか確認した。Xcode 14 RCだとリストアがうまく動かなかったがどうなるのか?

残念ながら、Xcode 14.1 Beta でもリストアは動かなかった。現時点ではいままで通り動くことを期待できない。Xcode 14に移行する場合は SwiftyStoreKit は捨てないと駄目かもしれない。

Kenji Wada (さくさん)Kenji Wada (さくさん)

Xcode 13.4 でビルドしたアプリ + iOS 16 デバイス = OK

と前述したが、これは嘘かもしれない (調査不足であったかもしれない)。Xcode 13.4.1 でビルドしたアプリを TestFlight経由でインストールしたところ、iOS 16デバイスでは リストアに失敗した。

調査内容を踏まえて、改めて表を作成した。

Xcode iOS source restore app bitcode
13.4.1 16 App Store OK MyApp P NO
13.4.1 16 App Store OK MyApp S NO
13.4.1 16 Testflight NG🙅‍♂️ MyApp P NO
13.4.1 16 Testflight NG🙅‍♂️ MyApp S NO
13.4.1 15.7 App Store OK MyApp P NO
13.4.1 15.7 App Store OK MyApp S NO
13.4.1 15.7 Testflight OK MyApp S NO
13.4.1 14.8 Testflight OK MyApp S NO
14.0 16 App Store OK MyApp F NO (default)
14.0 16 Testflight NG🙅‍♂️ MyApp F NO (default)
14.0 16 Testflight NG🙅‍♂️ MyApp P NO
14.0 16 Xcode Debug NG🙅‍♂️ SwiftyStoreKit demo app NO (default)
14.1 Beta 16 Xcode Debug NG🙅‍♂️ SwiftyStoreKit demo app NO (default)
14.1 RC2 16.1 Testflight OK MyApp P NO (default)
  • Update: 2022/10/27 Xcode 14.1 RC2 がリリースされたので一覧表を更新しました。
Kenji Wada (さくさん)Kenji Wada (さくさん)

Xcode 14.0 + iOS 16 Device + App Store の結果次第だが、もう SwiftyStoreKit を使うのをやめて、StoreKit 2 に移行する必要がありそうだ。

StoreKit 2 は iOS 15以上でしか使えない。さくさんは iOS 13.x 対応のアプリも保守しているため、SwiftyStoreKit を使う処理を残しつつ、iOS 15以上では StoreKit 2 を新規に実装しなければいけない。

  • iOS 13 and 14: SwiftyStoreKit (既存の処理のまま)
  • iOS 15 〜: StoreKit 2 (新規に実装)
Kenji Wada (さくさん)Kenji Wada (さくさん)

bitcode のYES/NOが結果に関係しているかもしれないとのことだったので、 https://zenn.dev/link/comments/4668c87275bf9a の表を更新した。

Xcode 13.4 リリース時、bitcode を YESにしていると Bitrise でビルドできなくなってしまったため、私が開発しているアプリはその頃にすべて bitcode を NO に変更した。

Kenji Wada (さくさん)Kenji Wada (さくさん)

Xcode 14.1 RC Release がリリースされた。リリースノートに StoreKit の項目が含まれているようだ。

StoreKit
Resolved Issues
Fixed: Using the following StoreKit properties and methods on apps with a minimum deployment target below iOS 16, macOS 13, watchOS 9, and tvOS 16 will cause the app to crash at launch when running on systems earlier than iOS 16, macOS 13, watchOS 9 and tvOS 16:

* priceFormatStyle and subscriptionPeriodFormatStyle on Product values
* environmentStringRepresentation and recentSubscriptionStartDate on Product.SubscriptionInfo.RenewalInfo values
* environmentStringRepresentation on Transaction values
* dateRange(referenceDate:) and formatted(_:referenceDate:) on Product.SubscriptionPeriod values (99962885) (FB11516463)

現在 SwiftyStoreKit が抱えている問題は解決できないが、StoreKit 周りに手が入ったので一縷の望みをかけて、時間を作ってテストをしたいと思う。

Kenji Wada (さくさん)Kenji Wada (さくさん)

本日、Xcode 14.1 RC Release 2 がリリースされた。Xcode 14.1 RC での動作確認はできなかったが、RC2 で動作確認をおこなった。

Xcode 14.1 RC2 と iOS 16.1 と TestFlight と SwiftyStoreKit の組み合わせで動作確認したところ、私のアプリではリストア処理でフリーズすることがなくなった。

私のアプリだけ問題ないのか、全体的にApple 側の処理が修正されたのかわからないため、もしこの問題で悩んでいる方がいれば追試して欲しい。

このスクラップは2022/12/19にクローズされました