React NativeでAsyncStorageを使ったローカルデータ管理の完全ガイド

React Nativeでモバイルアプリを開発する際、ローカルにデータを保存することは、多くのシナリオで不可欠です。ユーザー設定の保存、セッションデータの保持、オフライン時のデータ利用など、さまざまな用途でローカルストレージが必要になります。その中で、React NativeのAsyncStorageは、シンプルかつ効果的なローカルストレージソリューションとして広く利用されています。本記事では、AsyncStorageを使用してデータを保存・取得・削除する方法から、実用的な応用例までを詳しく解説します。AsyncStorageを最大限に活用して、よりユーザーフレンドリーなアプリケーションを開発する方法を習得しましょう。

目次
  1. AsyncStorageとは何か
    1. AsyncStorageの概要
    2. AsyncStorageの特徴
    3. AsyncStorageの使用例
  2. AsyncStorageのインストールとセットアップ
    1. AsyncStorageのインストール手順
    2. セットアップの確認
    3. インストール時の注意点
  3. データの保存方法
    1. AsyncStorageでデータを保存する基本
    2. 基本的な保存方法
    3. オブジェクトを保存する方法
    4. 複数のデータを一度に保存する方法
    5. 保存操作時の注意点
  4. データの取得方法
    1. AsyncStorageでデータを取得する基本
    2. 基本的な取得方法
    3. オブジェクトを取得する方法
    4. 複数のデータを一度に取得する方法
    5. 取得操作時の注意点
  5. データの削除とクリア方法
    1. 特定のデータを削除する方法
    2. すべてのデータをクリアする方法
    3. 複数のデータを一部削除する方法
    4. 削除操作時の注意点
  6. 非同期操作のエラーハンドリング
    1. AsyncStorageでのエラーハンドリングの重要性
    2. 基本的なエラーハンドリング
    3. エラーの種類を区別する
    4. 容量不足の問題への対処
    5. ログとモニタリングの導入
    6. エラーハンドリングのベストプラクティス
  7. 実用的な応用例:設定データの保存
    1. 設定データの保存にAsyncStorageを使用する理由
    2. テーマ設定を保存する実装例
    3. 通知設定の保存
    4. 言語設定の保存
    5. ユーザー設定保存の注意点
  8. AsyncStorageを使ったセッション管理
    1. セッション管理の概要
    2. 認証トークンの保存と利用
    3. セッションの有効期限の管理
    4. ログアウト機能の実装
    5. セッション管理の注意点
  9. 注意点とベストプラクティス
    1. AsyncStorageを使用する際の注意点
    2. AsyncStorageのベストプラクティス
    3. 定期的なデータのクリーンアップ
    4. まとめ
  10. まとめ

AsyncStorageとは何か

AsyncStorageの概要


AsyncStorageは、React Nativeでローカルストレージを管理するための非同期APIです。軽量なキーバリューストアとして機能し、アプリケーションのデータをデバイスに保存する際に利用されます。これにより、ユーザーの設定、セッションデータ、オフライン用のデータなどを保存することができます。

AsyncStorageの特徴

  • 非同期操作: AsyncStorageは非同期で動作し、メインスレッドのパフォーマンスに影響を与えません。
  • キーバリューストア: データをキーと値のペアとして保存します。
  • クロスプラットフォーム: AndroidおよびiOSで同じAPIを使用できます。

AsyncStorageの使用例


例えば、ユーザーのダークモード設定を保存する場合、次のように利用できます:

import AsyncStorage from '@react-native-async-storage/async-storage';

// 設定を保存
await AsyncStorage.setItem('darkMode', 'enabled');

// 設定を取得
const darkModeSetting = await AsyncStorage.getItem('darkMode');
console.log(darkModeSetting); // 'enabled'

このように、簡単にデータの保存や取得を実現できるため、多くの開発者にとって便利なツールです。

AsyncStorageのインストールとセットアップ

AsyncStorageのインストール手順


React NativeプロジェクトでAsyncStorageを使用するためには、公式ライブラリである@react-native-async-storage/async-storageをインストールする必要があります。以下の手順でインストールを行います。

  1. ライブラリのインストール
    プロジェクトのルートディレクトリで以下のコマンドを実行します:
   npm install @react-native-async-storage/async-storage

