メイン コンテンツにスキップ
Mobile Guides

React Native アラートのマスター: API ガイド & ベスト プラクティス

React Native アラートの API をマスターする。アラート、確認、プラットフォームの差異を取り扱うアクセシビリティのベスト プラクティスを作成する。

マーティン ドナディュー

マーティン ドナディュー

コンテンツ マーケター

React Native アラートのマスター: API ガイド & ベスト プラクティス

React Native でアラートをトリガーする Alert.alert() iPhone と Android でテストし、完了と感じる。すると、誰かがウェブビルドを開き、表示されない。あるいは、Android は iOS で使用したプロンプト フローのうちいくつかを無視する。あるいは、2 つのアプリのパーツが同時にアラートを発火し、ユーザーはダイアログの乱雑なスタックに閉じ込められる。

React Native アラートの API は、速い、ネイティブな確認フローに素晴らしいものです。でも、狭く、プラットフォームに依存し、生産環境で誤用しやすいものです。幸いなことに、ハッピーパスは簡単で、粗い部分は予測可能です。

目次

Alert.alert を使用してシンプルなメッセージを表示

基本的な通知 UI の場合 React Native Alert はまだ最速の道具です。 Alertをインポートし、 Alert.alert()を呼び出し、

プラットフォームはネイティブのダイアログをレンダリングします。

import React from 'react';
import { View, Button, Alert } from 'react-native';

export default function ProfileScreen() {
  const showSavedMessage = () => {
    Alert.alert('Profile updated', 'Your changes were saved successfully.');
  };

  return (
    <View style={{ padding: 24 }}>
      <Button title="Save profile" onPress={showSavedMessage} />
    </View>
  );
}

必要な依存関係なし、カスタムモーダル状態なし、スタイリングの作業なし。

最も単純なバージョンでは、タイトルとメッセージのみが必要です。

スマートフォンを使用する人の近景。画面に単純なアラートメッセージが表示されています。

ユーザーが意味のある選択をしなくてもよい場合に、このパターンはよく機能します。例えば、「設定が保存されました」、「セッションが期限切れ」、「現在は機能が利用できません」などです。ダイアログは流れを妨げるので、ユーザーがすぐに必要な情報を伝えるようにしてください。ただし、ユーザーに大きな影響を与えないようなステータス情報は伝えずにください。 Alert.alert(title, message) 基本的な呼び出しによって得られるものは何ですか。

は、基本的な呼び出しを提供します。

  • は、操作系の表示、ボタンの役割、標準的なインタラクションパターンをOSが管理するため、ネイティブなまま残ります。多くのチームにとって、これが正しいトレードオフです。. “アップロード失敗”は「注意」よりも明確です。
  • . メッセージを短く保つ. アラートは即時のコンテキストにのみ使用する。長文の説明は含まない
  • . ブロッキング情報にのみアラートを予約する. ユーザーが中断なく続けることができる場合、トーストはよく適している

. アラートは小さく決断的なものに保つ。ユーザーが長文を読む必要がある場合、ダイアログは不適切なUIである

. チームが誤用する場面

. 最も一般的な誤用は、アラートを一般的なメッセージングシステムとして使用することです。成功アクションのすべてがブロッキングダイアログを表示すると、すぐにアプリが重く感じられるようになります。

. アラートは、ユーザーを停止させる理由がある場合にのみ、ネイティブアラートが最も強力です。 . また、アラートをコンポーネントの内部に密接に結び付けることにも誤用があります。小さなボタンハンドラーは最初は問題ありませんが、フローの流れが複数の画面と非同期アクションを跨ぐようになると、アラート呼び出しが散在することで、推論が困難になります。.

. そのため、チームはしばしば標準化されたUXパターンを早期に標準化し、React Native アプリのスプラッシュスクリーン動作と同様に

. 単純なアラートの良い使用例のシナリオ Alertの機能
__CAPGO_KEEP_0__の確認後、重要な設定変更後 ユーザーは明確な承認が必要
セッションタイムアウトの警告 メッセージは緊急で、行動を促す
非対応機能の通知 アプリは停止し、説明する必要があります

__CAPGO_KEEP_0__で必要な場合、ユーザーに選択肢を提示する必要がある場合、次のステップは buttons 配列です。 これは Alert.alert() 単なるメッセージBOXより

ユーザー入力を確認するための確認ボタン

実際のアラートの使用は、情報を伝えるのではなく、決定を求めることです。 ドラフトを削除、変更を破棄、サインアウト、失敗した要求を再試行する。 これが buttons 配列は重要です。

