はじめに
iOSでSVGを扱う際の定番ライブラリ「SVGKit」を動かした際、「最初の1回目だけ表示されない」「アプリが落ちる」 という現象に遭遇することがあります。
今回は、その原因と解決方法をまとめました。
現象:新しいiPhoneでの初回ロード失敗
Xcodeのコンソールに以下のようなエラーが出力され、SVG画像の描画に失敗します。
*** Assertion failure in +[SVGLength pixelsPerInchForCurrentDevice], SVGLength.m:238
困りポイント
なぜか2回目以降のSVG読み込みは問題なく表示される
特定の端末・開発環境でしか発生しない。
古いiPhoneやシミュレータでは動くのに、最新端末だと失敗する。
原因:ライブラリ内の「デバイスリスト」が古い
SVGKitの内部実装(SVGLength.m)では、デバイスのモデル識別子(例:iPhone15など)を見て、その端末のPPI(ピクセル密度)をハードコーディングされたリストから取得しています。
しかし、CocoaPodsで普通にインストールされる公式の最終リリース(2.x〜)は数年前で更新が止まっており、最新のiPhoneがリストに含まれていません。
リストにない未知のデバイスで実行されると、「PPIが計算できない」とAssertionが失敗し、処理が中断されてしまうのが原因でした。
[余談] OSSメンテナンスの難しさ
GitHub上のソースコードには修正が入っているのですが、CocoaPodsへのリリース作業が止まっているようです。
コードを書くこと以上に、配信のパイプラインを維持し続けるのはメンテナーにとってかなりの負担です。最新の修正が「パッケージ」として降ってこない現状は、OSSの難しさを感じます。
解決策:Podfileで「3.x」ブランチを直接指定する
公式リリース(バージョン指定)を待っていても解決しないため、修正が進んでいる 3.x ブランチ を直接参照するように Podfile を書き換えて対応しました。
- Podfileの修正
# 修正前
- pod 'SVGKit'
# 修正後:最新デバイスのPPI定義が含まれている3.xブランチを指定
+ pod 'SVGKit', :git => 'https://github.com/SVGKit/SVGKit.git', :branch => '3.x'
- ライブラリの更新
修正後、ターミナルでインストールを実行します。
pod install
これで、最新のiPhoneモデルがリストに追加された状態のSVGKitがインストールされ、エラーが解消されます。
まとめ
原因: CocoaPodsの公式版が古く、最新iPhoneのPPI定義を持っていないため。
対策: Podfile でGitHubの 3.x ブランチ を直接指定してインストールする。
教訓: GitHub上では修正済みでも、パッケージマネージャーへの配信が止まっているケースは多々ある。
おわりに
この記事が、SVGKitの表示不具合に悩む誰かの助けになれば幸いです。
参考
この問題はSVGKitの本家リポジトリでも議論されていました。
GitHub Issue #814: Assertion failure in pixelsPerInchForCurrentDevice