または

   yarn add @react-native-async-storage/async-storage
  1. リンクの実行(React Native 0.60未満の場合)
    自動リンクに対応していない場合、以下のコマンドでリンクを実行します:
   react-native link @react-native-async-storage/async-storage
  1. ネイティブコードの設定
    React Native 0.60以上を使用している場合、pod installを実行してネイティブ依存関係をインストールします(iOSプロジェクトのみ)。
   cd ios
   pod install
   cd ..

セットアップの確認


インストールが完了したら、AsyncStorageが正しく動作するか確認するために、簡単なテストコードを実行します:

import AsyncStorage from '@react-native-async-storage/async-storage';

const testAsyncStorage = async () => {
  try {
    await AsyncStorage.setItem('testKey', 'testValue');
    const value = await AsyncStorage.getItem('testKey');
    console.log('Stored value:', value); // Output: 'Stored value: testValue'
  } catch (error) {
    console.error('AsyncStorage Error:', error);
  }
};

testAsyncStorage();

インストール時の注意点

  • バージョンの互換性: 使用しているReact Nativeのバージョンに対応したAsyncStorageのバージョンを確認してください。
  • エラー時の対応: ネイティブモジュールに関連するエラーが発生する場合は、react-native-cleanpod installを再実行することで解消できる場合があります。

これでAsyncStorageのインストールとセットアップが完了し、アプリで利用する準備が整いました。

データの保存方法

AsyncStorageでデータを保存する基本


AsyncStorageを利用することで、デバイスのローカルストレージにキーと値の形式でデータを保存できます。この保存操作は非同期で行われ、アプリのパフォーマンスに影響を与えません。

基本的な保存方法


以下は、データを保存する最も基本的な例です:

import AsyncStorage from '@react-native-async-storage/async-storage';

const saveData = async () => {
  try {
    await AsyncStorage.setItem('username', 'JohnDoe');
    console.log('Data successfully saved!');
  } catch (error) {
    console.error('Failed to save data:', error);
  }
};

saveData();

オブジェクトを保存する方法


AsyncStorageは文字列のみを保存できますが、JSON.stringifyを使えばオブジェクトも保存可能です。

const saveObject = async () => {
  const user = {
    name: 'John Doe',
    age: 30,
    isPremium: true,
  };

  try {
    await AsyncStorage.setItem('user', JSON.stringify(user));
    console.log('Object successfully saved!');
  } catch (error) {
    console.error('Failed to save object:', error);
  }
};

saveObject();

複数のデータを一度に保存する方法


複数のデータを一度に保存するには、multiSetメソッドを使用します。

const saveMultipleData = async () => {
  const entries = [
    ['key1', 'value1'],
    ['key2', 'value2'],
    ['key3', 'value3'],
  ];

  try {
    await AsyncStorage.multiSet(entries);
    console.log('Multiple data saved successfully!');
  } catch (error) {
    console.error('Failed to save multiple data:', error);
  }
};

saveMultipleData();

保存操作時の注意点

  • ストレージ容量: AsyncStorageは小規模なデータ保存を目的としています。大量のデータを保存する場合、別の方法(SQLiteやRealmなど)を検討する必要があります。
  • エラーハンドリング: 保存操作が失敗した場合に備え、適切なエラーハンドリングを実装しましょう。

これらの方法を活用することで、React Nativeアプリに必要なデータを簡単に保存することができます。

データの取得方法

AsyncStorageでデータを取得する基本


AsyncStorageでは保存されたデータをキーを使って簡単に取得することができます。この操作も非同期で行われます。

基本的な取得方法


以下は、getItemメソッドを使って保存されたデータを取得する例です。

import AsyncStorage from '@react-native-async-storage/async-storage';

const getData = async () => {
  try {
    const value = await AsyncStorage.getItem('username');
    if (value !== null) {
      console.log('Retrieved value:', value);
    } else {
      console.log('No value found for the given key.');
    }
  } catch (error) {
    console.error('Failed to retrieve data:', error);
  }
};

getData();

オブジェクトを取得する方法


保存されたオブジェクトはJSON.parseを使ってデシリアライズできます。

const getObject = async () => {
  try {
    const jsonValue = await AsyncStorage.getItem('user');
    if (jsonValue !== null) {
      const user = JSON.parse(jsonValue);
      console.log('Retrieved object:', user);
    } else {
      console.log('No object found for the given key.');
    }
  } catch (error) {
    console.error('Failed to retrieve object:', error);
  }
};