ここでは、一般的な確認ダイアログを示します。

import React from 'react';
import { View, Button, Alert } from 'react-native';

export default function DangerZone() {
  const confirmDelete = () => {
    Alert.alert(
      'Delete item',
      'This action cannot be undone.',
      [
        {
          text: 'Cancel',
          style: 'cancel',
        },
        {
          text: 'Delete',
          style: 'destructive',
          onPress: () => {
            console.log('Deleting item...');
          },
        },
      ]
    );
  };

  return (
    <View style={{ padding: 24 }}>
      <Button title="Delete item" onPress={confirmDelete} />
    </View>
  );
}

木の机の上のコントロールコンソールで赤と緑のボタンを押している人。

各ボタンはオブジェクトです。実際には、3つのプロパティを頻繁に使用します。

  • text ユーザーに表示されるラベルです。
  • onPress そのボタンがタップされたときに実行される関数です。
  • style iOSでは特に、意味を伝えるために使用されます。

誤差を最小限に抑えるボタンラベルの選択

APIは「OK」というラベルを書き、進むことができます。通常では十分ではありません。ラベルは、破壊的なアクションの場合に特に、結果を説明するようにする必要があります。

これら2つのセットを比較してください。

  • 弱いラベルOK / Cancel
  • より良いラベル: 削除 / 保持

2 番目のバージョンは曖昧さを排除します。破壊的なフローでは重要であり、エラーまたは非同期オペレーション後に表示されるアラートではさらに重要です。ボタン テキストは、タップすると何が起こるかを答えるべきです。

ユーザーからテキストを収集するフローがある場合、明示的なフォーム入力と組み合わせることで、クリーンなパターンが得られます。たとえば、 React Native TextInput の実装 ダイアログをオーバーエクステンドするのではなく、

どのボタン スタイルが実際に何を意味するか

フィールドは意味論的であり、装飾的ではありません。意図を伝えるために使用してください。 style スタイル

使用するとき メモ placeholder
default 通常のアクション 中立的な選択肢の場合に適しています
cancel 終了または戻る 安全な解決のために重要
destructive 取り消しできないアクション iOS上で視覚的に強調されます

Gluestackのノートから技術的なベンチマークによると、プラットフォームの慣習がここで重要です。iOSでは左側にキャンセルボタン、右側に確認ボタンを配置し、Androidはその逆です。慣習を破ると、ユーザーの混乱指標が世界市場で急上昇します。 キャンセル ボタン 確認 確認 25% in global markets, and 45% 生産アプリの重要なパスアラートが、キャンセルまたは終了パスを含まないことが多いことは、不可逆的なアクションとサポートの増加につながる。同様の分析では、障害技術の読み取り順序で失敗するカスタムアラート実装がよくあることも指摘している。詳しくは Gluestack アラートガイド.

実践的なルール: すべての破壊的なアラートには明示的な出口が必要である。

ボタン設定とインタラクションフローの視覚的なウォークスルーをより詳しく見るには、この短いデモが見どころだ。

より安全な確認パターン

アクションが敏感な場合、コールバックを薄く保つ。

Alert.alert(
  'Sign out',
  'You will need to log in again to continue.',
  [
    { text: 'Stay signed in', style: 'cancel' },
    {
      text: 'Sign out',
      style: 'destructive',
      onPress: async () => {
        try {
          await signOut();
        } catch (error) {
          Alert.alert('Sign out failed', 'Please try again.');
        }
      },
    },
  ]
);

そのパターンは面白くないが、それが良い理由だ。アラートは予測可能でなければならない。

生産環境でよく見られるコモンなバグは、このようになっている。同様の Alert.alert() コールはiOSで動作し、Androidでも動作するが、チームがウェブビルドをリリースすると機能しなくなり、APIはcodeで統一されているように見えるが、プラットフォームは異なる。

iOSとAndroidのReact Native開発におけるプラットフォーム固有の差異を強調する比較表

IOSとAndroidは完全に一致しません。

ボタンの順序は、チームが最初に足りないところです。React Nativeはアラートをオペレーティングシステムに委任するため、ユーザーはネイティブの慣習を、React Nativeの抽象化ではなく見ることになります。そのことは通常、正しい取引ですが、ボタンラベルはプラットフォームをまたいだときに曖昧さを避ける必要があります。

プロンプトのサポートは、より大きな一致の欠如です。iOSは軽量のテキスト入力 Alert.prompt をサポートしています。Androidはサポートしていません。フローがパスワードを入力する、アイテムを再命名する、またはアラート内で短いメモをキャプチャする場合、そのフローはiOSのみで実行されます、除いて、別のパスを作成することです。

