最近の iOS, macOS 周りの API の変化

長いこと iOS での開発をしていると、昔はやってたけど今はしなくてもいいことが出てきたりします。

Swift の新機能などは嬉しいのでよくチェックするのですが、 Foundation や UIKit の細かな変更に関しては特に追いかけていないのでやや自分の知識が古くなっているものもあるなと思いました。

何も読まなくても使えるような手が覚えてしまっている機能でも時々ドキュメントを見たりして情報を更新しておくことの大事だなと思い、今回は非推奨にはなっていない(Deprecated にマークされていない)けど、推奨される方法が変わっているものをいくつか紹介します。

UserDefaults

昔は UserDefaults で値の変更をしたあとは synchronize() を呼んでいました。

しかしながら今は不要なようです。

ビルドしても警告も何も出ずにドキュメントにしか書いてないから、最近気が付きました(将来的に非推奨になるようです)。

Waits for any pending asynchronous updates to the defaults database and returns; this method is unnecessary and shouldn't be used.

f:id:mironal:20211005123711p:plain
func synchronize() -> Bool

Apple Developer Documentation

一時ディレクトリ(テンポラリディレクトリ)

一時ディレクトリを取得するには NSTemporaryDirectory などを使うのが一般的だった気がします。

今は FileManagerurl(for:in:appropriateFor:create:) を使う方法が推奨されているようです。

f:id:mironal:20211005124220p:plain
NSTemporaryDirectory

Apple Developer Documentation

推奨されている方↓

Apple Developer Documentation

このメソッドはやや使いにくいのでサンプルコードを置いておきます。

do {
    let temporaryDirectory = try FileManager.default.url(
        for: .itemReplacementDirectory,
        in: .userDomainMask,
        appropriateFor: FileManager.default. temporaryDirectory,
        create: true // 勝手に作ってくれるオプション
    )
    
    print(temporaryDirectory)
} catch {
    // Handle the error.
}

これを実行すると以下のようなディレクトリが作成されます。

file:///private/var/mobile/Containers/Data/PluginKitPlugin/1AEC4803-6621-4369-8AD0-000000000000/tmp/XXXXXXXXXXXX_EeV2fM

FileManager.default.temporaryDirectory の場合は末尾が /tmp/ のディレクトリを返しますが、url(for:in:appropriateFor:create:) の場合は更にもう一段掘ったディレクトリを返してくれます。

一時ディレクトリ内でなにか処理をして終わったらディレクトリごと削除するみたいな使い方をする場合には従来だともう一段掘る処理が必要でしたが、それが不要になるので楽に記述できます。

まとめ

最近の iOS, macOS 周りの API の変化について例を上げました。

今まで必要になったときしか見ていなかったのですが、時間があればリリースノートを読もうかなと思いました。

リリースノートはこのあたりにあるっぽいです。

developer.apple.com