getObject();

複数のデータを一度に取得する方法


複数のキーに対応するデータを取得するには、multiGetメソッドを使用します。

const getMultipleData = async () => {
  const keys = ['key1', 'key2', 'key3'];

  try {
    const result = await AsyncStorage.multiGet(keys);
    result.forEach(([key, value]) => {
      console.log(`Key: ${key}, Value: ${value}`);
    });
  } catch (error) {
    console.error('Failed to retrieve multiple data:', error);
  }
};

getMultipleData();

取得操作時の注意点

  • キーの存在チェック: nullが返される場合は、そのキーに関連付けられたデータが存在しないことを意味します。
  • データ型の変換: 保存時に文字列化されたオブジェクトを取り出す際は、必ずJSON.parseで復元してください。
  • 効率性: 頻繁に利用されるデータの場合は、一時的にアプリ内でキャッシュすることを検討してください。

これらの方法を活用することで、AsyncStorageに保存されたデータを簡単に取得し、アプリケーションのロジックに活用できます。

データの削除とクリア方法

特定のデータを削除する方法


AsyncStorageから特定のデータを削除するには、removeItemメソッドを使用します。以下は具体的な例です。

import AsyncStorage from '@react-native-async-storage/async-storage';

const removeData = async () => {
  try {
    await AsyncStorage.removeItem('username');
    console.log('Data successfully removed!');
  } catch (error) {
    console.error('Failed to remove data:', error);
  }
};

removeData();

このコードは、キーusernameに関連付けられたデータを削除します。

すべてのデータをクリアする方法


アプリケーションのすべてのデータを削除したい場合は、clearメソッドを使用します。これはAsyncStorage内のすべてのデータを一括して削除します。

const clearAllData = async () => {
  try {
    await AsyncStorage.clear();
    console.log('All data successfully cleared!');
  } catch (error) {
    console.error('Failed to clear data:', error);
  }
};

clearAllData();

複数のデータを一部削除する方法


複数のキーに対応するデータを一部削除するには、multiRemoveメソッドを使用します。

const removeMultipleData = async () => {
  const keysToRemove = ['key1', 'key2', 'key3'];

  try {
    await AsyncStorage.multiRemove(keysToRemove);
    console.log('Multiple data successfully removed!');
  } catch (error) {
    console.error('Failed to remove multiple data:', error);
  }
};

removeMultipleData();

削除操作時の注意点

  • 意図しない削除の防止: 重要なデータを削除しないよう、キーを慎重に指定してください。
  • clearの慎重な使用: clearメソッドは全データを削除するため、ユーザーへの警告や確認画面を追加することを推奨します。
  • エラーハンドリング: 削除操作が失敗する可能性があるため、適切なエラーハンドリングを実装してください。

これらの方法を使用すれば、AsyncStorage内のデータを効率的に管理し、アプリの動作を最適化できます。

非同期操作のエラーハンドリング

AsyncStorageでのエラーハンドリングの重要性


AsyncStorageは非同期操作で動作するため、予期せぬエラーが発生する可能性があります。ネットワークの問題やストレージ容量の不足、無効なキーなど、エラーの原因は多岐にわたります。適切なエラーハンドリングを実装することで、アプリの信頼性を向上させ、ユーザー体験を損なわないようにすることが重要です。

基本的なエラーハンドリング


try-catchブロックを使用して、AsyncStorage操作中に発生するエラーをキャッチします。

import AsyncStorage from '@react-native-async-storage/async-storage';

const saveDataWithHandling = async () => {
  try {
    await AsyncStorage.setItem('username', 'JohnDoe');
    console.log('Data successfully saved!');
  } catch (error) {
    console.error('Error saving data:', error.message);
  }
};

saveDataWithHandling();

エラーの種類を区別する


エラーを区別して対応することで、適切なメッセージをユーザーに提供できます。

const getDataWithHandling = async () => {
  try {
    const value = await AsyncStorage.getItem('username');
    if (value === null) {
      throw new Error('No value found for the given key.');
    }
    console.log('Retrieved value:', value);
  } catch (error) {
    if (error.message.includes('No value')) {
      console.error('Custom Error: ', error.message);
    } else {
      console.error('Error retrieving data:', error);
    }
  }
};

getDataWithHandling();

容量不足の問題への対処