プラットフォームのチェックを早く行うのではなく、APIが一致していることを仮定するのではなく。

import { Alert, Platform } from 'react-native';

export function requestPassword() {
  if (Platform.OS === 'ios') {
    Alert.prompt(
      'Enter password',
      'Please confirm your password.',
      [
        { text: 'Cancel', style: 'cancel' },
        {
          text: 'Continue',
          onPress: (value) => {
            console.log('Password entered:', value);
          },
        },
      ],
      'secure-text'
    );
    return;
  }

  Alert.alert(
    'Confirmation required',
    'Please continue to the next screen to confirm this action.',
    [{ text: 'OK' }]
  );
}

Androidのフォールバックは、より不便です。まだ、より安全な選択肢です。生産環境では、リダイレクトを使用して、モーダルを制御した画面にアクセスすること、または、サポートされていない動作を中心に作られた偽のプロンプトよりも、テスト、ローカライズ、またはアクセシビリティが容易です。

Webサポートには独自の計画が必要です。

React Nativeの公式アラートAPIドキュメントは、iOSとAndroidのサポートをリストしています。 React Nativeのアラートリファレンス。React Native WebまたはExpo Webでもアプリが実行される場合、警告をunwrapしたままにすると、Webビルドのインタラクションパスで完全に失敗します(React Native Webのアラートサポートに関する問題の議論。).

それは、特にnicheのエッジケースではありません。チームは、最初にモバイルQAが通過するのに対して、ブラウザのカバレージが後で発見されることがよくあります。

native Alertをネイティブアプリとして扱う場合は、wrapperを追加するまでモバイルのみにします。

wrapperは、チームがプラットフォーム間のハイブリッドランタイムのトレードオフを比較する際に特に便利です。 React NativeとCapacitorアーキテクチャの比較.

Webのポリフィルパター

多くのアプリでは、最初の実行可能な修正は、プラットフォームのスプリットを小さな抽象化として実装することです。

import { Alert, Platform } from 'react-native';

type ConfirmOptions = {
  title: string;
  message?: string;
  onConfirm?: () => void;
  onCancel?: () => void;
};

export function confirmDialog({
  title,
  message,
  onConfirm,
  onCancel,
}: ConfirmOptions) {
  if (Platform.OS === 'web') {
    const result = window.confirm(message ? `${title}\n\n${message}` : title);
    if (result) onConfirm?.();
    else onCancel?.();
    return;
  }

  Alert.alert(title, message, [
    { text: 'Cancel', style: 'cancel', onPress: onCancel },
    { text: 'OK', onPress: onConfirm },
  ]);
}

このパターンは、即時サポートのギャップを解決しますが、限界があります。 window.confirm スタイリング、フォーカス動作、分析ハックの制御がほとんどありません。簡単な確認のための安全なネットワークとしては十分ですが、アクセシビリティレビュー、警告キュー、モバイルとWeb両方で一貫した動作が必要なフローには、最終的な答えではありません。

カスタムモーダルを使用する際の使用条件

ネイティブアラートダイアログは強力ですが、制限が強い。同じ制限が、__CAPGO_KEEP_0__に抗戦することの理由でもあります。

ブランド化、レイアウト制御、アイコン、フォームフィールド、カスタムスペーシング、アニメーションタイミング、クロスプラットフォームの視覚的一貫性が必要な場合は、カスタムモーダルを使用してください。 カスタムモーダルを使用する際の使用条件ネイティブアラートダイアログは、制限が強いことから強力ですが、制限が強いことから、APIに抗戦することの理由でもあります。

A brass padlock sitting next to a complex metal clockwork gear mechanism on a white surface.

Native alert を使用すると、code を回避できません。

あなたは Alert.alert() あなたのデザインシステムに似たようなものを作ることはできません。それは意図的にそう設計されています。React Native はレンダリングをオペレーティングシステムに任せているため、ネイティブの外観とネイティブの制約を継承します。

それは、速い確認を求める場合に良いことです。しかし、製品が以下のいずれかを要求する場合に悪いことです。

  • ロゴ、ヘルプテキスト、カスタム階層を備えたブランドの確認ダイアログ モーダル内にマルチフィールドフォーム
  • チェックボックスの確認を含むより複雑な破壊フロー 評価の求められたポップアップまたはレビューの要求
  • targetLanguage protectedTokens
  • texts __CAPGO_KEEP_0__

星やイラスト、カスタムボタンを使用したダイアログ

