能登 要

札幌在住のiOSアプリ開発者。SwiftUI により分割されたデバイス間を縦横にやりとりできる考え方に転換しています。

iOSアプリ開発者。2009年のiPhoneアプリ開発開始時期から活動。開発言語のアップデートの中でSwiftUIおよび周辺技術に着目中。

UserDefaultはいつから信頼できるようになったか? iOS/iPad App - SwiftUI

アプリ情報永続化(UserDefaults)について古典コラム。内容としては最初期の開発者向けだが、iOSアプリ開発の紆余曲折を知るにも良いかもしれない。

1) UserDefaultsを使用する@AppStorage

SwiftUIで@AppStorageという@定義が用意されている。WWDC2020で発表されたSwiftUI 2nd major releaseで発表された定義でアプリで扱う情報の永続化(Serialize)するために使用する。iOS/macOSアプリ開発から見るとSwiftUI経由でUserDefaultsへのアクセスが容易となった。

@AppStorageで何ができるかというと、@Stateと同じ感覚でアプリで使用する情報の永続化が可能となる。@AppStorageについては以下の投稿でサンプル付きで記述している。

Settings.BundleとSwifUI @AppStorage - SwiftUI100行チャレンジ⑥

#2) 信用されないデータストア達

iOSアプリ開発初期(2008年〜)にもアプリ情報の永続化のためのUserDefaultsは存在していた、iOSアプリ開発当初はサードパーティ製アプリに求められていたのはアクセサリウィジット的存在で2021年における重装的なアプリはあまり想定されていなかった。

Apple Widget考古学 - App Extension の技術Stack

アクセサリウィジット的なアプリを求められていた都合上、AppleはUserDefaultsをアプリ情報永続化の方法として勧めていたが使う側としては永続化したはずのデータが破損する記憶があった。

データが破損した際の挙動だがUserDefaultsに保存した情報にアクセスしようとすると失敗してしまう。失われたアプリ情報は戻ってこないので上書きするしかない。またAppleのクラウドサービスであるiCloud開始以後、UserDefaultsをクラウド状に保存される利便性の向上が図られるが破損した情報のままクラウドにも保存されるためバックアップとして機能しないなどの問題が発生していた。

データが破損する問題はAppleが提供する構造化されたデータを永続化させるCoreDataも破損することが多かった。

UserDefault、CoreDataが破損する問題の対処方法としてはUserDefaultsの情報やCoreDataのファイルをアプリのローカルストレージに定期バックアップをするなどアプリ情報のスナップショットを保存するなどの対処が必要だった。

3) 信頼性が向上した要因は?

アプリ内のデータが破損する問題が話題に上がらなくなったのはいつだろう。次第に話題にならなくなった要因は追い切れていないが経緯と思われる出来事はあった。それはiOS10.3 以降でのファイルシステムの変更である。

iOS10.3から採用されたファイルシステムAPFSはSSDドライブが普及した時期に考慮されたファイルシステムのためファイル書き込み対するやり取りはSSDに最適化されている。特にファイルの上書きに関してはHDD(スピンメディア)が元データを上書きするのに対してSSDは書き込み領域の別箇所に書き込んだ後で元データを削除する。

書き込みが正しく完了しない限りは元データは手付かずのため予期せぬ書き込み中断時に元データに復帰することが可能になる。モバイル用途だと書き込み失敗がアプリが突然終了するなどで発生しやすいのでAPFSのメリットを享受できているものと推測できる。

まとめ

アプリが誤った情報を書き込だ場合はファイルシステムの恩恵は得られないがアプリ開発者からするとファイル周りの悩み事が一つ解消した。

私個人としては解決した問題以上にOSアップデート毎にAppleから開発者に対応すべき事項を投げかけるので忙さはあまり変わらないのが残念なところであるがiOSアプリ開発可能になって数年間のUserDefaultsの挙動にうんざりしたアプリ開発者は一度UserDefaultsの知見を見直してもいい頃合いかもしれない。