プロファイルを使用せずにWifiホットスポットの構成をアプリに組み込む方法2（切わけ編）

##前回を見ていない方
この記事は前回の記事(　https://qiita.com/Howasuto/items/0538f7b3795a9470b5d9 )
での投稿をより切り分けて必要な処理をリスト形式で整理して、さらに前回触れられなかった部分も説明していきます。前回の投稿をご覧になってない方はその投稿をみてからの閲覧を推奨します。

##内容
Wifiプロファイルを使わず、アプリ内でwifiホットスポットの構成を組むための処理を断片的に噛み砕いていく。大まかな流れが知りたい人は上記URLから前回の記事に飛んでください。

##ホットスポットの構成
Wifiホットスポットの構成は、オープン、WEP、WPA/WPA2 personal、　WPA/WPA enterprise、Hotspot2.0に対応しています。つまり、ホットスポットをコードで構成する際には上記のパターンから適切であるパターンを選び、そのパターンを構成するコードパターンを知る必要があります。

###オープンWi-fiの構成
SSIDのみを指定します。Passを指定したり、Pass形式を指定するisWEPも指定する必要がありません。

```swift
init(ssid SSID: String)
```
前回の投稿では定数に格納した時に型推論でString型というのがわかっていたので、型指定していませんでしたが、基本的には方を指定する必要があることを注意してください。

前回の記述

```swift
//ダブルクオーテーションで囲んでいるため、型推論でString型と判断されている。
let ssid = "MyHotspot"
let password = "*********"
```
```swift
//そのため、方を指定せずに引数に記述している。
NEHotspotConfiguration(ssid: ssid, passphrase: password, isWEP: isWEP)
```

###WEP WAP/WAP2のパーソナル　Wi-Fiの構成
SSIDとパスワードを指定します。isWEPはWEPかWPA/WPA2を選択し、WEPの場合がture、WPA/WPA2の場合をfalseに設定します。
パスワードは、WPA/WPA2の場合、8~63文字のキャラクタ、64-bitWEPは10桁、128-bitWEPは26桁の16進数を指定します。

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

###WPA/WPA2のエンタープライズWi-Fiの構成
SSIDと拡張認証プロトコル(EAP)設定を指定します。
この拡張認証プロトコルというのは、簡単にいうと「知ってるやつにきく（外部の認証サーバーにきく)」ということです。つまり、パーソナルは事前に設定した暗号鍵を使って判断、エンタープライズは認証サーバーに問い合わせて判断するという違いがあります。
ちなみにEAP設定は、NEHotspotEAPSettingsクラスを使用することで設定します。

```swift
//パーソナルのように暗号鍵は使用しないため、passphraseとisWEPは設定しない
init(ssid SSID: String, eapSettings: NEHotspotEAPSettings)
```

###Hotspot2.0Wi-Fiの構成
Hotspot2.0のWi-Fi設定は他の構成とは違い、特殊な記述になっています。これは、Hotspot2.0の特異性によるものです。本来Wi-fi接続を行う際、手動・自動どちらでもSSIDやパスの入力が必須になります。しかし、Hotspot2.0は各端末のSIMカードに書き込まれた情報をWi-Fiアクセスポイントの認証に利用することで、スムーズにWi-Fiネットワークへ接続します。イメージしずらいかもしれませんが、これは私たちが普段Wi-fiを使わずに携帯端末で電話やネットサーフィンをしているのと同じようなものだと理解してもらえれば大丈夫です。
詳しくはここでは記載しないので、もし気になった方は下記URLをご覧ください。
https://news.mynavi.jp/article/20130618-smartphone_word9/

```swift
init(hs20Settings: NEHotspotHS20Settings, eapSettings: NEHotspotEAPSettings)
```

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

###JoinOnce
joinOnceは構成の有効期限（生成した構成が有効な期間）を、そのホットスポットの構成を作成したアプリの動作状態で制限します。つまり、joinOnceがtureに設定されている場合、アプリがフォアグラウンド（今の画面、safariみたいに別のwindowに移動させていない状態）で実行されている間だけ有効になります。また、次のどれかのイベントでもホットスポットは切断され、構成は削除されます。

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

```swift
//{get set}は読み書き可能なプロパティを表しています。
var joinOnce: Bool { get set }
```

###lifeTimeInDays
lifeTimeInDaysは、1日〜365日の間で構成の有効期限を設定できます。

```swift
@NSCopying var lifeTimeInDays: NSNumber { get set }
```

##メソッド（NEHotspotConfigurationManager)
NEHotspotConfigurationManagerは、Wifiホットスポット構成を適用したり削除したりする構成マネージャです。そしてここでは、そのマネージャで使えるメソッドを下記に記します。

###apply
このメソッドは、Wi-Fiネットワーク設定を追加または更新します。つまり、これがWi-fi接続を実行するメソッドになります。

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

###removeConfiguration
設定したホットスポット構成を削除するためのメソッドです。
削除可能なのは、アプリ内でapplyを使用して設定した構成のみで、ユーザーが設定したWi-Fi構成などは削除の対象外です。

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

##最後に
自分学習用の整理用記事なので、見にくいかもですが参考になったら幸いです。

##参考
https://dev.classmethod.jp/smartphone/nehotspotconfiguration/
https://developer.apple.com/documentation/networkextension/nehotspotconfiguration/2866670-lifetimeindays
https://news.mynavi.jp/article/20130618-smartphone_word9/
https://wa3.i-3-i.info/diff283security.html
https://houwa-js.co.jp/blog/2018/12/20181204/
https://developer.apple.com/documentation/networkextension/nehotspoteapsettings