概要
v1.4ではCloud Sync、AI最適化、GPS位置タグなど多くの新機能を追加しました。おかげさまでたくさんの方に日常的に使っていただけるようになり、Firebase Crashlyticsにクラッシュレポートが届くようになりました。
クラッシュレポートは本当にありがたいです。何を直すべきか正確に教えてくれます。見つかった問題をすべて修正した新しいバージョンをまもなくリリースします。発見した問題を正直にお伝えします。
見つかった問題
録音停止後のメモリ圧迫
録音を停止すると、AI分析とオーディオ変換が同時に実行されていました。48 kHzステレオで5分の録音だと約115MBのメモリを消費します。分析と変換を同時に走らせると、ピーク使用量が345MBを超えることがありました。
iOSがメモリ圧迫を検知してシステムフレームワークのメモリ割り当てを強制終了し、クラッシュが発生していました。
修正:パイプラインを直列化しました。分析が完了してから変換を開始するようにし、アナライザーも共有モノラルバッファを再利用するよう最適化しています。
AudioPlayerのKeyPathクラッシュ
Swiftの@Observableマクロが、AVAudioEngineの内部プロパティに対してKeyPathトラッキングを自動生成していました。再生中にこれらにアクセスすると、Swiftランタイムが_swift_getKeyPathでクラッシュしていました。
修正:UI表示と関係のないすべての内部オーディオプロパティに@ObservationIgnoredを適用しました。
長時間録音でのメモリ不足
スペクトラルノイズリデューサーがオーディオファイル全体を一度にメモリに読み込んでいました。10分の録音で約500MB。iOSがアプリを強制終了するケースがありました。
修正:チャンク処理によるストリーミングI/Oに書き換えました。10秒ずつ処理することで、ピークメモリを500MBから約20MBに削減できています(録音の長さに関係なく)。
AVAudioEngineのフォーマットクラッシュ
一部のデバイスで、オーディオハードウェアの初期化が完了する前にAVAudioEngine.connect()がObjective-CのNSExceptionを投げることがありました。SwiftのtryではNSExceptionをキャッチできないため、クラッシュを回避する手段がありませんでした。
修正:フォーマットの事前検証ガードを追加し、専用のObjective-C例外キャッチャーを実装しました。
今後について
これらの修正はすべてv1.4.2に含まれており、現在App Storeの審査に提出中です。クラッシュを経験された方は、アップデートで解消されるはずです。
クラッシュレポートはいつでも歓迎です。1Takeをより良くするために役立てます。