iOS13の設定アプリにつまずいた


# はじめに
みなさんご存知かと思いますが iOS13 は設定アプリのクラッシュ祭りでした:confetti_ball:  
設定アプリをクラッシュさせるためのアップデートといっても過言ではありません！！:expressionless:

# 某マッチングアプリの話
iOS13.2.3 で某マッチングアプリがインストールされていると設定アプリがクラッシュするという話もありました。  
参考  
[【iPhone】設定が開けない、落ちる問題がiOS13.2.3で報告 Pairsの削除で改善する事例も](https://sbapp.net/appnews/app/upinfo/ios13/settei-ochiru-pairs-108339)  
こちらは iOS13.2.3 から各アプリ情報を先読みするようになり某アプリの plist ファイルの値不正（型不正？）によって設定アプリを開くと数秒後にクラッシュするようになっていたようです。  
私も調査のためインストールしてみたところ無事クラッシュしました:expressionless:  
こちらは某アプリの値不正が原因でしたが、サードパーティ製のアプリが設定アプリに影響するというのは中々のバグなような気もします。（なんか色々悪いことできそう:smiling_imp:）  
某アプリのバグはすぐに修正され今はもうクラッシュしません:innocent:

# みんな大好きLicensePlistの話
ライセンス表示がめっちゃ楽なみんな大好き [LicensePlist](https://github.com/mono0926/LicensePlist) も iOS13 の設定アプリでクラッシュするというのに遭遇していました:disappointed_relieved:(たぶん全部 iOS 側のバグ:speak_no_evil:)

![13](https://user-images.githubusercontent.com/34936885/71309098-3fce8b00-2447-11ea-81fc-75e8121c48c6.gif)

押したらクラッシュ！！

とりあえずLicensePlistの各バージョンについて動作を確認してみました。Root.plist の記載は下記。

```XML:Root.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
            <key>FooterText</key>
            <string>Copyright</string>
        </dict>
        <dict>
            <key>Type</key>
            <string>PSChildPaneSpecifier</string>
            <key>Title</key>
            <string>Licenses</string>
            <key>File</key>
            <string>com.mono0926.LicensePlist</string>
        </dict>
        <dict>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
            <key>DefaultValue</key>
            <string>1.0.0</string>
            <key>Title</key>
            <string>Version</string>
            <key>Key</key>
            <string>sbVersion</string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
    </dict>
</plist>
```

## LicensePlist 2.6.0
これ [2.6.0: SwiftPM (Swift Package Manager) Support](https://github.com/mono0926/LicensePlist/releases/tag/2.6.0)  
[2.7.1: iOS 13 support](https://github.com/mono0926/LicensePlist/releases/tag/2.7.1) の前のバージョンです。（2.7.0入れたかったんですが pod install が失敗するのであきらめました:confused:）

| iOS12.4.1 | iOS13.0 | iOS13.1 | iOS13.2.2 | iOS13.3 |
| --- | --- | --- | --- | --- |
| :o: | :x: | :o: | :o: | :o: |

なんかたまにへん(gif わかりにくい場合[この Issue](https://github.com/mono0926/LicensePlist/issues/123) の this behavior に動画がありました。)

![260](https://user-images.githubusercontent.com/34936885/71309103-57a60f00-2447-11ea-91a8-765610911836.gif)

## LicensePlist 2.7.1
これ [2.7.1: iOS 13 support](https://github.com/mono0926/LicensePlist/releases/tag/2.7.1)  
iOS13 でのクラッシュを受けすぐに[有志が動きました](https://github.com/mono0926/LicensePlist/pull/109)。（さすがは人気ライブラリ:clap:）
生成される plist ファイルに `Type: PSGroupSpecifier` を加えたらいけるんじゃないか？とのこと。

| iOS12.4.1 | iOS13.0 | iOS13.1 | iOS13.2.2 | iOS13.3 |
| --- | --- | --- | --- | --- |
| :o: | :x: | :x: | :x: | :o: |

13.1 と 13.2.2 はライセンス詳細から一覧に戻るとクラッシュ！！！

## LicensePlist 2.10.0（2019/12/21時点で最新）
これ [2.10.0: Add `--single-page` option](https://github.com/mono0926/LicensePlist/releases/tag/2.10.0)  
[iOS13 対応](https://github.com/mono0926/LicensePlist/releases/tag/2.7.1)後もクラッシュの報告は続き対応されたのがこのバージョン。その後も[有志が調査](https://github.com/mono0926/LicensePlist/issues/123)してどうやら3階層（Licenses -> ライブラリ一覧 -> ライセンス情報）push だとクラッシュするとのことでライブラリ一覧を削除した Licenses -> ライセンス情報の2階層にするオプション `--single-page` が追加されました。  
こんな感じ

<img width="350" alt="setting" src="https://user-images.githubusercontent.com/34936885/71309054-c33bac80-2446-11ea-955d-79a114570174.png">

`--single-page` なし

| iOS12.4.1 | iOS13.0 | iOS13.1 | iOS13.2.2 | iOS13.3 |
| --- | --- | --- | --- | --- |
| :o: | :x: | :o: | :x: | :o: |

`--single-page` あり

| iOS12.4.1 | iOS13.0 | iOS13.1 | iOS13.2.2 | iOS13.3 |
| --- | --- | --- | --- | --- |
| :o: | :x: | :o: | :o: | :o: |

クラッシュしていた原因の詳細はわかりませんが、クラッシュログにやたらと SwiftUI とあったのでそのへんなんだと思います...:neutral_face:

このあたりのバグは iOS13.3 で無事修正されたそうです:clap:

![133](https://user-images.githubusercontent.com/34936885/71309099-4b21b680-2447-11ea-9c5b-c71ad30fd466.gif)

クラッシュしないけど一度表示して戻ると License を押しても画面遷移しない...（まあクラッシュしないし一回目はちゃんとライセンスがみれるのでOK:innocent:）

# さいごに
LicensePlist はもう iOS のアップデートを待つしかないと思ってましたが対応されてよかったです:satisfied:
（某アプリは今後もクラッシュしないか調査を続行しようと思います:neutral_face:）  

ぎりぎりセーフ:mask: