0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【iOS】SVGKitで「pixelsPerInchForCurrentDevice」のAssertion failureで落ちる・表示されない時の対処法

0
Posted at

はじめに

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 を書き換えて対応しました。

  1. Podfileの修正
ruby.diff
# 修正前
- pod 'SVGKit'

# 修正後:最新デバイスのPPI定義が含まれている3.xブランチを指定
+ pod 'SVGKit', :git => 'https://github.com/SVGKit/SVGKit.git', :branch => '3.x'
  1. ライブラリの更新
    修正後、ターミナルでインストールを実行します。
pod install

これで、最新のiPhoneモデルがリストに追加された状態のSVGKitがインストールされ、エラーが解消されます。

まとめ

原因: CocoaPodsの公式版が古く、最新iPhoneのPPI定義を持っていないため。
対策: Podfile でGitHubの 3.x ブランチ を直接指定してインストールする。
教訓: GitHub上では修正済みでも、パッケージマネージャーへの配信が止まっているケースは多々ある。

おわりに

この記事が、SVGKitの表示不具合に悩む誰かの助けになれば幸いです。

参考

この問題はSVGKitの本家リポジトリでも議論されていました。

GitHub Issue #814: Assertion failure in pixelsPerInchForCurrentDevice

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?