系統(tǒng)庫
--
1.NEFilterControlProvider
2.NEFilterDataProvider
3.NEFilterFlow
4.NEFilterManager
5.NEFilterProvider
6.NEFilterProviderConfiguration
7.NEFlowMetaData
8.NEHotspotConfigurationManager
9.NEHotspotHelper
NEFilterProvider
網(wǎng)絡(luò)內(nèi)容篩選器由兩個篩選器擴展組成,
篩選器數(shù)據(jù)提供程序擴展在網(wǎng)絡(luò)內(nèi)容通過設(shè)備上的網(wǎng)絡(luò)堆棧時對其進行檢查,
并決定是否應(yīng)阻止或允許網(wǎng)絡(luò)內(nèi)容傳遞到其最終目標(biāo).
由于篩選器可以訪問流經(jīng)設(shè)備的所有網(wǎng)絡(luò)內(nèi)容, 因此它在非常嚴(yán)格的沙箱中運行氯庆。沙箱通過阻止所有網(wǎng)絡(luò)訪問、ipc 和磁盤寫入操作, 防止篩選器將網(wǎng)絡(luò)內(nèi)容移動到其地址空間之外勿璃。 篩選器負責(zé)向篩選器數(shù)據(jù)提供程序擴展提供信息, 以便篩選器可以完成其工作抗碰。篩選器通知它沒有足夠的信息來決定特定的網(wǎng)絡(luò)內(nèi)容流狮斗。然后, 篩選器可以從服務(wù)器下載更多的篩選規(guī)則, 并將這些規(guī)則寫入篩選器,從而可以訪問這些規(guī)則的位置。
NEFilterProvider相關(guān)的API
- (void)startFilterWithCompletionHandler:(void (^)(NSError *error))completionHandler;
開啟過濾器
此方法由系統(tǒng)調(diào)用以啟動篩選器. 子類必須重寫此方法. 當(dāng)調(diào)用此方法時, 篩選器執(zhí)行初始化篩選器所需的任何步驟, 然后執(zhí)行完成處理block弧蝇。
- (void)stopFilterWithReason:(NEProviderStopReason)reason
completionHandler:(void (^)(void))completionHandler;
停止過濾器碳褒,NEProviderStopReason是停止的原因,此方法由系統(tǒng)調(diào)用以停止篩選器看疗。子類方法需要重寫該方法沙峻。
NEFilterProviderConfiguration
篩選器配置設(shè)置。
主要的屬性值包含如下:
@property BOOL filterBrowsers;
布爾值两芳,返回YES或者NO取決于有沒有webKit瀏覽器對象摔寨。
@property BOOL filterSockets;
默認是NO,布爾值是什么取決于是否使用了socket
@property(copy) NSDictionary<NSString *,id> *vendorConfiguration;
設(shè)置特定參數(shù)的字典怖辆,所有的字典中的value值必須遵守NSSecureCoding協(xié)議
@property(copy) NSString *serverAddress;
服務(wù)地址
@property(copy) NSString *username;
用戶名
@property(copy) NSString *organization;
組織
@property(copy) NSData *passwordReference;
密碼數(shù)據(jù)
@property(copy) NSData *identityReference;
特定屬性是复,證書或者綁定的key
NEFilterFlow
NEFilterFlow就是網(wǎng)絡(luò)數(shù)據(jù)流。
NEFilterManager
創(chuàng)建和管理網(wǎng)絡(luò)內(nèi)容過濾器配置并控制網(wǎng)絡(luò)內(nèi)容過濾器竖螃。允許每個應(yīng)用程序創(chuàng)建單個篩選器配置淑廊,NEFilterManager類具有一個類方法sharedManager, 可以訪問單個NEFilterManager實例。該單個實例對應(yīng)于單個過濾配置特咆。
過濾器配置存儲在由NetWork Extension框架管理的Network Extension首選項中季惩。必須先將過濾器配置從網(wǎng)絡(luò)擴展首選項顯式加載到內(nèi)存中,然后才能使用它坚弱,并且必須先將任何更改明確保存到網(wǎng)絡(luò)擴展首選項蜀备,然后才能在系統(tǒng)上生效。
**注意 **
在使用NEFilterManager這個類時荒叶,一定要讓自己的Xcode配置上Network Extension的能力碾阁,具體如下圖
NEFilterManager 頭文件
/*
* This header is generated by classdump-dyld 0.1
* on Wednesday, September 20, 2017 at 9:28:09 PM Eastern European Summer Time
* Operating System: Version 11.0 (Build 15A372)
* Image Source: /System/Library/Frameworks/NetworkExtension.framework/NetworkExtension
* classdump-dyld is free of use, Copyright ? 2013 by Elias Limneos.
*/
#import <NetworkExtension/NEPrettyDescription.h>
@class NEConfiguration, NEConfigurationManager, NSString, NEFilterProviderConfiguration;
@interface NEFilterManager : NSObject <NEPrettyDescription> {
bool _hasLoaded;
NEConfiguration* _configuration;
NEConfigurationManager* _configurationManager;
}
@property (assign) bool hasLoaded; //@synthesize hasLoaded=_hasLoaded - In the implementation block
@property (retain) NEConfiguration* configuration; //@synthesize configuration=_configuration - In the implementation block
@property (readonly) NEConfigurationManager* configurationManager; //@synthesize configurationManager=_configurationManager - In the implementation block
@property (copy) NSString* localizedDescription;
@property (retain) NEFilterProviderConfiguration* providerConfiguration;
@property (getter=isEnabled) bool enabled;
+(id)sharedManager;
-(id)providerConfiguration;
-(void)setLocalizedDescription:(id)arg1 ;
-(id)init;
-(void).cxx_destruct;
-(id)description;
-(id)localizedDescription;
-(bool)isEnabled;
-(void)setEnabled:(bool)arg1 ;
-(void)setConfiguration:(id)arg1 ;
-(id)configuration;
-(id)descriptionWithIndent:(int)arg1 options:(unsigned long long)arg2 ;
-(void)setHasLoaded:(bool)arg1 ;
-(void)loadFromPreferencesWithCompletionHandler:(/*^block*/ id)arg1 ;
-(id)configurationManager;
-(void)createEmptyConfiguration;
-(id)initFilterManagerWithPluginType:(id)arg1 ;
-(void)removeFromPreferencesWithCompletionHandler:(/*^block*/ id)arg1 ;
-(void)saveToPreferencesWithCompletionHandler:(/*^block*/ id)arg1 ;
-(void)setProviderConfiguration:(id)arg1 ;
-(bool)hasLoaded;
@end
API介紹
+ (NEFilterManager *)sharedManager;
創(chuàng)建NEFilterManager的單例,返回一個NEFilterManager類對象
- (void)loadFromPreferencesWithCompletionHandler:(void (^)(NSError *error))completionHandler;
加載篩選器配置,在調(diào)用saveToPreferencesWithCompletionHandler之前些楣,您必須至少調(diào)用此方法一次:這是您的應(yīng)用程序啟動后的第一次脂凶。
- (void)saveToPreferencesWithCompletionHandler:(void (^)(NSError *error))completionHandler;
將過濾配置保存在Extension的參數(shù)中,在應(yīng)用程序啟動后第一次調(diào)用此方法之前,必須至少調(diào)用一次loadFromPreferencesWithCompletionHandler:
- (void)removeFromPreferencesWithCompletionHandler:(void (^)(NSError *error))completionHandler;
將過濾配置在Extension中移除愁茁,從Extension中刪除配置后蚕钦,NEFilterManager對象仍將包含配置參數(shù)。 調(diào)用loadFromPreferencesWithCompletionHandler:將從NEFilterManager對象中清除配置參數(shù)鹅很。
@property(copy) NSString *localizedDescription;
描述過濾器信息嘶居,如果在創(chuàng)建配置時將此屬性設(shè)置為nil,則它將自動設(shè)置為調(diào)用程序的顯示名稱。
@property(strong) NEFilterProviderConfiguration *providerConfiguration;
過濾器設(shè)置的NEFilterProviderConfiguration對象邮屁,如果調(diào)用loadFromPreferencesWithCompletionHandler:之后屬性為nil整袁,則Extension中不存在過濾器信息。
NEFilterControlProvider
NEFilterControlProvider 是為應(yīng)用程序擴展創(chuàng)建一個主題類佑吝。
NEFilterControlProvider主要是向關(guān)聯(lián)的過濾器數(shù)據(jù)提供程序提供信息坐昙,以便它可以執(zhí)行準(zhǔn)確過濾網(wǎng)絡(luò)內(nèi)容的任務(wù)。過濾器控制提供程序有多種方法向關(guān)聯(lián)的過濾器提供數(shù)據(jù):
通過將信息寫入磁盤芋忿。例如炸客,過濾器控制提供程序可以在磁盤上的過濾數(shù)據(jù)提供程序可以從數(shù)據(jù)庫中讀取的位置維護過濾規(guī)則的數(shù)據(jù)庫。
通過定義將鍵映射到生成塊頁面時要使用的自定義參數(shù)集的字典戈钢。過濾器數(shù)據(jù)提供程序為系統(tǒng)提供所需自定義參數(shù)的密鑰痹仙,系統(tǒng)使用該密鑰從過濾器控制提供程序獲取自定義參數(shù)并生成自定義塊頁面。
通過定義將鍵映射到要附加到URL的字符串的字典逆趣。過濾器數(shù)據(jù)提供程序為系統(tǒng)提供了要附加的字符串的鍵蝶溶,系統(tǒng)使用該鍵從過濾器控制提供程序中獲取要附加的字符串,并將該字符串附加到URL宣渗。
在使用該類時抖所,需要在info.plist中添加對應(yīng)的key,如下:
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.networkextension.filter-control</string>
<key>NSExtensionPrincipalClass</key>
<string>MyCustomFilterControlProvider</string>
</dict>
NEFilterControlProvider的頭文件相關(guān)的類
#import <NetworkExtension/NEFilterProvider.h>
#import <NetworkExtension/NSExtensionRequestHandling.h>
@class NSDictionary, NSString;
@interface NEFilterControlProvider : NEFilterProvider <NSExtensionRequestHandling> {
NSDictionary* _remediationMap;
NSDictionary* _URLAppendStringMap;
}
@property (copy) NSDictionary* remediationMap;
@property (copy) NSDictionary* URLAppendStringMap;
@property (readonly) unsignedlonglong hash;
@property (readonly) Class superclass;
@property (copy,readonly) NSString* description;
@property (copy,readonly) NSString* debugDescription;
-(void).cxx_destruct;
-(void)handleNewFlow:(id)arg1 completionHandler:(/*^block*/ id)arg2 ;
-(void)handleReport:(id)arg1 ;
-(void)notifyRulesChanged;
-(void)setRemediationMap:(id)arg1 ;
-(void)setURLAppendStringMap:(id)arg1 ;
-(id)remediationMap;
-(id)URLAppendStringMap;
-(void)handleRemediationForFlow:(id)arg1 completionHandler:(/*^block*/ id)arg2 ;
@end
相關(guān)的API
- (void)handleNewFlow:(NEFilterFlow *)flow
completionHandler:(void (^)(NEFilterControlVerdict *))completionHandler;
處理新的信息流痕囱,其中flow指的是NEFilterFlow對象田轧,包含有關(guān)網(wǎng)絡(luò)內(nèi)容流的詳細信息,completionHandler是一個block回調(diào)鞍恢。
- (void)notifyRulesChanged;
通過該方法傻粘,過濾控制器可以通知過濾數(shù)據(jù)規(guī)則的改變,
- (void)handleRemediationForFlow:(NEFilterFlow *)flow
completionHandler:(void (^)(NEFilterControlVerdict *))completionHandler;
處理遺漏的數(shù)據(jù)流信息
- (void)handleReport:(NEFilterReport *)report;
處理返回的數(shù)據(jù)
NEFilterDataProvider
網(wǎng)絡(luò)請求的內(nèi)容以NEFilterFlow對象的形式傳遞給過濾器數(shù)據(jù)提供者帮掉,每個NEFilterFlow對象對應(yīng)于設(shè)備上運行的應(yīng)用程序打開網(wǎng)絡(luò)連接弦悉。過濾器數(shù)據(jù)提供程序可以在接收到新流時選擇傳遞或阻止數(shù)據(jù),也可以在進行傳遞或阻止決策之前要求系統(tǒng)在出站或入站方向上查看更多流數(shù)據(jù)蟆炊。
除了傳遞或阻止網(wǎng)絡(luò)數(shù)據(jù)之外稽莉,過濾器數(shù)據(jù)提供程序還可以告訴系統(tǒng)它需要更多信息才能決定特定的數(shù)據(jù)流。然后涩搓,系統(tǒng)將要求過濾器控制提供程序更新當(dāng)前的規(guī)則集污秆,并將它們放在磁盤上可從過濾器數(shù)據(jù)提供程序擴展中讀取的位置
當(dāng)NEFilterFlow對象源自WebKit瀏覽器對象時,過濾器數(shù)據(jù)提供程序可以通過以下方式影響用戶體驗:
如果篩選器數(shù)據(jù)提供程序選擇阻止該網(wǎng)頁昧甘,則會在WebKit瀏覽器對象中顯示一個特殊的“阻止”頁面良拼,通知用戶他們訪問內(nèi)容的嘗試已被阻止。過濾器數(shù)據(jù)提供程序可以選擇添加指向此阻止頁面的鏈接充边,從而為用戶提供請求訪問內(nèi)容的選項庸推。
如果篩選器數(shù)據(jù)提供程序選擇允許該網(wǎng)頁,則它還可以指定將字符串附加到網(wǎng)頁URL。這允許過濾器數(shù)據(jù)提供程序?qū)ebKit瀏覽器對象定向到網(wǎng)頁的“安全”版本予弧。
為了保護用戶的隱私刮吧,過濾器數(shù)據(jù)提供程序擴展沙箱可防止擴展程序?qū)⒕W(wǎng)絡(luò)內(nèi)容移動到其地址空間之外。
在使用改類時也需要添加如下的key
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.networkextension.filter-data</string>
<key>NSExtensionPrincipalClass</key>
<string>MyCustomFilterDataProvider</string>
</dict>
另外掖蛤,在創(chuàng)建分類時,需要創(chuàng)建一個類繼承自NEFilterDataProvider井厌,并且重寫以下方法
handleNewFlow:
handleInboundDataFromFlow:readBytesStartOffset:readBytes:
handleOutboundDataFromFlow:readBytesStartOffset:readBytes:
handleInboundDataCompleteForFlow:
handleOutboundDataCompleteForFlow:
handleRemediationForFlow:
handleRulesChanged
NEFilterDataProvider相關(guān)的頭文件
/*
* This header is generated by classdump-dyld 0.1
* on Wednesday, September 20, 2017 at 9:28:09 PM Eastern European Summer Time
* Operating System: Version 11.0 (Build 15A372)
* Image Source: /System/Library/Frameworks/NetworkExtension.framework/NetworkExtension
* classdump-dyld is free of use, Copyright ? 2013 by Elias Limneos.
*/
#import <NetworkExtension/NEFilterProvider.h>
#import <NetworkExtension/NSExtensionRequestHandling.h>
@class NSString;
@interface NEFilterDataProvider : NEFilterProvider <NSExtensionRequestHandling>
@property (readonly) unsignedlonglong hash;
@property (readonly) Class superclass;
@property (copy,readonly) NSString* description;
@property (copy,readonly) NSString* debugDescription;
-(id)handleNewFlow:(id)arg1 ;
-(id)handleInboundDataFromFlow:(id)arg1 readBytesStartOffset:(unsigned long long)arg2 readBytes:(id)arg3 ;
-(id)handleOutboundDataFromFlow:(id)arg1 readBytesStartOffset:(unsigned long long)arg2 readBytes:(id)arg3 ;
-(id)handleInboundDataCompleteForFlow:(id)arg1 ;
-(id)handleOutboundDataCompleteForFlow:(id)arg1 ;
-(void)handleRulesChanged;
-(id)handleRemediationForFlow:(id)arg1 ;
@end
NEFilterDataProvider 相關(guān)的API
- (NEFilterNewFlowVerdict *)handleNewFlow:(NEFilterFlow *)flow;
為新創(chuàng)建的網(wǎng)絡(luò)內(nèi)容流做出過濾方式
- (NEFilterDataVerdict *)handleInboundDataFromFlow:(NEFilterFlow *)flow
readBytesStartOffset:(NSUInteger)offset
readBytes:(NSData *)readBytes;
對入棧數(shù)據(jù)做出過濾決策蚓庭,flow參數(shù)就是數(shù)據(jù)流,offse是讀取的數(shù)據(jù)進度仅仆,readBytes:要過濾的數(shù)據(jù)的NSData對象
- (NEFilterDataVerdict *)handleOutboundDataFromFlow:(NEFilterFlow *)flow
readBytesStartOffset:(NSUInteger)offset
readBytes:(NSData *)readBytes;
對出棧數(shù)據(jù)做出過濾決策器赞,flow參數(shù)就是數(shù)據(jù)流,offse是讀取的數(shù)據(jù)進度墓拜,readBytes:要過濾的數(shù)據(jù)的NSData對象
- (NEFilterDataVerdict *)handleInboundDataCompleteForFlow:(NEFilterFlow *)flow;
- (NEFilterDataVerdict *)handleOutboundDataCompleteForFlow:(NEFilterFlow *)flow;
上面的兩個方法分別對入棧和出棧的數(shù)據(jù)做出過濾的決策港柜。
- (void)handleRulesChanged;
當(dāng)Filter Control Provider調(diào)用notifyRulesChanged方法或返回NEFilterControlVerdict并將updateRules屬性設(shè)置為YES時,系統(tǒng)將調(diào)用此方法咳榜。
NEHotspotHelper
https://lpd-ios.github.io/2017/03/09/NEHotspotHelper/
NEHotspotHelper 可以使應(yīng)用程序參與到WIFI熱點的過程中夏醉,Hotspot Helper接受在后臺處理的命令,從而來控制Hotspot Network狀態(tài)機涌韩∨先幔可以參閱About the Hotspot Network Subsystem
在使用NEHotspotHelper進行開發(fā)時,需要以下幾點準(zhǔn)備工作
應(yīng)用程序的info.plist必須添加一個包含“網(wǎng)絡(luò)認證”的UIBackgroundModes數(shù)組
應(yīng)用程序必須設(shè)置“com.apple.developer.networking.HotspotHelper”作為它的權(quán)利之一臣樱。該權(quán)利的值是一個布爾值true
申請NEHotspot權(quán)限時靶擦,需要發(fā)送Email到networkextension@apple.com或點擊申請鏈接
更多信息可參閱Hotspot Network Subsystem Programming Guide
相關(guān)的API
Register a Hotspot Helper
+ (BOOL)registerWithOptions:(NSDictionary<NSString *, NSObject *> *)options
queue:(dispatch_queue_t)queue
handler:(NEHotspotHelperHandler)handler
@param options
<key>kNEHotspotHelperOptionDisplayName</key>
<string>WIFI的注釋tag字符串</string>
@param queue
dispatch_queue_t 用來調(diào)用handle的block
@param handler
NEHotspotHelperHandler block 用于執(zhí)行處理
@return 注冊成功YES, 否則NO
@discussion
一旦這個API調(diào)用成功雇毫,應(yīng)用程序有資格在后臺啟動玄捕,并參與各種熱點相關(guān)公布功能,當(dāng)應(yīng)用程序啟動此方法應(yīng)該調(diào)用一次棚放,再次調(diào)用它不會產(chǎn)生影響枚粘,并返回NO
Manage Hotspot Networks
+ (BOOL)logoff:(NEHotspotNetwork *)network
@param network
對應(yīng)當(dāng)前關(guān)聯(lián)的WIFI網(wǎng)絡(luò)NEHotSpotNetwork
@return 注銷命令已成功進入隊列YES, 否則返回NO
@discussion
調(diào)用此方法使kNEHotspotHelperCommandTypeLogoff型的NEHotspotHelperCommand向應(yīng)用程序發(fā)出的“handler”模塊席吴,網(wǎng)絡(luò)參數(shù)必須符合當(dāng)前關(guān)聯(lián)的WIFI網(wǎng)絡(luò)赌结,即它必須來自對NEHotspotHelperCommand網(wǎng)絡(luò)屬性或方法supportedInterfaces
+ (NSArray *)supportedNetworkInterfaces
@return
如果沒有接口被管理,返回nil孝冒,否則返回NEHotspotNetwork對象數(shù)組
@discussion
每個網(wǎng)絡(luò)接口由NEHotspotNetwork對象表示柬姚。當(dāng)前返回的數(shù)組包含一個NEHotspotNetwork對象代表WIFI接口。這種方法的主要目的是當(dāng)沒有得到一個命令來處理它時庄涡,hotSpot Helper 顯示UI中的狀態(tài)
此方法加上NEHotspotNetwork的isChosenHelper方法允許應(yīng)用程序知道它是否是當(dāng)前處理的網(wǎng)絡(luò)
Data Types
typedef void (^NEHotspotHelperHandler)(NEHotspotHelperCommand * cmd)
@discussion
當(dāng)調(diào)用方法registerWithOptions:queue:handler:時量承,Hotspot Helper app提供這種類型的block肘交。每次有要處理的命令時調(diào)用block
示例代碼
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:@"WI-FI TAG", kNEHotspotHelperOptionDisplayName, nil];
dispatch_queue_t queue = dispatch_queue_create("com.myapp.ex", 0);
BOOL returnType = [NEHotspotHelper registerWithOptions:options queue:queue handler: ^(NEHotspotHelperCommand * cmd) {
if(cmd.commandType == kNEHotspotHelperCommandTypeEvaluate ||
cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList)
{
for (NEHotspotNetwork* network in cmd.networkList)
{
if ([network.SSID isEqualToString:@"WX_moses"])
{
[network setConfidence:kNEHotspotHelperConfidenceHigh];
[network setPassword:@"mypassword"];
NSLog(@"Confidence set to high for ssid: %@ (%@)\n\n", network.SSID, network.BSSID);
// NSMutableArray *hotspotList = [NSMutableArray new];
// [hotspotList addObject:network];
// This is required
NEHotspotHelperResponse *response = [cmd createResponse:kNEHotspotHelperResultSuccess];
[response setNetwork:network];
[response deliver];
}
}
}
}];
獲取wifi列表
-(void)_getWifiList
{
NSMutableDictionary* options = [[NSMutableDictionary alloc] init];
[options setObject:@"??新網(wǎng)程-點我上網(wǎng)??" forKey:kNEHotspotHelperOptionDisplayName];
dispatch_queue_t queue = dispatch_queue_create("com.pronetwayXY", NULL);
BOOL returnType = [NEHotspotHelper registerWithOptions:options queue:queue handler: ^(NEHotspotHelperCommand * cmd)
{
NEHotspotNetwork* network;
NSLog(@"---------COMMAND TYPE: %ld", (long)cmd.commandType);
[cmd createResponse:kNEHotspotHelperResultAuthenticationRequired];
if (cmd.commandType == kNEHotspotHelperCommandTypeEvaluate || cmd.commandType ==kNEHotspotHelperCommandTypeFilterScanList)
{
NSLog(@"-----------WIFILIST: %@", cmd.networkList);
for (network in cmd.networkList) {
// NSLog(@"COMMAND TYPE After: %ld", (long)cmd.commandType);
if ([network.SSID isEqualToString:@"ssid"]|| [network.SSID isEqualToString:@"proict_test"]) {
double signalStrength = network.signalStrength;
NSLog(@"Signal Strength: %f", signalStrength);
[network setConfidence:kNEHotspotHelperConfidenceHigh];
[network setPassword:@"password"];
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);
}
NEHotspotConfigurationManager
NEHotspotConfigurationManager 是IOS 11剛剛推出的用戶獲取WiFi信息的框架扮休。
當(dāng)您的應(yīng)用使用NEHotspotConfiguration創(chuàng)建新的熱點配置并將其應(yīng)用于Wi-Fi網(wǎng)絡(luò)或嘗試更新以前配置的網(wǎng)絡(luò)時,設(shè)備會提示用戶進行審批。 未經(jīng)用戶明確同意丹拯,您的應(yīng)用無法進行配置更改。
您的應(yīng)用可以使用removeConfigurationForHS20DomainName:或removeConfigurationForSSID:刪除已添加的配置靶端,但不刪除其他應(yīng)用或用戶添加的配置融痛。 用戶還可以使用“設(shè)置”>“Wi-Fi”刪除已配置的網(wǎng)絡(luò)。
卸載應(yīng)用程序后狮腿,iOS將刪除應(yīng)用程序已配置的所有網(wǎng)絡(luò)的配置腿宰,包括其鑰匙串條目。
NEHotspotConfigurationError中列出了熱點配置管理器錯誤缘厢。
當(dāng)你使用NEHotspotConfigurationManager這個類時吃度,必須要在Xcode中打開Hotspot 這個能力
NEHotspotConfigurationManager的API
- (void)applyConfiguration:(NEHotspotConfiguration *)configuration
completionHandler:(void (^)(NSError *error))completionHandler;
在提示用戶許可后添加或更新Wi-Fi網(wǎng)絡(luò)配置,然后在特定條件下嘗試加入網(wǎng)絡(luò)贴硫。
此方法僅在附近找到時才嘗試加入網(wǎng)絡(luò)椿每。 此外,由于Hotspot 2.0發(fā)現(xiàn)機制可能會引起明顯的延遲英遭,因此該方法不會嘗試加入Hotspot 2.0網(wǎng)絡(luò)间护。
除了為Wi-Fi網(wǎng)絡(luò)提供SSID之外,您的應(yīng)用還必須使用NEHotspotEAPSettings和NEHotspotHS20Settings提供配置和身份驗證信息贪绘。 使用Hotspot 2.0網(wǎng)絡(luò)兑牡,應(yīng)用程序必須提供HS2.0域名而不是SSID。
如果已通過移動設(shè)備管理(MDM)配置文件或運營商捆綁包配置了相同的SSID或HS2.0域名税灌,則此方法不會添加配置均函。 如果您的應(yīng)用程序配置了熱點,并且稍后為具有相同域名的熱點安裝了MDM配置文件或Carrier軟件包菱涤,則新配置將覆蓋您的應(yīng)用程序配置苞也。
- (void)getConfiguredSSIDsWithCompletionHandler:(void (^)(NSArray<NSString *> *))completionHandler;
返回應(yīng)用程序已配置的SSID或Wi-Fi熱點域的名稱,并調(diào)用可選的完成處理block
- (void)removeConfigurationForHS20DomainName:(NSString *)domainName;
刪除應(yīng)用之前添加的由Hotspot 2.0域名標(biāo)識的Wi-Fi熱點配置粘秆。使用該方法可以刪除之前添加過的配置如迟,但不能刪除其他應(yīng)用或用戶添加的配置
- (void)removeConfigurationForSSID:(NSString *)SSID;
根據(jù)SSID來刪除添加的配置
@property(class, readonly, strong) NEHotspotConfigurationManager *sharedManager;
NEHotspotConfigurationManager的單例對象
NEHotspotConfigurationManager的使用
- (void)_test
{
NEHotspotConfiguration *configuration = [[NEHotspotConfiguration alloc] initWithSSID:@"youzu" passphrase:@"cuilinhao@@2018" isWEP:NO];
NSLog(@"-------%@--", configuration);
[[NEHotspotConfigurationManager sharedManager] applyConfiguration:configuration completionHandler:^(NSError * _Nullable error) {
if ([[self _currentIphoneConnectedWiFiName] isEqualToString:@"NET"])
{
NSLog(@">>>>>>>>>>>>>>>>>>加入網(wǎng)絡(luò)成功");
}
NSLog(@"----error---%@", error);
}];
}
- (NSString *)_currentIphoneConnectedWiFiName
{
NSString *wifiName = nil;
CFArrayRef wifiInterfaces = CNCopySupportedInterfaces();
if (!wifiInterfaces)
{
return nil;
}
NSArray *interfaces = (__bridge NSArray *)wifiInterfaces;
for (NSString *interfaceName in interfaces)
{
CFDictionaryRef dictRef = CNCopyCurrentNetworkInfo((__bridge CFStringRef)(interfaceName));
if (dictRef)
{
NSDictionary *networkInfoDic = (__bridge NSDictionary*)dictRef;
wifiName = [networkInfoDic objectForKey:(__bridge NSString *)kCNNetworkInfoKeySSID];
CFRelease(dictRef);
}
}
CFRelease(wifiInterfaces);
return wifiName;
}