ストレージ容量が不足している場合は、以下のようにエラーメッセージをキャッチし、適切な通知を行います。

const saveLargeData = async () => {
  try {
    const largeData = new Array(10_000_000).fill('data').join(''); // 大量のデータを生成
    await AsyncStorage.setItem('largeKey', largeData);
  } catch (error) {
    if (error.message.includes('quota exceeded')) {
      console.error('Storage quota exceeded. Please free up space.');
    } else {
      console.error('Error saving large data:', error);
    }
  }
};

saveLargeData();

ログとモニタリングの導入


エラーの詳細を外部モニタリングサービスに送信することで、リアルタイムで問題を把握できます。たとえば、SentryやFirebaseを使用すると便利です。

import * as Sentry from '@sentry/react-native';

const saveDataWithMonitoring = async () => {
  try {
    await AsyncStorage.setItem('key', 'value');
  } catch (error) {
    Sentry.captureException(error);
    console.error('Error saved to monitoring service:', error);
  }
};

saveDataWithMonitoring();

エラーハンドリングのベストプラクティス

  • 詳細なエラーメッセージ: ユーザーにわかりやすいエラーメッセージを提供する。
  • デフォルト値の設定: データが取得できなかった場合の代替値を用意する。
  • ログ記録: 重要なエラーは記録し、開発者が後で分析できるようにする。

AsyncStorageのエラーハンドリングを適切に実装することで、予期しない問題に迅速に対応し、アプリの安定性を維持できます。

実用的な応用例:設定データの保存

設定データの保存にAsyncStorageを使用する理由


多くのアプリでは、テーマ設定や通知のオンオフ、言語選択などのユーザー設定を保存する必要があります。AsyncStorageを使えば、これらのデータを簡単にデバイス上に保存し、アプリを再起動しても設定が維持されるようにできます。

テーマ設定を保存する実装例


以下は、ユーザーが選択したテーマ設定(ライトモードまたはダークモード)を保存する例です。

import AsyncStorage from '@react-native-async-storage/async-storage';
import { useState, useEffect } from 'react';

const useThemeSetting = () => {
  const [theme, setTheme] = useState('light');

  const saveTheme = async (selectedTheme) => {
    try {
      await AsyncStorage.setItem('theme', selectedTheme);
      setTheme(selectedTheme);
      console.log('Theme saved:', selectedTheme);
    } catch (error) {
      console.error('Failed to save theme:', error);
    }
  };

  const loadTheme = async () => {
    try {
      const savedTheme = await AsyncStorage.getItem('theme');
      if (savedTheme) {
        setTheme(savedTheme);
        console.log('Loaded theme:', savedTheme);
      }
    } catch (error) {
      console.error('Failed to load theme:', error);
    }
  };

  useEffect(() => {
    loadTheme();
  }, []);

  return { theme, saveTheme };
};

export default useThemeSetting;

このカスタムフックを使用すると、テーマの状態を簡単に管理できます。

通知設定の保存


通知のオンオフを保存する場合の実装例を示します。

const saveNotificationSetting = async (isEnabled) => {
  try {
    await AsyncStorage.setItem('notifications', JSON.stringify(isEnabled));
    console.log('Notification setting saved:', isEnabled);
  } catch (error) {
    console.error('Failed to save notification setting:', error);
  }
};

const loadNotificationSetting = async () => {
  try {
    const savedSetting = await AsyncStorage.getItem('notifications');
    return savedSetting !== null ? JSON.parse(savedSetting) : true; // デフォルトは有効
  } catch (error) {
    console.error('Failed to load notification setting:', error);
    return true; // エラー時はデフォルト値を返す
  }
};

言語設定の保存


ユーザーが選択した言語を保存し、アプリ再起動後にも反映させる例です。

const saveLanguage = async (language) => {
  try {
    await AsyncStorage.setItem('language', language);
    console.log('Language saved:', language);
  } catch (error) {
    console.error('Failed to save language setting:', error);
  }
};

const loadLanguage = async () => {
  try {
    const savedLanguage = await AsyncStorage.getItem('language');
    return savedLanguage || 'en'; // デフォルトは英語
  } catch (error) {
    console.error('Failed to load language setting:', error);
    return 'en'; // エラー時はデフォルト値を返す
  }
};

