【SwiftUI】@AppStorageとは?UserDefaultsにデータを保持する方法
この記事からわかること
- Swift UIの@AppStorageの使い方と実装方法
- UserDefaultsとは?
- アプリが停止してもデータを保持させるには?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
アプリが停止してもデータを保持させるために使用する@AppStorage
と UserDefaults
の使い方と実装方法をまとめていきたいと思います。
@AppStorageとは?
@frozen @propertyWrapper struct AppStorage
Swift UIの@AppStorage
は付与された変数の値を指定したUserDefaults内へ保存してくれるプロパティラッパの1つです。
@AppStorage
を使うことでUserDefaultsへの操作をSwiftUIでも簡単に行えるようになるのが大きなメリットとなっています。
UserDefaultsとは?
「UserDefaults」とはいわゆるアプリ内に生成されるデータベースのようなものでアプリが停止してもデータを保持することが可能になっています。
アプリを削除しない限りデータが失われることが無いので、半永続的に管理したいデータやアプリを停止しても保持していたい値などを格納しておくことで簡単に再利用可能になっています。
格納するデータは文字列のキー値と任意の値との関係性を持って保持されていきます。
SwiftではUserDefaults
クラスが用意されています。このクラスは「UserDefaults」を操作するためのインターフェース(CRUD操作など)を提供しています。
class UserDefaults : NSObject
Swift UI:@AppStorageの使い方
Swift UIの場合は@AppStorage
を使うことでUserDefaults
クラスを使わなくても「UserDefaults」への操作が可能になります。
@AppStorage
を以下のような形式でキー値と値を渡すことで「UserDefaults」の値と変数を紐づけることができます。
@AppStorage("キー値") var 変数名 = ""
これで「UserDefaults」 内に指定のキー値の項目が作成され、指定した変数に値が格納されるとそれが「UserDefaults」にも反映されるようになります。
またアプリを一度停止させて、再度起動させた場合でも「UserDefaults」内の該当キー値に紐づいて値が保存されているので変数にはその値が格納された状態で動作していきます。
使用例
私が実際にアプリ開発の際に使用したコードの1部分を載せておきます。これはリワード広告の視聴を1日1回に制限するために@AppStorage
を使って最終視聴日を保持してます。
@State var isAlertReward:Bool = false // リワード広告視聴回数制限アラート
@AppStorage("LastAcquisitionDate") var lastAcquisitionDate = ""
func nowTime() -> String{
let df = DateFormatter()
df.calendar = Calendar(identifier: .gregorian)
df.locale = Locale(identifier: "ja_JP")
df.timeZone = TimeZone(identifier: "Asia/Tokyo")
df.dateStyle = .short
df.timeStyle = .none
return df.string(from: Date())
}
Button(action: {
// 最終視聴日と現在の日付を比較
if lastAcquisitionDate != nowTime() {
reward.showReward()
lastAcquisitionDate = nowTime() // 最終視聴日を格納
}else{
isAlertReward = true
}
}) {
Text("広告を視聴する")
}
.onAppear() {
reward.loadReward()
}
.disabled(!reward.rewardLoaded)
.alert(isPresented: $isAlertReward){
Alert(title:Text("お知らせ"),
message: Text("広告を視聴できるのは1日に1回までです"),
dismissButton: .default(Text("OK"),
action: {}))
}
このように@AppStorage
を付与した変数は通常の変数のように扱えるのでSwiftUIを使う上でCRUD操作を意識することなく使用できます。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。
私がSwift UI学習に使用した参考書