Memulai
-
Instal paket
Terminal window npm i @capgo/capacitor-nfcTerminal window pnpm add @capgo/capacitor-nfcTerminal window yarn add @capgo/capacitor-nfcTerminal window bun add @capgo/capacitor-nfc -
Sinkronkan dengan proyek native
Terminal window npx cap syncTerminal window pnpm cap syncTerminal window yarn cap syncTerminal window bunx cap sync
Konfigurasi
Section titled âKonfigurasiâKonfigurasi iOS
Section titled âKonfigurasi iOSâTambahkan deskripsi penggunaan NFC ke Info.plist Anda:
<key>NFCReaderUsageDescription</key><string>Aplikasi ini memerlukan akses NFC untuk membaca dan menulis tag</string>Aktifkan kemampuan Near Field Communication Tag Reading di proyek Xcode Anda.
Konfigurasi Android
Section titled âKonfigurasi AndroidâTambahkan izin NFC ke AndroidManifest.xml Anda:
<manifest> <uses-permission android:name="android.permission.NFC" /> <uses-feature android:name="android.hardware.nfc" android:required="false" /></manifest>Penggunaan
Section titled âPenggunaanâMulai Scanning Tag NFC
Section titled âMulai Scanning Tag NFCâimport { CapacitorNfc } from '@capgo/capacitor-nfc';
await CapacitorNfc.startScanning({ invalidateAfterFirstRead: false, // Tetap buka sesi (iOS) alertMessage: 'Dekatkan tag ke bagian atas perangkat Anda.',});
const listener = await CapacitorNfc.addListener('nfcEvent', (event) => { console.log('Tag terdeteksi:', event.type); console.log('Tag ID:', event.tag?.id); console.log('Pesan NDEF:', event.tag?.ndefMessage);});Membaca Tag NFC
Section titled âMembaca Tag NFCâawait CapacitorNfc.addListener('nfcEvent', (event) => { if (event.tag?.ndefMessage) { event.tag.ndefMessage.forEach(record => { console.log('TNF:', record.tnf); console.log('Type:', record.type); console.log('Payload:', record.payload);
// Decode record teks if (record.tnf === 1 && record.type[0] === 0x54) { // Record teks const langLen = record.payload[0] & 0x3f; const text = new TextDecoder().decode( new Uint8Array(record.payload.slice(langLen + 1)) ); console.log('Teks:', text); } }); }});Menulis ke Tag NFC
Section titled âMenulis ke Tag NFCâ// Siapkan record teksconst encoder = new TextEncoder();const langBytes = Array.from(encoder.encode('en'));const textBytes = Array.from(encoder.encode('Hello NFC'));const payload = [langBytes.length & 0x3f, ...langBytes, ...textBytes];
await CapacitorNfc.write({ allowFormat: true, records: [ { tnf: 0x01, // TNF Well-known type: [0x54], // 'T' untuk Text id: [], payload, }, ],});
console.log('Tag berhasil ditulis');Menulis URL ke Tag NFC
Section titled âMenulis URL ke Tag NFCâconst url = 'https://capgo.app';const urlBytes = Array.from(new TextEncoder().encode(url));
await CapacitorNfc.write({ allowFormat: true, records: [ { tnf: 0x01, // TNF Well-known type: [0x55], // 'U' untuk URI id: [], payload: [0x01, ...urlBytes], // 0x01 = https:// }, ],});Menghapus Tag NFC
Section titled âMenghapus Tag NFCâawait CapacitorNfc.erase();console.log('Tag dihapus');Membuat Tag Read-Only
Section titled âMembuat Tag Read-Onlyâawait CapacitorNfc.makeReadOnly();console.log('Tag sekarang read-only');Berhenti Scanning
Section titled âBerhenti Scanningâawait listener.remove();await CapacitorNfc.stopScanning();Memeriksa Status NFC
Section titled âMemeriksa Status NFCâconst { status } = await CapacitorNfc.getStatus();console.log('Status NFC:', status);// Nilai yang mungkin: 'NFC_OK', 'NO_NFC', 'NFC_DISABLED', 'NDEF_PUSH_DISABLED'
if (status === 'NFC_DISABLED') { // Buka pengaturan sistem await CapacitorNfc.showSettings();}Android Beam (Berbagi P2P)
Section titled âAndroid Beam (Berbagi P2P)â// Bagikan data via Android Beamconst message = { records: [ { tnf: 0x01, type: [0x54], // Text id: [], payload: [/* payload record teks */], }, ],};
await CapacitorNfc.share(message);
// Kemudian, berhenti berbagiawait CapacitorNfc.unshare();Referensi API
Section titled âReferensi APIâstartScanning(options?)
Section titled âstartScanning(options?)âMulai mendengarkan tag NFC.
interface StartScanningOptions { invalidateAfterFirstRead?: boolean; // iOS saja, default true alertMessage?: string; // iOS saja androidReaderModeFlags?: number; // Android saja}
await CapacitorNfc.startScanning(options);stopScanning()
Section titled âstopScanning()âHentikan sesi scanning NFC.
await CapacitorNfc.stopScanning();write(options)
Section titled âwrite(options)âTulis record NDEF ke tag yang terakhir ditemukan.
interface WriteTagOptions { records: NdefRecord[]; allowFormat?: boolean; // Default true}
interface NdefRecord { tnf: number; // Type Name Format type: number[]; // Tipe record id: number[]; // Record ID payload: number[]; // Payload record}
await CapacitorNfc.write(options);erase()
Section titled âerase()âHapus tag yang terakhir ditemukan.
await CapacitorNfc.erase();makeReadOnly()
Section titled âmakeReadOnly()âJadikan tag yang terakhir ditemukan read-only (permanen).
await CapacitorNfc.makeReadOnly();share(options)
Section titled âshare(options)âBagikan pesan NDEF via Android Beam (Android saja).
await CapacitorNfc.share({ records: [...] });unshare()
Section titled âunshare()âBerhenti berbagi (Android saja).
await CapacitorNfc.unshare();getStatus()
Section titled âgetStatus()âDapatkan status adapter NFC saat ini.
const { status } = await CapacitorNfc.getStatus();// Mengembalikan: 'NFC_OK' | 'NO_NFC' | 'NFC_DISABLED' | 'NDEF_PUSH_DISABLED'showSettings()
Section titled âshowSettings()âBuka pengaturan NFC sistem.
await CapacitorNfc.showSettings();nfcEvent
Section titled ânfcEventâDipicu saat tag NFC ditemukan.
interface NfcEvent { type: 'tag' | 'ndef' | 'ndef-mime' | 'ndef-formattable'; tag?: NfcTag;}
interface NfcTag { id: number[]; techTypes: string[]; type: string | null; maxSize: number | null; isWritable: boolean | null; canMakeReadOnly: boolean | null; ndefMessage: NdefRecord[] | null;}nfcStateChange
Section titled ânfcStateChangeâDipicu saat ketersediaan adapter NFC berubah (Android saja).
interface NfcStateChangeEvent { status: NfcStatus; enabled: boolean;}Contoh Lengkap
Section titled âContoh Lengkapâimport { CapacitorNfc } from '@capgo/capacitor-nfc';
export class NfcService { private listener: any;
async startReading() { // Periksa status NFC const { status } = await CapacitorNfc.getStatus();
if (status === 'NO_NFC') { throw new Error('NFC tidak tersedia di perangkat ini'); }
if (status === 'NFC_DISABLED') { await CapacitorNfc.showSettings(); return; }
// Mulai scanning await CapacitorNfc.startScanning({ invalidateAfterFirstRead: false, alertMessage: 'Siap untuk scan tag NFC', });
// Dengarkan tag this.listener = await CapacitorNfc.addListener('nfcEvent', (event) => { this.handleNfcEvent(event); }); }
private handleNfcEvent(event: any) { console.log('Event NFC:', event.type);
if (event.tag?.ndefMessage) { event.tag.ndefMessage.forEach(record => { this.processRecord(record); }); } }
private processRecord(record: any) { // Proses record teks if (record.tnf === 1 && record.type[0] === 0x54) { const langLen = record.payload[0] & 0x3f; const text = new TextDecoder().decode( new Uint8Array(record.payload.slice(langLen + 1)) ); console.log('Teks:', text); }
// Proses record URI if (record.tnf === 1 && record.type[0] === 0x55) { const uriCode = record.payload[0]; const uri = new TextDecoder().decode( new Uint8Array(record.payload.slice(1)) ); console.log('URI:', uri); } }
async writeText(text: string) { const encoder = new TextEncoder(); const langBytes = Array.from(encoder.encode('en')); const textBytes = Array.from(encoder.encode(text)); const payload = [langBytes.length & 0x3f, ...langBytes, ...textBytes];
await CapacitorNfc.write({ allowFormat: true, records: [ { tnf: 0x01, type: [0x54], id: [], payload, }, ], }); }
async stopReading() { if (this.listener) { await this.listener.remove(); } await CapacitorNfc.stopScanning(); }}Tipe Record NDEF
Section titled âTipe Record NDEFâTNF (Type Name Format)
Section titled âTNF (Type Name Format)â0x00: Empty0x01: Well-known (mis., Text, URI)0x02: Tipe media MIME0x03: URI Absolut0x04: Tipe eksternal0x05: Unknown0x06: Unchanged0x07: Reserved
Tipe Record Umum
Section titled âTipe Record Umumâ- Text:
type: [0x54](âTâ) - URI:
type: [0x55](âUâ) - Smart Poster:
type: [0x53, 0x70](âSpâ)
Prefix URI
Section titled âPrefix URIâ0x00: (tanpa prefix)0x01:https://0x02:https://0x03:http://0x04:https://www.
Praktik Terbaik
Section titled âPraktik Terbaikâ- Periksa Status NFC: Selalu verifikasi NFC tersedia dan diaktifkan
- Tangani Izin: Minta izin NFC dengan tepat
- Berhenti Scanning: Selalu berhenti scanning saat selesai untuk menghemat baterai
- Penanganan Error: Bungkus operasi NFC dalam blok try-catch
- Uji di Perangkat: Fitur NFC tidak berfungsi di simulator/emulator
Catatan Platform
Section titled âCatatan Platformâ- Memerlukan iOS 11.0+
- Menggunakan framework Core NFC
- Mendukung pembacaan tag latar belakang (iOS 13+)
- Terbatas pada pembacaan tag berformat NDEF
- Tidak dapat menulis tag di latar belakang
- Memerlukan NFCReaderUsageDescription di Info.plist
Android
Section titled âAndroidâ- Memerlukan Android 4.4 (API 19)+
- Menggunakan Android NFC API
- Mendukung pembacaan tag foreground dan background
- Dapat menulis ke tag
- Mendukung Android Beam (P2P) di perangkat dengan NFC
- Memerlukan izin NFC di AndroidManifest.xml
- Tidak didukung di platform web