ユーザー設定保存の注意点

  • デフォルト値の準備: 保存された設定が存在しない場合に備え、明確なデフォルト値を用意しましょう。
  • データの整合性: 設定データが正しい形式で保存されているかを確認するため、保存・取得時に検証を行います。
  • セキュリティ: 機密性が高いデータ(パスワードやセッショントークンなど)はAsyncStorageには保存せず、セキュアなストレージを利用してください。

このようにAsyncStorageを利用することで、設定データを効率的に管理でき、ユーザーに快適な体験を提供できます。

AsyncStorageを使ったセッション管理

セッション管理の概要


アプリケーションのセッション管理は、ユーザーのログイン状態や認証トークンを維持するために重要です。AsyncStorageを利用することで、セッション情報をデバイス上に保存し、アプリの再起動後でもセッションを継続できるようにします。

認証トークンの保存と利用


認証トークンを保存し、APIリクエスト時に使用する方法を以下に示します。

import AsyncStorage from '@react-native-async-storage/async-storage';

const saveAuthToken = async (token) => {
  try {
    await AsyncStorage.setItem('authToken', token);
    console.log('Auth token saved:', token);
  } catch (error) {
    console.error('Failed to save auth token:', error);
  }
};

const getAuthToken = async () => {
  try {
    const token = await AsyncStorage.getItem('authToken');
    return token || null; // トークンがない場合はnullを返す
  } catch (error) {
    console.error('Failed to retrieve auth token:', error);
    return null;
  }
};

保存したトークンを使ってAPIリクエストを行う例:

const fetchUserData = async () => {
  const token = await getAuthToken();
  if (!token) {
    console.error('No auth token found');
    return;
  }

  try {
    const response = await fetch('https://api.example.com/user', {
      headers: { Authorization: `Bearer ${token}` },
    });
    const data = await response.json();
    console.log('User data:', data);
  } catch (error) {
    console.error('Failed to fetch user data:', error);
  }
};

fetchUserData();

セッションの有効期限の管理


セッションの有効期限を管理するには、有効期限を合わせて保存し、チェックする仕組みを実装します。

const saveSession = async (token, expiryTime) => {
  const sessionData = {
    token,
    expiry: Date.now() + expiryTime, // 現在時刻 + 有効期限(ミリ秒)
  };

  try {
    await AsyncStorage.setItem('session', JSON.stringify(sessionData));
    console.log('Session saved:', sessionData);
  } catch (error) {
    console.error('Failed to save session:', error);
  }
};

const isSessionValid = async () => {
  try {
    const session = await AsyncStorage.getItem('session');
    if (session) {
      const { token, expiry } = JSON.parse(session);
      if (Date.now() < expiry) {
        return token;
      } else {
        console.log('Session expired');
        await AsyncStorage.removeItem('session');
      }
    }
  } catch (error) {
    console.error('Failed to validate session:', error);
  }
  return null;
};

ログアウト機能の実装


セッション情報をクリアしてログアウト状態にする方法です。

const logout = async () => {
  try {
    await AsyncStorage.removeItem('session');
    console.log('Logged out successfully');
  } catch (error) {
    console.error('Failed to log out:', error);
  }
};

logout();

セッション管理の注意点

  • セキュリティ: 認証トークンは可能であればSecureStoreなどのセキュアなストレージに保存してください。
  • 有効期限の確認: セッションが無効な場合、適切にリフレッシュトークンを使用するなどの仕組みを実装しましょう。
  • エラーハンドリング: トークンがない、または無効な場合の動作を明確に定義します。

このように、AsyncStorageを使ってセッション管理を実装することで、アプリケーションの認証システムを強化し、ユーザー体験を向上させることができます。

注意点とベストプラクティス

AsyncStorageを使用する際の注意点


AsyncStorageを効果的に利用するためには、以下の点に注意する必要があります。

1. 保存データのセキュリティ


AsyncStorageは暗号化を提供しないため、機密性の高いデータ(パスワードやトークンなど)を保存する場合は避けるべきです。セキュリティが重要な場合は、SecureStoreKeychainの使用を検討してください。

2. ストレージの容量制限


AsyncStorageは軽量データの保存を目的としており、大量のデータを保存する場合にはSQLiteやRealmなどのデータベースソリューションを使用することを推奨します。

3. 非同期処理のエラーハンドリング


非同期処理でエラーが発生する可能性があるため、すべての操作にtry-catchブロックを追加してエラーを適切に処理するようにしましょう。