ネイティブアラートが表示されるまでの要件が表示されると、ネイティブアラートは死角になる

シンプルな決定フィルター 使用 React Native アラート

ダイアログが以下の場合に使用 ネイティブアラートを使用
カスタムモーダルを使用 短いメッセージ
構造化されたコンテンツ 基本的なアクションが1つから3つ
プラットフォーム固有の見た目は許容される プラットフォームをまたがっての視覚的一貫性は重要
あなたは最速の実装を求めている レイアウトとアニメーション制御が必要

モバイルとウェブのビルドが同じ動作を必要とする場合、カスタムモーダルは役に立つ。各プラットフォームを特別に扱う必要がなくなるため、1つのダイアログコンポーネントを中心に統一し、インタラクションモデルを一貫させることができる。

Alertが「もう一つのプロパティ」を持つだけで済むようなら、モーダルが必要だ

カスタムモーダルライブラリの候補

組み込みのコンポーネントは機能するが、多くのチームは「」のようなラッパーを使用する。表示、背景、アニメーションの制御を実用的なコントロールとして追加するためである。 Modal アクションシート、ボトムドロワー、または組み込まれた確認パネルに似たフローでは特に有効である。 react-native-modal メニューに近いデザインの場合、関連するUIパターンとして「」のようなアクションシートも考慮される

__CAPGO_KEEP_0__ __CAPGO_KEEP_1__ しばしば、Alert を形作りにすることに比べて、より良い認識モデルを提供します。

1 つの警告はここで重要です。すべてのアラートをカスタム モーダルに置き換えるのではなく、システムの chrome を嫌う設計チームのためだけに、ネイティブ アラートは速度、親しみやすさ、低い実装リスクで勝ちます。モーダルを使用するのは、インタラクションがそれを必要とする場合、システムの chrome を嫌う設計チームのためだけに、ネイティブ アラートは速度、親しみやすさ、低い実装リスクで勝ちます。

React Native の信頼性の高いアラートの生産パターン

削除要求が失敗し、リトライハンドラーが発火し、セッションが期限切れのチェックが同時に実行されます。アラート戦略が明確でない場合、ユーザーは重なり合うダイアログ、フォーカスが失われる、または web では実行されないことがあります。 Alert.alert is not implemented there. Those bugs usually come from architecture, not from the API call itself.

アラートを中央化するのではなく、そこにアラートを呼び出すのではなく

散在した __CAPGO_KEEP_0__ の呼び出しは、大規模なコードベースでは維持できません。1 つのコンポーネントが __CAPGO_KEEP_0__ の失敗を処理し、もう 1 つのコンポーネントがナビゲーション確認を求め、もう 1 つのコンポーネントが認証期限切れを警告します。もし、それらのイベントが近く発生すると、1 つの場所で順序付け、重複排除、プラットフォームのフォールバックロジックが必要になります。 Alert.alert(...) calls scattered across screens do not hold up in a larger codebase. One component handles an API failure, another asks for navigation confirmation, and a third warns about auth expiry. If those events happen close together, you need ordering, deduplication, and platform fallback logic in one place.

アラートを中央化するのではなく、そこにアラートを呼び出すのではなく

開発者は、ダイアログの抽象化パターンに関する議論で、同じ失敗モードを繰り返し指摘している。構造が悪いアプリは、ユーザーを閉じ込めるダイアログや、ユーザーが実行する必要があるアクションを隠すダイアログが積み重なり、約 30-40% の実装についての議論が実践で行われている(ダイアログの抽象化とダイアログの積み重なりに関する実装議論は、記事の前半で既に述べられているため、このリンクをここでは繰り返さない。)実践的な解決策は簡単。__CAPGO_KEEP_0__を一度にwrapし、グローバルにリクエストをキューイングし、レンダラーが正確に1つの可視的なダイアログを責任を持つようにする。 was noted earlier in the article, so do not repeat that link here). The practical fix is simple. Wrap the API once, queue requests globally, and make the renderer responsible for exactly one visible alert.

UI層は最初のキュー項目にサブスクライブし、正確に1つのダイアログをレンダリングする。ユーザーがそれを閉じると、サービスはそのアイテムを削除し、次のアイテムを明らかにする。

type AlertRequest = {
  title: string;
  message?: string;
  buttons?: { text: string; onPress?: () => void; style?: 'default' | 'cancel' | 'destructive' }[];
};

type AlertStore = {
  queue: AlertRequest[];
  push: (alert: AlertRequest) => void;
  shift: () => void;
};

