Memulai
Instalasi
Section titled âInstalasiânpm install @capgo/capacitor-autofill-save-passwordnpx cap syncyarn add @capgo/capacitor-autofill-save-passwordnpx cap syncpnpm add @capgo/capacitor-autofill-save-passwordnpx cap syncbun add @capgo/capacitor-autofill-save-passwordnpx cap syncDukungan Platform
Section titled âDukungan Platformâ- iOS: Dukungan penuh (iOS 18.3 dan versi lama)
- Android: Dalam pengembangan
Konfigurasi Platform
Section titled âKonfigurasi Platformâ1. Pengaturan Associated Domains
Section titled â1. Pengaturan Associated DomainsâKonfigurasi associated domains di akun Apple Developer Anda dan tambahkan ke file App.entitlements Anda:
<?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.associated-domains</key> <array> <string>webcredentials:yourdomain.com</string> <string>webcredentials:www.yourdomain.com</string> </array></dict></plist>2. Konfigurasi Web Credential
Section titled â2. Konfigurasi Web CredentialâTambahkan file .well-known/apple-app-site-association ke situs web Anda:
{ "webcredentials": { "apps": [ "TEAMID.com.yourcompany.yourapp" ] }}Android (Dukungan di Masa Depan)
Section titled âAndroid (Dukungan di Masa Depan)â1. Google Services Plugin
Section titled â1. Google Services PluginâTambahkan ke android/app/build.gradle:
apply plugin: 'com.google.gms.google-services'2. Konfigurasi Domain
Section titled â2. Konfigurasi DomainâTambahkan ke android/app/src/main/res/values/strings.xml:
<resources> <string name="asset_statements"> [{ "relation": ["delegate_permission/common.handle_all_urls"], "target": { "namespace": "web", "site": "https://yourdomain.com" } }] </string></resources>Contoh Penggunaan
Section titled âContoh Penggunaanâimport { SavePassword } from '@capgo/capacitor-autofill-save-password';
// Save password after successful loginasync function login(username: string, password: string) { try { // Perform your login logic here const loginSuccess = await performLogin(username, password);
if (loginSuccess) { // Prompt user to save password await SavePassword.promptDialog({ username: username, password: password, url: 'https://yourdomain.com' // iOS only });
console.log('Password saved successfully'); } } catch (error) { console.error('Failed to save password:', error); }}
// Read saved password for autofillasync function loadSavedCredentials() { try { const credentials = await SavePassword.readPassword();
if (credentials.username && credentials.password) { console.log('Found saved credentials'); // Pre-fill login form return { username: credentials.username, password: credentials.password }; } } catch (error) { console.error('Failed to read saved password:', error); }
return null;}Referensi API
Section titled âReferensi APIâpromptDialog(options)
Section titled âpromptDialog(options)âpromptDialog(options: SavePasswordOptions) => Promise<void>Menyimpan kredensial pengguna ke keychain sistem.
| Param | Type |
|---|---|
options | SavePasswordOptions |
readPassword()
Section titled âreadPassword()âreadPassword() => Promise<SavedCredentials>Mengambil kredensial yang disimpan dari keychain sistem.
Mengembalikan: Promise<SavedCredentials>
Interface
Section titled âInterfaceâSavePasswordOptions
Section titled âSavePasswordOptionsâ| Prop | Type | Description |
|---|---|---|
username | string | Username yang akan disimpan |
password | string | Password yang akan disimpan |
url | string | iOS saja - URL domain terkait (opsional) |
SavedCredentials
Section titled âSavedCredentialsâ| Prop | Type | Description |
|---|---|---|
username | string | Username yang disimpan |
password | string | Password yang disimpan |
Integrasi dengan Alur Login
Section titled âIntegrasi dengan Alur Loginâimport { SavePassword } from '@capgo/capacitor-autofill-save-password';
class AuthService { async login(username: string, password: string) { try { // Authenticate with your backend const response = await fetch('/api/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username, password }) });
if (response.ok) { // Offer to save credentials await this.offerToSavePassword(username, password); return true; } } catch (error) { console.error('Login failed:', error); } return false; }
private async offerToSavePassword(username: string, password: string) { try { await SavePassword.promptDialog({ username, password, url: 'https://yourdomain.com' }); } catch (error) { // User declined to save or error occurred console.log('Password not saved:', error); } }
async loadSavedCredentials() { try { return await SavePassword.readPassword(); } catch (error) { console.log('No saved credentials found'); return null; } }}Praktik Terbaik
Section titled âPraktik Terbaikâ- Hanya minta untuk menyimpan kata sandi setelah autentikasi berhasil
- Tangani kasus di mana pengguna menolak untuk menyimpan kata sandi dengan baik
- Implementasikan penanganan error yang tepat untuk kegagalan akses keychain
- Gunakan associated domains untuk berbagi kredensial web-app yang mulus
- Uji fungsi autofill di berbagai versi iOS
Pertimbangan Keamanan
Section titled âPertimbangan Keamananâ- Kredensial disimpan di keychain sistem dengan flag keamanan yang sesuai
- Associated domains memastikan kredensial hanya dapat diakses oleh aplikasi yang berwenang
- Ikuti panduan keamanan platform untuk manajemen kredensial
- Pertimbangkan untuk menerapkan langkah-langkah keamanan tambahan untuk aplikasi sensitif