ジオフェンシングという言葉をご存知でしょうか?ジオフェンシングは、GPSやBeaconなどによって仮想的なフェンスを作り、ユーザーの位置情報からチェックイン・チェックアウト判定を行う仕組みです。代表的な例としては、ユーザーがお店に設置されたBeaconの受信領域に入ったら広告を表示する、といった機能などが挙げられます。

しかし、たとえば会社の建物の中でのみ利用可能としたい業務アプリなどでは、位置情報だけでチェックイン判定をするのは憚られるでしょう。そこでおすすめしたいのが、特定のWifiアクセスポイントに接続している場合のみアプリの機能制限を外す仕組みです。

そういったケースに使えそうなCordovaプラグインが WifiWizard2 です。アプリからWiFiのステータスを取得したり、変更したりすることができます。

注意点

WifiWizard2はiOS/Android両方に対応しているとのことなのですが、iOS(筆者環境:iPhone 7 Plus)では「WiFiのステータス変更」「Wifiに接続」「アクセスポイントの一覧を取得」機能は動作しませんでした。

また、本プラグインはサードパーティ製のCordovaプラグインになります。Monacaで利用する場合は、Proプラン以上のライセンスが必要になります。

デモアプリ

MonacaでWifiWizard2を動かすデモアプリを goofmint/MonacaWiFiDemo にて公開しています。

プラグインのインストール

MonacaのCordovaプラグイン管理画面にて「WifiWizard2」をインストールしてください。

プラグインのインストール

WiFiのステータス取得

現在WiFiが有効になっているかどうかを調べるには WifiWizard2.isWifiEnabled を使います。例えば以下のコードはWifiのステータス(有効/無効)を調べて、その結果をスイッチボタンである #status に反映します。

WifiWizard2.isWifiEnabled(
  (status) => {
    $('#status').prop('checked', status)
  },
  (err) => {
    alert(JSON.stringify(err));
  }
);

WiFiのステータスを変更

WifiWizard2.setWifiEnabled でWifiのステータスを変更できます。スイッチボタン #status の値が変わったときのイベントを使ってWiFiのOn/Offを切り替える処理は以下のようになります。

WifiWizard2.setWifiEnabled(
  $("#status").prop('checked'),
  (result) => {
    alert(`Wifiを${$("#status").prop('checked') ? 'ON' : 'OFF'}にしました`);
  },
  (err) => {
    alert(JSON.stringify(err));
  }
);

実際に動かすとステータスバーのWiFiアイコンが付いたり消えたりします。

WiFiの状態を変更

WiFiに接続する

WiFiへの接続はiOS/Androidでメソッド名が異なります。
iOSの場合にはパスワードを入力できますが、Androidではできません。つまりAndroidでは既知またはパスワードがないネットワークに対してのみ接続できるようです。

const ssid = $('#ssid').val();
if (ons.platform.isAndroid()) {
  WifiWizard2.androidConnectNetwork(
    ssid,
    (status) => alert('接続しました'),
    (err) => alert(JSON.stringify(err))
  );
} else {
  const password = $('#password').val();
  WifiWizard2.iOSConnectNetwork(
    ssid, 
    password,
    (status) => alert('接続しました'),
    (err) => alert(JSON.stringify(err))
  );
}
WiFiに接続

アクセスポイントの一覧を取得

アクセスポイントの一覧を取得する機能としては、既知のアクセスポイント取得と周辺のアクセスポイント取得の二種類があります。筆者が試した限りでは周辺のアクセスポイントを取得する WifiWizard2.getScanResults は望んだ結果が返ってきませんでした(常に空)。既知のアクセスポイント一覧を取得する WifiWizard2.listNetworks はアクセスポイント名が配列で返ってきます。

// 既知のネットワーク情報を取得
WifiWizard2.listNetworks(
  (ssids) => {
    console.log(ssids);  // アクセスポイント名の配列
  },
  (err) => {
    alert(JSON.stringify(err));
  }
);
アクセスポイント一覧

現在接続中のアクセスポイントを取得

現在接続しているWiFiアクセスポイントを得るには WifiWizard2.getConnectedSSID を使います。

WifiWizard2.getConnectedSSID(
  (ssid) => {
    console.log(ssid);  // 接続中のアクセスポイント
  },
  (err) => {
    alert(JSON.stringify(err));
  }
);

まとめ

WifiWizard2を使えばWiFi設定を自動化できるようになります。ジオフェンシング以外にも、企業やカフェなどの建物の中に入ったら指定のWifiに自動接続する、といった使い方などが考えられるでしょう。

tripflex/WifiWizard2