アクセシビリティは実装の一部

ネイティブのダイアログはiOSとAndroidでデcentなデフォルトを提供する。Webのカスタムフォールバック、より豊かなコンテンツ、またはAndroidのダイアログの置き換えを導入すると、システムダイアログが無料で処理していた動作を所有することになる。

GluestackのReact Nativeダイアログのオプションの比較は、カスタムモーダル実装が期待どおりの読み取り順序を破ることが多いことを示している。

title → message → buttons のエリアでの問題が報告されている(GluestackのReact Native Alert vs Modalアクセシビリティの比較)。その特定の問題は重要である。スクリーンリーダーユーザーは、ダイアログを理解する前に行動するために予測可能な構造に依存しているからだ。 60% in that area in their benchmark of accessibility handling (Gluestack’s React Native Alert vs Modal accessibility comparison). That specific issue matters because screen reader users rely on predictable structure to understand the dialog before acting on it.

カスタムの警告UIの場合、次のチェックリストを短く強制的に維持してください:

  • ダイアログが開いたときにフォーカスをダイアログに移動させます。 ダイアログが開いたときにフォーカスをトリガーに戻します。
  • ダイアログを閉じた後、フォーカスをトリガーに戻します。 読み取り順序を維持してください:タイトル、メッセージ、次にアクション。
  • 明確なキャンセルパスを提供してください。特に破壊的なフローでは、破壊的なフローでは特に。
  • アクションを正確にラベル付けしてください。結果が重要な場合、「削除」は「OK」よりも良いでしょう。
  • 警告フローのアクセシビリティのバグは、通常のQAで見落としやすいですが、キーボードユーザーとスクリーンリーダー ユーザーは最初に発見します。__CAPGO_KEEP_0__

__CAPGO_KEEP_0__

プラットフォームではなく、トリガーをテストするダイアログ

codeが期待したアラートを要求したことを確認するためのユニットテストは、ネイティブダイアログランタイムに依存してはなりません。

Jestの一般的なパターンは次のようになります。

import { Alert } from 'react-native';

jest.spyOn(Alert, 'alert').mockImplementation(() => {});

it('asks for confirmation before deleting', () => {
  triggerDeleteFlow();

  expect(Alert.alert).toHaveBeenCalledWith(
    'Delete item',
    'This action cannot be undone.',
    expect.any(Array)
  );
});

これにより、テストはビジネスロジックに集中し、テスト環境外のダイアログの動作によって引き起こされるハングが防止されます。また、ウェブとAndroidのプロンプト制限がカスタムフォールバックを強制するようになったら、ラッパーAPIを推進することにもなります。

クライアントサイドモニタリングも役立ちます。Sentryを使用してReact Nativeアプリのインタラクションエラーを追跡しているチームは、明示的なエラーハンドリングと十分なコンテキストでログを記録したアラートトリガー__CAPGO_KEEP_0__パスをラップしたときに、通常より多くのアラート関連の問題をキャッチします。 プロトタイプステージを過ぎたアプリでは、基準を設定するために使用するルールのセットを小さくしてください。 codeをヘルパーにラップして、ウェブフォールバックロジックを1つの場所に置くことです。

アラートトリガー__CAPGO_KEEP_0__

アラートトリガー__CAPGO_KEEP_0__

  1. アラートトリガー__CAPGO_KEEP_0__ Alert.alert アラートトリガー__CAPGO_KEEP_0__ アラートトリガー__CAPGO_KEEP_0__
  2. 全世界でダイアログ要求をキュー化する したがって、時刻は1つだけ表示されます。
  3. Androidのプロンプトサポートを欠如とみなす そして、遅い分岐を避けてモーダルフォールバックを計画する
  4. キャンセルアクションを必要とする 破壊的または不可逆の操作の場合。
  5. テストでアラートをモックする ラベル、コールバック、および順序を確認する
  6. カスタムモーダルを必要とするWebの平行性、プロンプト入力、またはより豊かなコンテンツなど、

これにより、ネイティブのアラートが速く機能する場所では速く機能し、プラットフォームの差異が後で現れる場合にコードベースを角に追い込まない

Capacitor アプリのリアルタイム更新

Capgo を使用して、ウェブ層のバグが生じた場合に、 days間のアプリストアの承認を待たずに修正を配信する。ユーザーはバックグラウンドで更新を受け取り、ネイティブの変更は通常のレビュー経路で残る。

今すぐ始める

最新のブログ記事

Capgoは、プロフェッショナルなモバイルアプリを作成するために必要な最良の洞察を提供します。