カテゴリー
ECHONET iOS

EchonetScannerをiOS14.1で動かすと、Fatal Errorになってしまう。

少しずつ機能追加しながら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を使う)も見つかり、修正前のコードはたまたま動いていただけなのかもしれません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA