[iOS 11] NEHotspotConfigurationでWi-Fiホットスポットの構成をアプリに組み込む #WWDC17

1 はじめに

iOS 11では、NEHotspotConfigurationNEHotspotConfigurationManagerというクラスが追加され、Wi-Fiスポットの設定をアプリから行うことができるようになりました。

iOS9以降では、NEHotspotHelperを使用することで、これに類似した処理を記述することは可能でしたが、NEHotspotHelperを利用するためには、別途申請して許可を得る必要がありました。

参考:[iOS] Wi-Fi一覧でアピール表示し、パスワードを自動入力して接続させる方法(とまとレストランの販売促進アプリ)

今回、このクラスが追加されたことにより、これまでの制限はなくなり、アプリの中に自由にWi-Fiホットスポットへの接続機能を組み込むことができるようになった事になります。

また、設定したホットスポット構成は、アプリが起動している間だけ有効にしたり、有効期限を設定したりすることも可能です。

本記事は Apple からベータ版として公開されているドキュメントを情報源としています。 そのため、正式版と異なる情報になる可能性があります。ご留意の上、お読みください。

2 利用方法

利用方法の簡単なサンプルは次のようになります。

let manager = NEHotspotConfigurationManager.shared()
let ssid = "MyHotspot"
let password = "*********"
let isWEP = true
var hotspotConfiguration = NEHotspotConfiguration(ssid: ssid, passphrase: password, isWEP: isWEP)
hotspotConfiguration.joinOnce = true
hotspotConfiguration.lifeTimeInDays = 1

manager.apply(hotspotConfiguration) { (error) in
    if let error = error {
        print(error)
    } else {
        print("success")
    }
}

このコードが実行されると、<アプリ名>がWi-Fiネットワーク<SSID>に接続しようとしています。よろしいですか? というプロンプトが表示され、ユーザが接続を選択すると、ホットスポットへの接続が完了します。

なお、Xcode 9では、CapabilitiesにHotspot Configrationという項目が追加されており、これをONに設定する必要があります。

3 ホットスポットの構成

ホットスポットの構成は、オープン、WEP、WPA/WPA2 personal、WPA/WPA exterprise、及び Hotspot 2.0 に対応しています。

(1) オープンWi-Fiの構成

SSIDのみを指定します。

init(ssid SSID: String)

(2) WEP WAP/WAP2 のパーソナル Wi-Fiの構成

SSID及びパスワードを指定します。isWEPでWEPかWPA/WPA2を選択します。

パスワードは、WPA/WPA2の場合、8〜63文字のキャラクタ、64-bitWEPは、10桁、128-bitWEPは26桁の16進数を指定します。

init(ssid SSID: String, passphrase: String, isWEP: Bool)

(3) WPA/WPA2のエンタープライズ Wi-Fiの構成

SSID及び、拡張認証プロトコル(EAP)設定を指定します。

EAP設定については、NEHotspotEAPSettings クラスを使用します。

NEHotspotEAPSettingsの詳細は、下記をご参照下さい。
Developer Document > NEHotspotEAPSettings

init(ssid SSID: String, eapSettings: NEHotspotEAPSettings)

(4) Hotspot 2.0 Wi-Fiの構成

先の、EAP設定に追加して、Hotspot 2.0 の設定を指定します。

NEHotspotHS20Settingsの詳細は、下記をご参照下さい。
Developer Document > NEHotspotHS20Settings

init(hs20Settings: NEHotspotHS20Settings, eapSettings: NEHotspotEAPSettings)


参考: Cisco ワイヤレス エンジニアのブログ「Hotspot 2.0とは? 」

4 プロパティ

ホットスポットの構成で使用できるプロパティには、以下のものがあります。

(1) joinOnce

有効期限を、それを作成したアプリの動作状態で制限します。

var joinOnce: Bool { get set }

joinOncetrueに設定されている場合、アプリがフォアグラウンドで実行されている間だけ有効になります。 この時、次のいずれかのイベントでホットスポットは切断され、構成は削除されます。

  • アプリがバックグラウンドになった時(15秒後)
  • デバイスがスリープ状態になった時
  • アプリが終了された時
  • アプリがアンインストールされた時

(2) lifeTimeInDays

lifeTimeInDaysは、1日〜30日の間で有効期限を設定できます。(デフォルトで30日)

@NSCopying var lifeTimeInDays: NSNumber { get set }

5 NEHotspotConfigurationManager

NEHotspotConfigurationManagerは、上記のホットスポット構成を適用したり削除する構成マネージャです。

(1) apply

Wi-Fiネットワーク設定を追加または更新します。

func apply(_ configuration: NEHotspotConfiguration, 
completionHandler: ((Error?) -> Void)? = nil)

(2) removeConfiguration

設定したホットスポット構成を削除します。

削除できるのは、アプリ内でapplyを使用して設定した構成だけで、ユーザが設定したWi-Fi構成などを削除することは出来ません。

func removeConfiguration(forHS20DomainName domainName: String)
func removeConfiguration(forSSID SSID: String)

6 最後に

従来のNEHotspotHelperでは、SSIDで識別してパスワード自動的にセットする程度の実装しか出来ませんでしたが、今回追加されたNEHotspotConfigurationでは、直感的に、そして柔軟に、ホットスポット構成を実装することができるようになったと感じました。

また、Appleへの特別な申請が必要なくなったことで、このような機能を実装するアプリも色々のも増えるのではと思います。

7 参考リンク


NEHotspotConfiguration
NEHotspotConfigurationManager
Developer Documentation > NetworkExtension
About the Hotspot Network Subsystem
Advances in Networking, Part 1 - WWDC 2017 - Videos - Apple Developer