コンテンツへスキップ

はじめに

  1. パッケージのインストール

    Terminal window
    npm i @capgo/capacitor-wifi
  2. ネイティブプロジェクトと同期

    Terminal window
    npx cap sync
  3. パーミッションの設定

    Android: AndroidManifest.xmlに追加:

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    iOS: Info.plistに追加:

    <key>NSLocationWhenInUseUsageDescription</key>
    <string>WiFiネットワークをスキャンするには位置情報へのアクセスが必要です</string>

プラグインをインポートしてWiFi接続を管理します:

import { CapacitorWifi } from '@capgo/capacitor-wifi';
// 現在のWiFi接続情報を取得
const getWifiInfo = async () => {
const info = await CapacitorWifi.getWifiInfo();
console.log('接続先:', info.ssid);
console.log('IPアドレス:', info.ip);
};
// 利用可能なネットワークをスキャン
const scanNetworks = async () => {
const { networks } = await CapacitorWifi.scan();
networks.forEach(network => {
console.log(`SSID: ${network.ssid}, 信号: ${network.level}`);
});
};
// ネットワークに接続
const connectToWifi = async () => {
await CapacitorWifi.connect({
ssid: 'MyNetwork',
password: 'mypassword'
});
};

現在接続されているWiFiネットワークの情報を取得します。

interface WifiInfo {
ssid: string; // ネットワーク名
bssid: string; // アクセスポイントのMACアドレス
ip: string; // デバイスのIPアドレス
frequency: number; // ネットワーク周波数(MHz)
linkSpeed: number; // 接続速度(Mbps)
signalStrength: number; // 信号強度(0-100)
}
const info = await CapacitorWifi.getWifiInfo();

利用可能なWiFiネットワークをスキャンします。

interface WifiNetwork {
ssid: string; // ネットワーク名
bssid: string; // MACアドレス
level: number; // 信号レベル(dBm)
frequency: number; // ネットワーク周波数
capabilities: string; // セキュリティ機能
}
const { networks } = await CapacitorWifi.scan();

WiFiネットワークに接続します。

interface ConnectOptions {
ssid: string; // ネットワーク名
password?: string; // ネットワークパスワード(保護されている場合)
isHiddenSsid?: boolean; // SSIDが非表示かどうか
}
await CapacitorWifi.connect({
ssid: 'MyNetwork',
password: 'mypassword'
});

現在のWiFiネットワークから切断します。

await CapacitorWifi.disconnect();

現在接続されているネットワークのSSIDを取得します。

const { ssid } = await CapacitorWifi.getSSID();
console.log('接続先:', ssid);

現在のデバイスのIPアドレスを取得します。

