少しずつ機能追加しながらEchonetScannerの開発を続けています。手持ちのiPhoneで動作確認して問題なく動いていたのですが、最近購入したiPhone 12 miniで試したところ、クラッシュが発生してしまいました。
事象発生はいつも同じ操作で、バックグラウンドで情報要求のUDPパケットを送信、受信データを画面に反映させるところです。
- 問題なく動作したデバイス
- iPhone 11 Pro(iOS13.5.1)
- iPhone X(iOS14.4)
- iPhone 7(iOS14.4)
- クラッシュが発生したデバイス
- iPhone 12 mini(iOS14.1)
iPhone 12 miniをMacに接続してXcodeでデバッグ実行させてみると、Fatal Errorとなりました。
Fatal error: Can't remove first element from an empty collection: file Swift/RangeReplaceableCollection.swift, line 624
2021-02-21 11:19:32.157154+0900 EchonetScanner[2204:347345] Fatal error: Can't remove first element from an empty collection: file Swift/RangeReplaceableCollection.swift, line 624
ググってみると全く同じ事象の情報が見つかり、やはりiOS14.1で起きているようです。
試しに、iOS14.4で動かしていたシミュレータをiOS14.1にしてみたところ、同じ事象を再現させられました。どうやら、iOS14.1に依存(ただし、13.5.1/14.4以外のバージョンは未確認なので、他のバージョンでも起きるかも)した挙動のようです。
AppStoreへ登録してみようかと思っていた矢先で、「iOS14.4を使ってください」というのもどうかと思い、試行錯誤したところ事象発生を抑えられたので記しておきます。
具体的には、
DispatchQueue.global(qos: .background).async {
(EchonetLite機器への要求パケット送信)
percent = Double(count) / Double(num) // percent値は、@State宣言されていて、プログレス表示に反映される
}
を
DispatchQueue.global(qos: .background).async {
(EchonetLite機器への要求パケット送信)
DispatchQueue.main.async {
percent = Double(count) / Double(num) // percent値は、@State宣言されていて、プログレス表示に反映される
}
}
と修正しました。
あらためて情報収集してみると、こちらの記事(Swift4でDispatchQueueを使う)も見つかり、修正前のコードはたまたま動いていただけなのかもしれません。