【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学習に使用した参考書

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index