const { ip } = await CapacitorWifi.getIP();
console.log('IPアドレス:', ip);
import { CapacitorWifi } from '@capgo/capacitor-wifi';
export class WifiService {
async getCurrentNetwork() {
try {
const info = await CapacitorWifi.getWifiInfo();
return {
name: info.ssid,
strength: this.getSignalQuality(info.signalStrength),
speed: `${info.linkSpeed} Mbps`,
ip: info.ip
};
} catch (error) {
console.error('Failed to get WiFi info:', error);
return null;
}
}
async scanAndConnect(targetSsid: string, password: string) {
try {
// Scan for networks
const { networks } = await CapacitorWifi.scan();
// Find target network
const targetNetwork = networks.find(n => n.ssid === targetSsid);
if (!targetNetwork) {
throw new Error(`Network ${targetSsid} not found`);
}
console.log(`Found network with signal: ${targetNetwork.level} dBm`);
// Connect to network
await CapacitorWifi.connect({
ssid: targetSsid,
password: password
});
console.log('Connected successfully!');
return true;
} catch (error) {
console.error('Connection failed:', error);
return false;
}
}
async findBestNetwork(preferredNetworks: string[]) {
const { networks } = await CapacitorWifi.scan();
// Filter to preferred networks
const available = networks.filter(n =>
preferredNetworks.includes(n.ssid)
);
if (available.length === 0) {
return null;
}
// Sort by signal strength
available.sort((a, b) => b.level - a.level);
return available[0];
}
async monitorConnection(callback: (info: WifiInfo | null) => void) {
const checkConnection = async () => {
try {
const info = await CapacitorWifi.getWifiInfo();
callback(info);
} catch (error) {
callback(null);
}
};
// Check every 5 seconds
const interval = setInterval(checkConnection, 5000);
// Initial check
await checkConnection();
// Return cleanup function
return () => clearInterval(interval);
}
private getSignalQuality(strength: number): string {
if (strength >= 80) return '優秀';
if (strength >= 60) return '良好';
if (strength >= 40) return '普通';
return '弱い';
}
async getNetworkSecurity(ssid: string): Promise<string> {
const { networks } = await CapacitorWifi.scan();
const network = networks.find(n => n.ssid === ssid);
if (!network) {
return 'Unknown';
}
const caps = network.capabilities.toLowerCase();
if (caps.includes('wpa3')) return 'WPA3';
if (caps.includes('wpa2')) return 'WPA2';
if (caps.includes('wpa')) return 'WPA';
if (caps.includes('wep')) return 'WEP';
return 'Open';
}
}
const assessNetworkQuality = async () => {
const info = await CapacitorWifi.getWifiInfo();
const quality = {
signal: info.signalStrength >= 70 ? '優秀' :
info.signalStrength >= 50 ? '良好' :
info.signalStrength >= 30 ? '普通' : '弱い',
speed: info.linkSpeed >= 100 ? '高速' :
info.linkSpeed >= 50 ? '中速' : '低速',
frequency: info.frequency >= 5000 ? '5GHz' : '2.4GHz'
};
console.log('ネットワーク品質:', quality);
return quality;
};

優先ネットワークへの自動接続

Section titled “優先ネットワークへの自動接続”
const autoConnect = async (preferredNetworks: Array<{ ssid: string, password: string }>) => {
const { networks } = await CapacitorWifi.scan();
for (const preferred of preferredNetworks) {
const found = networks.find(n => n.ssid === preferred.ssid);
if (found) {
try {
await CapacitorWifi.connect({
ssid: preferred.ssid,
password: preferred.password
});
console.log(`Connected to ${preferred.ssid}`);
return true;
} catch (error) {
console.error(`Failed to connect to ${preferred.ssid}`);
}
}
}
return false;
};
class NetworkMonitor {
private currentSsid: string | null = null;
private listeners: Array<(ssid: string | null) => void> = [];
async start() {
setInterval(async () => {
try {
const { ssid } = await CapacitorWifi.getSSID();
if (ssid !== this.currentSsid) {
this.currentSsid = ssid;
this.notifyListeners(ssid);
}
} catch (error) {
if (this.currentSsid !== null) {
this.currentSsid = null;
this.notifyListeners(null);
}
}
}, 3000);
}
onNetworkChange(callback: (ssid: string | null) => void) {
this.listeners.push(callback);
}
private notifyListeners(ssid: string | null) {
this.listeners.forEach(listener => listener(ssid));
}
}
  1. パーミッション: ネットワークをスキャンする前に位置情報パーミッションをリクエスト
  2. エラー処理: WiFi操作は常にtry-catchブロックでラップ
  3. ユーザーフィードバック: ネットワーク操作中はローディングインジケーターを表示
  4. セキュリティ: WiFiパスワードを平文で保存しない
  5. テスト: WiFi APIはエミュレーターで動作しない可能性があるため、実デバイスでテスト
  • ネットワークをスキャンするには位置情報パーミッションが必要
  • プログラム的にネットワークに接続できない(設定アプリを開く)
  • ネットワーク詳細へのアクセスが制限されている
  • 完全なプログラム的WiFi制御
  • ネットワークスキャンには位置情報パーミッションが必要
  • プログラム的に接続/切断が可能

スキャンが空を返す: 位置情報パーミッションが許可されているか確認 ネットワークに接続できない: パスワードが正しく、ネットワークが範囲内にあるか確認 getWifiInfoが失敗する: デバイスがWiFiネットワークに接続されているか確認 パーミッション拒否: プラットフォーム設定ファイルに必要なパーミッションを追加