---
title: NFC（近距離無線通信）
description: Android および iOS で NFC タグを読み書きします。
plugin: nfc
i18nReady: true
---

import { Tabs, TabItem, Steps } from '@astrojs/starlight/components';
import CommandTabs from '@components/CommandTabs.astro';
import PluginPermissions from '@components/PluginPermissions.astro';
import PluginLinks from '@components/PluginLinks.astro';
import Compatibility from '@components/plugins/Compatibility.astro';
import TranslationNote from '@components/i18n/TranslationNote.astro';

<TranslationNote lang="ja">

**Plugin 説明内容の英語表記部分について**　Plugin の各章は、原文データからページ内容の一部が自動生成されているため、英語表記のままの部分があります。

</TranslationNote>

<PluginLinks plugin={frontmatter.plugin} />

Android および iOS で NFC タグを読み書きします。

## 対応プラットフォーム

<Compatibility plugin={frontmatter.plugin} />

## セットアップ

はじめに、「nfc」プラグインをインストールしてください。

<Tabs>
  <TabItem label="自動で設定">

    自分のプロジェクトのパッケージ・マネージャーを使用して依存関係を追加します：

    {' '}

    <CommandTabs
      npm="npm run tauri add nfc"
      yarn="yarn run tauri add nfc"
      pnpm="pnpm tauri add nfc"
      bun="bun tauri add nfc"
      cargo="cargo tauri add nfc"
    />

  </TabItem>
  <TabItem label="手動で設定">
    <Steps>

      1. `src-tauri` フォルダで次のコマンドを実行して、このプラグインを `Cargo.toml` 内のプロジェクトの依存関係に追加します：

          ```sh frame=none
          cargo add tauri-plugin-nfc --target 'cfg(any(target_os = "android", target_os = "ios"))'
          ```

      2. 追加したプラグインを初期化するために `lib.rs` を修正します：

          ```rust title="src-tauri/src/lib.rs" ins={5-6}
          #[cfg_attr(mobile, tauri::mobile_entry_point)]
          pub fn run() {
              tauri::Builder::default()
                  .setup(|app| {
                      #[cfg(mobile)]
                      app.handle().plugin(tauri_plugin_nfc::init());
                      Ok(())
                  })
                  .run(tauri::generate_context!())
                  .expect("error while running tauri application");
          }
          ```

      3. お好みの JavaScript パッケージ・マネージャーを使用して、「JavaScript Guest」バインディングをインストールします：

          <CommandTabs
              npm="npm install @tauri-apps/plugin-nfc"
              yarn="yarn add @tauri-apps/plugin-nfc"
              pnpm="pnpm add @tauri-apps/plugin-nfc"
              deno="deno add npm:@tauri-apps/plugin-nfc"
              bun="bun add @tauri-apps/plugin-nfc"
          />

    </Steps>

  </TabItem>
</Tabs>

## 設定

「NFC」プラグインは、iOS では「ネイティブ設定」（OS 固有の設定）が必要です。

### iOS

iOS で NFC API にアクセスするには、対象の iOS バージョンに適合させ、Info.plist ファイルで使用方法の説明を設定し、アプリケーションに NFC 機能を追加する必要があります。

#### 対象 IOS バージョン

「NFC」プラグインには **iOS 14** 以降が必要です。これは Tauri CLI v2.8 以降で作成された Tauri アプリケーションではデフォルトですが、あなたの Xcode プロジェクトを編集して設定可能です。

`src-tauri/gen/apple/<project-name>.xcodeproj/project.pbxproj` ファイルで、すべての `IPHONEOS_DEPLOYMENT_TARGET` プロパティを `14.0` に設定します：

```title="src-tauri/gen/apple/<project-name>.xcodeproj/project.pbxproj"
/* Begin XCBuildConfiguration section */
		<random-id> /* release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				...
				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
			};
			name = release;
		};
		<random-id> /* debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
        ...
				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
			};
			name = debug;
		};
```

あるいは、Xcode の `General > Minimum Deployments > iOS` （一般 > 最小デプロイメント > iOS）設定で「デプロイメント・ターゲット」（公開対象）を設定することもできます。

<TranslationNote lang="ja">

