? ? ? ?iOS 9 發布之后,蘋果對于WiFi這塊廢棄了CaptiveNetwork了這個類,不再推薦使用,同時推出NetworkExtension。最近把對這個類的研究以及心得體會寫下來。 效果圖如下,可以在指定的WiFi下設置自定義的文字。 ?
? ? ? ?首先,要想使用這個類需要向蘋果("networkextension@apple.com")發郵件獲取這個權限,這里不做具體詳細說明,需要說明的一點是你必須說明你為什么要使用這個類,蘋果會回復給你一個問卷文檔,根據你的實際需求進行填寫。網上說三周時間會給予回復,我們的公司可能回復的有點慢了。不過所幸最終通過了。
當你在郵件中看到這幾行話說明你成功了!
Hi, Thanks for your interest in the Network Extension APIs.
We added a new template containing the Network Extension? entitlements to your team.然后你就可以在你的項目中配置你的證書了。這里附上配置證書的指導文檔<https://developer.apple.com/library/ios/technotes/tn2415/_index.html#//apple_ref/doc/uid/DTS40016427>
如果配置完成,還可以通<https://forums.developer.apple.com/message/75928#75928> 這個對你的配置進行檢測,看是否配置成功。當然最最重要的還是對NetworkExtension這個類的運用,以下是對這個類的中文翻譯。
NOTE
應用程序的Info.plist必須添加一個包含“remote-notification”的UIBackgroundModes數組應用程序必須設置“com.apple.developer.networking.HotspotHelper'作為它的權利之一。
該權利的值是一個布爾值true要申請這個權利,請發送E-MAIL到networkextension@apple.com更多信息請參閱蘋果的Hotspot Network Subsystem Programming Guide
Register a Hotspot Helper
+ (BOOL)registerWithOptions:(NSDictionary*)options queue:(dispatch_queue_t)queue handler:(NEHotspotHelperHandler)handler
@param options?
?kNEHotspotHelperOptionDisplayName :WIFI的注釋tag字符串// 此處設置的內容會在WiFi列表中每個WiFi下邊展示出來?
@param queue dispatch_queue_t 用來調用handle的block?
@param handler NEHotspotHelperHandler block 用于執行處理 helper commands.
?@return 注冊成功YES, 否則NO.?
@discussion 一旦這個API調用成功,應用程序有資格在后臺啟動,并參與各種熱點相關的功能。 當應用程序啟動此方法應該調用一次。再次調用它會不會產生影響,并返回NO。
Manage Hotspot Networks
+ (BOOL)logoff:(NEHotspotNetwork *)network
@param network 對應當前關聯的WiFi網絡NEHotspotNetwork
?@return 注銷命令已成功進入隊列YES, 否則NO.?
@discussion 調用此方法使kNEHotspotHelperCommandTypeLogoff型的NEHotspotHelperCommand向應用程序發出的“handler”模塊 網絡參數必須符合當前關聯的WiFi網絡,即它必須來自對NEHotspotHelperCommand網絡屬性或方法supportedInterfaces
+ (NSArray *)supportedNetworkInterfaces
@return 如果沒有網絡接口被管理,返回nil。否則,返回NEHotspotNetwork對象數組。?
@discussion 每個網絡接口由NEHotspotNetwork對象表示。當前返回的數組包含一個NEHotspotNetwork對象代表Wi-Fi接口。
?這種方法的主要目的是當沒有得到一個命令來處理它時,讓一個熱點助手偶爾提供在UI里其準確的狀態。 此方法加上NEHotspotNetwork的isChosenHelper方法允許應用程序知道它是否是當前處理的網絡。
Data?
Typestypedef void (^NEHotspotHelperHandler)(NEHotspotHelperCommand * cmd)
@discussion 當調用方法registerWithOptions:queue:handler:時,Hotspot Helper app提供這種類型的blcok。 每次有要處理的命令時調用block。
以上為對這個類的一些解讀,最后附上具體的代碼。
NSMutableDictionary* options = [[NSMutableDictionary alloc] init];? ?
?[options setObject:@"??????????" forKey:kNEHotspotHelperOptionDisplayName];? ? ? ? dispatch_queue_t queue = dispatch_queue_create("com.myapp.ex", NULL);? ??
BOOL returnType = [NEHotspotHelper registerWithOptions:options queue:queue handler: ^(NEHotspotHelperCommand * cmd) {? ? ? ??
NEHotspotNetwork* network;? ? ? ??
NSLog(@"cmd %@", cmd);? ? ? ?
?NSLog(@"COMMAND TYPE:? %ld", (long)cmd.commandType);? ? ? ?
?NSLog(@"network %@",cmd.network);? ? ? ?
?NSLog(@"networkList %@",cmd.networkList);? ? ??
? if (cmd.commandType == kNEHotspotHelperCommandTypeEvaluate || cmd.commandType ==kNEHotspotHelperCommandTypeFilterScanList) {? ? ? ? ??
? for (network? in cmd.networkList) {? ??
? ? ? ? ? ? NSLog(@"COMMAND TYPE After:? %ld", (long)cmd.commandType);
? ? ? ? ? ? ? ? if ([network.SSID isEqualToString:@"A8F8"]) {
? ? ? ? ? ? ? ? ? ? double signalStrength = network.signalStrength;
? ? ? ? ? ? ? ? ? ? NSLog(@"Signal Strength: %f", signalStrength);
? ? ? ? ? ? ? ? ? ? [network setConfidence:kNEHotspotHelperConfidenceHigh];?
?? ? ? ? ? ? ? ? ? [network setPassword:@"123456789"];
? ? ? ? ? ? ? ? ? ? NEHotspotHelperResponse *response = [cmd createResponse:kNEHotspotHelperResultSuccess];
? ? ? ? ? ? ? ? ? ? NSLog(@"Response CMD %@", response);?
? ? ? ? ? ? ? ? ? ? ?[response setNetworkList:@[network]];?
?? ? ? ? ? ? ? ? ? ? [response setNetwork:network];?
?? ? ? ? ? ? ? ? ? ? [response deliver];?
?? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }?
?}];? ? ? ??
NSLog(@"result :%d", returnType);??
? ? ? NSArray *array = [NEHotspotHelper supportedNetworkInterfaces];
? ? ? NSLog(@"wifiArray:%@", array);
? ? ? ? NEHotspotNetwork *connectedNetwork = [array lastObject];? ? ? ? NSLog(@"supported Network Interface: %@", connectedNetwork);