iOS NetworkExtension學(xué)習(xí)

系統(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的能力碾阁,具體如下圖


image.png

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;
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市攻走,隨后出現(xiàn)的幾起案子殷勘,更是在濱河造成了極大的恐慌,老刑警劉巖玲销,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異摘符,居然都是意外死亡贤斜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門猴抹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蟀给,“玉大人,你說我怎么就攤上這事阳堕±だ#” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵嘱丢,是天一觀的道長。 經(jīng)常有香客問我祠饺,道長越驻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任道偷,我火速辦了婚禮缀旁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘勺鸦。我一直安慰自己并巍,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布换途。 她就那樣靜靜地躺著懊渡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪军拟。 梳的紋絲不亂的頭發(fā)上剃执,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音懈息,去河邊找鬼肾档。 笑死,一個胖子當(dāng)著我的面吹牛辫继,可吹牛的內(nèi)容都是我干的怒见。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼姑宽,長吁一口氣:“原來是場噩夢啊……” “哼遣耍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起低千,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤配阵,失蹤者是張志新(化名)和其女友劉穎馏颂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棋傍,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡救拉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瘫拣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亿絮。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖麸拄,靈堂內(nèi)的尸體忽然破棺而出派昧,到底是詐尸還是另有隱情,我是刑警寧澤拢切,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布蒂萎,位于F島的核電站,受9級特大地震影響淮椰,放射性物質(zhì)發(fā)生泄漏五慈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一主穗、第九天 我趴在偏房一處隱蔽的房頂上張望泻拦。 院中可真熱鬧,春花似錦忽媒、人聲如沸争拐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽架曹。三九已至,卻和暖如春金赦,著一層夾襖步出監(jiān)牢的瞬間音瓷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工夹抗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绳慎,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓漠烧,卻偏偏與公主長得像杏愤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子已脓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容