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?

SVGKit 3.0.0がcircle, rectなデータで落ちる

0
Last updated at Posted at 2026-08-02

SVGを表示する必要があって、SVGKitを入れてみて。

実装終わって、#Previewで表示をテストしていたら、唐突に落ちるケースが。

どうやらpolygonなデータなら大丈夫なんだけど、circle, rectだと落ちる。

なんで、、、?と調べた結果メモ。


結論としては、

原因はこれ。

シミュレータ実行時にsysctlbyname("hw.machine")で返ってくる値("arm64")がif文の分岐にない。
これのせいでNSAssertが発動して、落ちる。

(やめてよ・・・)

NSAssertなので、本番ビルドでは落ちたりはしない(通常のReleaseビルドでは無効化される)んで、安心!
・・・けど、そんなこと言われてもデータ次第で落ちたり、落ちなかったりは、焦る。

なんでそんなしょうもないのが残っているかというと、、、

SPMで最新版の3.0.0を指定してたのだけど、、、

3.0.0 on Feb 22, 2021

と、恐ろしく古いというか、何年リリースされてないんじゃ・・・という感じなせい。

対策としては、、、

適当なbranchを指定する

    {
      "identity" : "svgkit",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/SVGKit/SVGKit",
      "state" : {
        "branch" : "5977bcd0f688",
        "revision" : "5977bcd0f688623e3f2dd63aceb4f606158f31da"
      }
    },

on Jan 30, 2024の↓のコミット以降であればどこでも良い。

リリースしてくれればいいんだけど

3.1とかがリリースされてくれればいいんだけど、、、
この辺眺めてると、当面に解消されることはなさそう。

かといって、3.xブランチを指定するのは、、、 僕は流石に嫌だなあ。
なので、commit指定でお茶を濁す。


そもそも何故polygonが大丈夫でcircle, rectだと落ちるのか

SVGKitの設計というか思想の問題。

circle, rectは大きさを(mmとかinchとかで)指定できる。
-> SVGLengthとして処理され、その過程でppiを参照しに行く
-> 定義外だとassertで落ちる

polygonは座標系なので関係ない。
-> ppiを参照しにいかない

何故かppiをデバイス単位で厳密に適用しようとしている。
・・・せいで、ppiの未定義デバイスという概念が発生し、落ちる。
(その努力は、果たして本当に必要なのか、、、?)

なお、データにmmとかinを指定してなくても、落ちる。

コードを追ってみると

3.0.0のpixelsPerInchForCurrentDeviceを眺めると、まさかの固定値をハードコーディング。。。

3.xだと定義を外出しして、幾らか綺麗になってるけど、やはりハードコーディング。。。

つまり、新機種が出る -> 誰かが買って、実機でppi測って、そのPR出して、それがmergeされるのを待ってから、ライブラリ更新を行う。
・・・までを毎年にやるのが正しいということになる。

iPhone以外もとなると、もっと高頻度でということになる。
それだと3.xブランチを追うほうがいい・・・のか?

毎年更新すべきか問題

今回の僕の使い方ではmmとかinchとかのデータが来ることはないし、仮に来たところで厳密に表示しなければならない必要もない。
ので、(僕は)定期更新する気はない。

皆さんもご自身の使い方で判断くださいね。

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?