**デプロイメント**　deployment：　「展開・配置」　開発したソフトウェアやアプリケーションなどを、ユーザーが使えるように、実際の運用環境（本番環境）に配置・公開して、利用可能な状態にする一連の作業やプロセス全般を指す用語。《参考：[英辞郎](https://eowf.alc.co.jp/search?q=deployment)、[wikipedia](https://ja.wikipedia.org/wiki/ソフトウェアデプロイメント)》

</TranslationNote>

#### Info.plist

iOS では、「NFC」プラグインに `NFCReaderUsageDescription` 情報プロパティ・リストの値が必要です。この値で、あなたのアプリがなぜ NFC タグのスキャンや書き込みを必要とするのか、その理由を説明する必要があります。

`src-tauri/Info.ios.plist` ファイルに次のスニペットを追加します：

```xml title=src-tauri/Info.ios.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
	<dict>
		<key>NFCReaderUsageDescription</key>
		<string>Read and write various NFC tags</string>  // 様々な NFC タグの読み取りと書き込み
	</dict>
</plist>
```

#### NFC 機能

さらに、iOS では NFC 機能をアプリケーションに関連付ける必要があります。

この機能は、Xcode のプロジェクト設定内の「Signing & Capabilities」（署名と機能）タブで「+ Capability」（+ 機能）ボタンをクリックし、「Near Field Communication Tag Reading」（近距離無線通信タグ読み取り）機能を選択することで追加できます。
（詳細については、[Add a capability to a target]（ターゲットに機能を追加する）を参照してください。）
あるいは、`gen/apple/<app-name>_iOS/<app-name>_iOS.entitlements` ファイルに以下の設定を追加することでも追加できます：

```xml title="gen/apple/<app-name>_iOS/<app-name>_iOS.entitlements"
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>com.apple.developer.nfc.readersession.formats</key>
	<array>
		<string>TAG</string>
	</array>
</dict>
</plist>
```

## 使用法

「NFC」プラグインは JavaScript と Rust の両方で利用可能で、これにより NFC タグをスキャンしたり、NFC タグに書き込んだりすることができます。

### NFCがサポートされているかどうかの確認

すべてのモバイル・デバイスに NFC タグのスキャン機能が搭載されているわけではありません。スキャンおよび書き込み API を使用する前に、NFC が利用できるかを確認する必要があります。

<Tabs syncKey="lang">

<TabItem label="JavaScript">

```javascript
import { isAvailable } from '@tauri-apps/plugin-nfc';

const canScanNfc = await isAvailable();
```

</TabItem>
<TabItem label="Rust">

```rust
tauri::Builder::default()
  .setup(|app| {
    #[cfg(mobile)]
    {
      use tauri_plugin_nfc::NfcExt;

      app.handle().plugin(tauri_plugin_nfc::init());

      let can_scan_nfc = app.nfc().is_available()?;
    }
    Ok(())
  })
```

</TabItem>
</Tabs>

### NFC タグのスキャン

このプラグインは、一般的な NFC タグや、NDEF（NFCデータ交換フォーマット）メッセージを持つ NFC タグをスキャンできます。
NDEF は、入力データを NFC タグにカプセル化（格納）するための標準形式です。

<Tabs syncKey="lang">

<TabItem label="JavaScript">

```javascript
import { scan } from '@tauri-apps/plugin-nfc';

const scanType = {
  type: 'ndef', // または 'tag',
};

const options = {
  keepSessionAlive: false,
  // iOSの「NFC スキャン」ダイアログに表示されるメッセージを設定
  message: 'Scan a NFC tag',
  successMessage: 'NFC tag successfully scanned',
};

const tag = await scan(scanType, options);
```

</TabItem>

<TabItem label="Rust">

```rust
tauri::Builder::default()
  .setup(|app| {
    #[cfg(mobile)]
    {
      use tauri_plugin_nfc::NfcExt;

      app.handle().plugin(tauri_plugin_nfc::init());

      let tag = app
        .nfc()
        .scan(tauri_plugin_nfc::ScanRequest {
            kind: tauri_plugin_nfc::ScanKind::Ndef {
                mime_type: None,
                uri: None,
                tech_list: None,
            },
            keep_session_alive: false,
        })?
        .tag;
    }
    Ok(())
  })
```

</TabItem>

</Tabs>

:::note
`keepSessionAlive` オプションは、スキャンした NFC タグに後から直接書き込むことを可能にします。

このオプションを指定しない場合は、次の `write()` 呼び出しでセッションが再作成されます。
これは、アプリがタグを再スキャンしようとすることを意味します。
:::

#### フィルター

NFC スキャナーは、特定の URI 形式、MIME タイプ、または NFC タグの各技術を利用したタグもフィルタリングすることができます。
この場合、スキャンでは指定されたフィルタリング条件に一致するタグのみが検出されます。

<TranslationNote lang="ja">

**URI 形式**　Uniform Resource Identifier：　統一資源識別子（URL と URN）。

**MINE タイプ**　Multipurpose Internet Mail Extensions：　多目的インターネットメール拡張書式。

</TranslationNote>

:::note
フィルタリングは Android でのみ利用可能で、スキャンした NFC タグの内容は常に確認する必要があります。

MIME タイプでは大文字と小文字が区別があるため、小文字で指定する必要があります。
:::

<Tabs syncKey="lang">

<TabItem label="JavaScript">

```javascript
import { scan, TechKind } from '@tauri-apps/plugin-nfc';

const techLists = [
  // NfcF 方式（Felica 方式）を用いて何でもキャプチャします
  [TechKind.NfcF],
  // NDEF（NFC データ変換フォーマット）のデータ内容（ペイロード）を用いてすべての MIFARE Classics をキャプチャします
  [TechKind.NfcA, TechKind.MifareClassic, TechKind.Ndef],
];

const tag = await scan({
  type: 'ndef', // または 'tag'
  mimeType: 'text/plain',
  uri: {
    scheme: 'https',
    host: 'my.domain.com',
    pathPrefix: '/app',
  },
  techLists,
});
```

</TabItem>

<TabItem label="Rust">

```rust
tauri::Builder::default()
  .setup(|app| {
    #[cfg(mobile)]
    {
      use tauri_plugin_nfc::NfcExt;

      app.handle().plugin(tauri_plugin_nfc::init());

      let tag = app
        .nfc()
        .scan(tauri_plugin_nfc::ScanRequest {
            kind: tauri_plugin_nfc::ScanKind::Ndef {
                mime_type: Some("text/plain".to_string()),
                uri: Some(tauri_plugin_nfc::UriFilter {
                  scheme: Some("https".to_string()),
                  host: Some("my.domain.com".to_string()),
                  path_prefix: Some("/app".to_string()),
                }),
                tech_list: Some(vec![
                  vec![tauri_plugin_nfc::TechKind::Ndef],
                ]),
            },
        })?
        .tag;
    }
    Ok(())
  })
```

</TabItem>

</Tabs>

<TranslationNote lang="ja">

**NFC の通信方式**：　大きく分けると三種類あります：

- Type-A 方式（NFC-A）＝ 国際標準で普及版（データ暗号化なし）
- Type-B 方式（NFC-B）＝ 国際標準の高セキュリティ版
- Type-F 方式（NFC-F）＝ 日本の主流方式（Felica）

**MIFARE** マイフェア：　NXPセミコンダクターズが開発した非接触 IC カード／RFID の通信規格（国際規格）。その中の MIFARE Classic 規格は設計が古く、セキュリティに脆弱性が発見されており、新規採用は非推奨。《参考 [wikipedia](https://ja.wikipedia.org/wiki/MIFARE)》

</TranslationNote>

### NFC タグへの書き込み

`write` API を使用して、NFC タグにペイロード（デジタル・データ）を書き込むことができます。
もし `keepSessionAlive: true` を用いてスキャンされたタグがない場合（「[NFC タグのスキャン](#nfc-タグのスキャン)」項の Note 欄参照）、アプリケーションは最初に NFC タグをスキャンします。

<Tabs syncKey="lang">

<TabItem label="JavaScript">

```javascript
import { write, textRecord, uriRecord } from '@tauri-apps/plugin-nfc';

const payload = [uriRecord('https://tauri.app'), textRecord('some payload')];

const options = {
  // 「種類 kind」は、スキャンされたタグセッションが稼働していない場合にのみ必要です
  // その形式は scan() に渡される引数と同じです
  kind: {
    type: 'ndef',
  },
  // iOSの「Scan NFC（NFC をスキャン）」ダイアログに表示されるメッセージを設定します
  message: 'Scan a NFC tag',
  successfulReadMessage: 'NFC tag successfully scanned',
  successMessage: 'NFC tag successfully written',
};

await write(payload, options);
```

</TabItem>

<TabItem label="Rust">
:::caution
Rust API は、現在、NFC ペイロードを書き込むための低レベルのインターフェースのみを提供しています。

この API は近いうちに強化される予定です。
:::

```rust
tauri::Builder::default()
  .setup(|app| {
    #[cfg(mobile)]
    {
      use tauri_plugin_nfc::NfcExt;

      app.handle().plugin(tauri_plugin_nfc::init());

      app
        .nfc()
        .write(vec![
          tauri_plugin_nfc::NfcRecord {
            format: tauri_plugin_nfc::NFCTypeNameFormat::NfcWellKnown,
            kind: vec![0x55], // URI の記録
            id: vec![],
            payload: vec![], // ここにペイロードを挿入
          }
        ])?;
    }
    Ok(())
  })
```

</TabItem>
</Tabs>

## アクセス権限 Permissions

デフォルトでは、潜在的に危険なプラグイン・コマンドとそのスコープ（有効範囲）はすべてブロックされており、アクセスできません。これらを有効にするには、`capabilities` 設定でアクセス権限を変更する必要があります。

詳細については「[セキュリティ・レベル Capabilities](/ja/security/capabilities/)」の章を参照してください。また、プラグインのアクセス権限を設定するには「[プライグン・アクセス権の使用](/ja/learn/security/using-plugin-permissions/)」の章のステップ・バイ・ステップ・ガイドを参照してください。

```json title="src-tauri/capabilities/default.json" ins={4}
{
  "permissions": [
    ...,
    "nfc:default",
  ]
}
```

<PluginPermissions plugin={frontmatter.plugin} />

[Add a capability to a target]: https://help.apple.com/xcode/mac/current/#/dev88ff319e7

<div style="text-align: right;">
  【※ この日本語版は、「Aug 16, 2025 英語版」に基づいています】
</div>
