NEHotspotHelper annotations not appearing

2019-01-09 02:12发布

We tried out the new NetworkExtension API. We were successful in recreating all the steps in our app. But, we have an issue that we are still not seeing the custom annotation below the SSID name in the Wifi settings screen. We are on ios 9 Beta 3, xcode 7 beta 3.

We have done these steps successfully:

  • @note 1 The application's Info.plist MUST include a UIBackgroundModes array  *   containing 'network-authentication'.

  • @note 2  *   The application MUST set 'com.apple.developer.networking.HotspotHelper'  *   as one of its entitlements. The value of the entitlement is a boolean  *   value true.

Here's our code in the App. We are trying to annotate a SSID by the name of "Internet" by a text "Try Here". We get the log that the setConfidence method is called for SSID "Internet". Yet, we do not see the actual annotation in the Wifi selection screen.

We also tried to pass 'nil' for the options object which promised to show the App name as the default annotation. But we do not see that either. We get return 'true' for the call to method registerWithOptions() and we do get callbacks when we open the wifi settings screen

 

NSMutableDictionary* options = [[NSMutableDictionary alloc] init]; 
[options setObject:@"Try Here" forKey:kNEHotspotHelperOptionDisplayName]; 
 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:@"Internet"]){ 
                [network setConfidence:kNEHotspotHelperConfidenceHigh];               
                NSLog(@"Confidance set to high for ssid:%@",network.SSID); 
            }  
        }    
    } 
}];

=========================

Please help us to understand what we are missing ?

3条回答
贪生不怕死
2楼-- · 2019-01-09 02:31

It seem it does not work exactly that way. A NEHotspotHelperCommand object actually expects a NEHotspotHelperResponse. You cannot modify the networks directly.

All your are missing in your code is the delivery of the NEHotspotHelperResponse.

NSMutableDictionary* options = [[NSMutableDictionary alloc] init];
[options setObject:@"Try Here" forKey:kNEHotspotHelperOptionDisplayName];
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:@"Internet"]) {
               [network setConfidence:kNEHotspotHelperConfidenceHigh];

               // This is required
               NEHotspotHelperResponse *response = [cmd createResponse:kNEHotspotHelperResultSuccess];
               [response setNetworkList:@[ network ]];
               [response deliver];   

               NSLog(@"Confidance set to high for ssid:%@",network.SSID); 
           }  
       }    
   } 
}];

Hope that helps. It's been over a month, but I just got cleared for this entitlement.

查看更多
我欲成王,谁敢阻挡
3楼-- · 2019-01-09 02:47

I have implemented the below code for authenticating and annotating the Wifi hotspot with "Connect to MyWifi" for SSID "TP-LINK" from within the app, It works fine.

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:@"Connect to MyWifi", kNEHotspotHelperOptionDisplayName, nil];

dispatch_queue_t queue = dispatch_queue_create("com.myapp.ex", 0);
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 name:%@", network.SSID);
            if ([network.SSID isEqualToString:@"TP-LINK"]) {
                [network setConfidence:kNEHotspotHelperConfidenceHigh];
                [network setPassword:@"<wifi-password>"];                    
                [hotspotList addObject:network];
            }
        }

        NEHotspotHelperResponse *response = [cmd createResponse:kNEHotspotHelperResultSuccess];
        [response setNetworkList:hotspotList];
        [response deliver];
    }
}];

Note: For the above code to work,

  1. you need to get entitlement access from apple by mailing them on networkextension@apple.com.
  2. Once you have the entitlement, you need to create new provisioning profile where you will have to add the network extension entitlement(available only if you have access) and use that profile in your xcode for it to work.
  3. Add entitlement com.apple.developer.networking.HotspotHelper to true in your entitlement file in your xcode enter image description here
  4. In Info.plist add network-authentication key to Required background modes array enter image description here Hope that helps. Thanks
查看更多
祖国的老花朵
4楼-- · 2019-01-09 02:50

You first need to register your app as Hotspot Helper via email https://forums.developer.apple.com/thread/11807

查看更多
登录 后发表回答