IT アプリ開発

【SwiftUI】@AppStorageでモバイルデバイスにデータを保存しよう!

2021年12月29日


わかりやすい

Swiftuiでは属性で@AppStorageというものがある。
従来モバイルデバイスにデータを保存する方法としてUserDefaultというものがあったが、
@AppStorageを用いることでより簡単にデバイスにデータを保存することが可能になった。

その属性の1つである@AppStorageについてまとめようと思います!

@AppStorageとはデータを保存するもの

AppStorageでは、バックグラウンドがUserDefaultになっていて、
AppStorageを使っても、結局はUserDefaultに保存されているということになります。
UserDefaultに保存すると永続性があるので、当然AppStorageに保存しても永続性があるわけで、
AppStorageに保存したデータはアプリが終了しても永続的にモバイルデバイスにデータを保存しているため、
再度アプリを起動すると、保存している値を取ってくることができる。
逆にアプリをアンインストールすると、そのアプリでAppStorageに保存したデータは削除される。

import SwiftUI

@main
struct AppMain: App {
    
    @UIApplicationDelegateAdaptor (AppDelegate.self) var appDelegate
    
    class AppDelegate: UIResponder, UIApplicationDelegate {
        
            func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
                return true
            }
        }
        
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

struct ContentView: View {
    
    @AppStorage("name") private var name:String = "first"
    
    var body: some View {
        Text("\(self.name)")
        Form(){
            TextField("氏名を入力してください", text: $name)
        }
 
    }
}

ビルドして最初にFirstとは入っています。
そしてSecondと入力し、ビルドを停止し再度ビルドをかけてアプリを起動させます。
そうすると、Secondになっているのが確認できます。

ビルドしたアプリを削除し、再度ビルドするとFirstになります。

SceneStorage

SceneStorageでは、AppStorageと書き方は同じですが、
Sceneという考えが大事になってきます。
デバイスを再起動した場合でも,
@SceneStorageでデータを保存していれば、システムはデータを復元してくれる。
データはシーンごとに保存され、それぞれのシーンでデータは共有されないし、データ保存はシステムが管理していて、いつどのくらいの頻度でデータを保存するかはわからない。

まずそもそもScene(シーン)とは

https://crystalminds.medium.com/introducing-scenestorage-in-swiftui-5a4ec1a90ca3

SwiftUI Data Persistence using AppStorage and SceneStorage


さて、使用する前に@SceneStorage、Appleからいくつかの重要な警告があります。

  • 大量のデータを保存しないでください。状態の復元に必要なものだけを保存します。
  • 安全ではないため、機密データをシーンストレージに保存しないでください。
  • ユーザーがアプリスイッチャーにアクセスしてアプリを破棄すると、シーンストレージも破棄されます。

https://www.hackingwithswift.com/quick-start/swiftui/what-is-the-scenestorage-property-wrapper

-IT, アプリ開発
-

© 2024 Yosshi Labo. Powered by AFFINGER5