Xcode 14 (iOS 16 SDK)でビルドしたアプリの場合、 SwiftyStoreKit のリストア処理でフリーズしてしまう
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
うちの環境だけで発生する問題かと思ったが、他のひとの環境でも発生していることがわかった。
SwiftyStoreKit 側の修正を待ちたいが、SwiftyStoreKit の作者は既に更新の意欲が途絶えていることを表明しており、利用者がパッチを当てる必要がありそうだ。
とりあえず対応に時間がかかると思ったので Xcode 14対応を中断して Xcode 13.4.1 に戻した。
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)
})
}
OS側から paymentQueueRestoreCompletedTransactionsFinished
が呼ばれないのが、コールバックが返ってこない原因なのはわかったが、なぜ paymentQueueRestoreCompletedTransactionsFinished
が呼ばれないのかがわからない。
2022/09/14、Xcode 14.1 Betaが公開された。
SwiftyStoreKit のデモアプリが動くか確認した。Xcode 14 RCだとリストアがうまく動かなかったがどうなるのか?
残念ながら、Xcode 14.1 Beta でもリストアは動かなかった。現時点ではいままで通り動くことを期待できない。Xcode 14に移行する場合は SwiftyStoreKit は捨てないと駄目かもしれない。
SwiftyStoreKit の例のIssueに「うまく動かないのはSandbox のみではないか?」との回答がついている。
Xcode 14 でビルドした個人開発アプリを一度ストアでリリースしてみたいと思う。駄目ならすぐにXcode 13.4.1 でビルドしたバージョンでアップデートしよう。
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 がリリースされたので一覧表を更新しました。
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 (新規に実装)
Xcode 14.0でビルドした Four Cropper がApp Storeで公開された。サンプル数 1 で原因もわからないが、結果としてはXcode 14.0 と App Store の組み合わせであればリストアできた。
bitcode のYES/NOが結果に関係しているかもしれないとのことだったので、 https://zenn.dev/link/comments/4668c87275bf9a の表を更新した。
Xcode 13.4 リリース時、bitcode を YESにしていると Bitrise でビルドできなくなってしまったため、私が開発しているアプリはその頃にすべて bitcode を NO に変更した。
SwiftyStoreKit の修正は難しそうなので、StoreKit 2 に移行することに決めた。
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 周りに手が入ったので一縷の望みをかけて、時間を作ってテストをしたいと思う。
本日、Xcode 14.1 RC Release 2 がリリースされた。Xcode 14.1 RC での動作確認はできなかったが、RC2 で動作確認をおこなった。
Xcode 14.1 RC2 と iOS 16.1 と TestFlight と SwiftyStoreKit の組み合わせで動作確認したところ、私のアプリではリストア処理でフリーズすることがなくなった。
私のアプリだけ問題ないのか、全体的にApple 側の処理が修正されたのかわからないため、もしこの問題で悩んでいる方がいれば追試して欲しい。
Xcode 14.1 で iOS側が修正されたのでクローズ。