AsyncStorageのベストプラクティス

1. データの構造化


保存するデータは、可能な限りキー名をわかりやすく命名し、複数のデータを保存する場合はオブジェクトや配列にまとめて保存します。

const userSettings = {
  theme: 'dark',
  notifications: true,
  language: 'en',
};

await AsyncStorage.setItem('userSettings', JSON.stringify(userSettings));

2. 一貫したデータ形式


データの保存形式を統一し、取得時に適切にパースすることで、バグを防ぎます。

const getSettings = async () => {
  try {
    const settings = await AsyncStorage.getItem('userSettings');
    return settings ? JSON.parse(settings) : {};
  } catch (error) {
    console.error('Error retrieving settings:', error);
    return {};
  }
};

3. パフォーマンスの最適化


頻繁にアクセスするデータはアプリ内でキャッシュし、AsyncStorageへのアクセスを最小限に抑えます。

定期的なデータのクリーンアップ


不要なデータがストレージに残らないよう、データの削除やクリーンアップを定期的に行います。

const clearUnusedData = async () => {
  try {
    const keys = await AsyncStorage.getAllKeys();
    if (keys.includes('oldKey')) {
      await AsyncStorage.removeItem('oldKey');
      console.log('Unused data cleared');
    }
  } catch (error) {
    console.error('Failed to clear unused data:', error);
  }
};

clearUnusedData();

まとめ


AsyncStorageは、React Nativeでローカルデータを簡単に管理するための便利なツールです。ただし、適切な使い方や制限事項を理解し、セキュリティやパフォーマンスに注意を払うことが重要です。これらのベストプラクティスを活用することで、より信頼性の高いアプリを構築できます。

まとめ

本記事では、React NativeにおけるAsyncStorageを使ったローカルデータ管理の方法を解説しました。AsyncStorageの基本的な使い方から、データの保存、取得、削除の方法、非同期操作のエラーハンドリング、さらに実用的な応用例として設定データの管理やセッション管理の実装方法を取り上げました。

AsyncStorageはシンプルで使いやすいツールですが、セキュリティやストレージ容量に関する注意点を理解し、ベストプラクティスを守ることで、より堅牢なアプリケーションを開発できます。今回の知識を活用し、ユーザーにとって使いやすいアプリケーションを構築してください。

コメント

コメントする

目次
  1. AsyncStorageとは何か
    1. AsyncStorageの概要
    2. AsyncStorageの特徴
    3. AsyncStorageの使用例
  2. AsyncStorageのインストールとセットアップ
    1. AsyncStorageのインストール手順
    2. セットアップの確認
    3. インストール時の注意点
  3. データの保存方法
    1. AsyncStorageでデータを保存する基本
    2. 基本的な保存方法
    3. オブジェクトを保存する方法
    4. 複数のデータを一度に保存する方法
    5. 保存操作時の注意点
  4. データの取得方法
    1. AsyncStorageでデータを取得する基本
    2. 基本的な取得方法
    3. オブジェクトを取得する方法
    4. 複数のデータを一度に取得する方法
    5. 取得操作時の注意点
  5. データの削除とクリア方法
    1. 特定のデータを削除する方法
    2. すべてのデータをクリアする方法
    3. 複数のデータを一部削除する方法
    4. 削除操作時の注意点
  6. 非同期操作のエラーハンドリング
    1. AsyncStorageでのエラーハンドリングの重要性
    2. 基本的なエラーハンドリング
    3. エラーの種類を区別する
    4. 容量不足の問題への対処
    5. ログとモニタリングの導入
    6. エラーハンドリングのベストプラクティス
  7. 実用的な応用例:設定データの保存
    1. 設定データの保存にAsyncStorageを使用する理由
    2. テーマ設定を保存する実装例
    3. 通知設定の保存
    4. 言語設定の保存
    5. ユーザー設定保存の注意点
  8. AsyncStorageを使ったセッション管理
    1. セッション管理の概要
    2. 認証トークンの保存と利用
    3. セッションの有効期限の管理
    4. ログアウト機能の実装
    5. セッション管理の注意点
  9. 注意点とベストプラクティス
    1. AsyncStorageを使用する際の注意点
    2. AsyncStorageのベストプラクティス
    3. 定期的なデータのクリーンアップ
    4. まとめ
  10. まとめ