[iOS] Wi-Fi一覧でアピール表示し、パスワードを自動入力して接続させる方法(とまとレストランの販売促進アプリ)
1 背景
spw05は、とまとレストランの店内で公開しているWi-Fiスポットです。認証方式はWPA2-PSKで当然パスワードも設定されています。
(注:「とまとレストラン」は、架空のレストランです)
お客様に開放している無線LANなので、パスワードは店内で教えてもらえます。(少し複雑なパスワードなので、「入力するのが大変だ!」と、ちょっと不評です)
今回は、このようなWi-Fiスポットを、iPhoneのWi-Fi選択画面で目立たせて表示し、パスワード入力なしで接続させるアプリの紹介です。
このアプリをインストールするとパスワード入力なしで簡単に接続できます。
とまとレストランとしては、このアプリをたくさんの方にインストールしてもらい、お店の販売促進に繋げたい思いがあります。
2 完成したアプリ
出来上がりは、こんな風になりました。
左が、このアプリをインストールしていない場合のWi-Fi選択画面で、右がインストールした後の画面です。 とまとレストランのWi-Fiスポットである事が簡単に認識できるようになっているのが分かります。
そして、このスポットを選択した場合、左が通常表示されるパスワード入力画面です。
このアプリをインストールしている場合は、この画面が表示されず、直ちに接続状態になります。
3 実装
(1) コード
このアプリのコードは、下記で全部です。(販売促進のための機能は、未実装です)
NEHotspotHelperを使用して、iOSのWi-Fi認証ステートマシンに割り込んで、ヘルプ文字を追加したり、パスワードを入力したりしています。
#import <NetworkExtension/NetworkExtension.h>
- (void)viewDidLoad { [super viewDidLoad]; NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:@"???とまとレストラン???", kNEHotspotHelperOptionDisplayName, nil]; dispatch_queue_t queue = dispatch_get_main_queue(); BOOL isAvailable = [NEHotspotHelper registerWithOptions:options queue:queue handler: ^(NEHotspotHelperCommand * cmd) { NSMutableArray *hotspotList = [NSMutableArray new]; if(cmd.commandType == kNEHotspotHelperCommandTypeEvaluate || cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList) { for (NEHotspotNetwork* network in cmd.networkList) { NSLog(@">%@", network.SSID); if ([network.SSID isEqualToString:@"spw05"]) { [network setConfidence:kNEHotspotHelperConfidenceHigh]; [network setPassword:@"password"]; [hotspotList addObject:network]; } } NEHotspotHelperResponse *response = [cmd createResponse:kNEHotspotHelperResultSuccess]; [response setNetworkList:hotspotList]; [response deliver]; } }]; }
registerWithOptions:queue:handler:で登録されたハンドラは、ユーザがWi-Fiの一覧を表示した際にコールされ、SSIDがspw05の場合に、補助表示を追加したり、パスワードをセットしたりしています。
(2) Entitlement
NEHotspotHelperのAPI Referenceには、下記のような注意書きが有ります。
Entitlementsは、New > File > plist でファイルを追加し、(ファイルは、プロジェクト名.extitlementsに設定しました)Build Settings > Code Signing Entitlements で指定しました。
NEHotSpotExtensionSample.extitlements
<?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.networking.HotspotHelper</key> <true/> </dict> </plist>
また、プロビジョニングプロファイルにもEntitlementの追加が必要です。
下記は、com.apple.developer.networking.HotspotHelperが有効に設定されたプロビジョニングプロファイルです。
(3) UIBackgroundModes
NEHotspotHelperのAPI Referenceには、下記のような注意書きも有ります。
下記は、追加したinfo.plistの抜粋です。
<?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>UIBackgroundModes</key> <array> <string>network-authentication</string> </array> <key>CFBundleDevelopmentRegion</key> <string>en</string>
4 その後
このアプリをインストールすると、レストラン内でWi-Fiが利用できるようになります。というか、パスワードが公開されていないので、インストールしないとWi-Fiの利用はできません。
そして、このアプリをインストールしていると、とまとレストランの割引クーポンが定期的に届くので、ついつい行ってしまうのでした。
めでたし、めでたし。
5 参考資料
Apple Refetence NEHotspotHelper
Hotspot Network Subsystem Programming Guide