NEHotspotHelper аннотации не отображаются

Мы опробовали новый API NetworkExtension. Нам удалось воссоздать все шаги в нашем приложении. Но у нас есть проблема, заключающаяся в том, что мы все еще не видим пользовательскую аннотацию под именем SSID на экране настроек Wi-Fi. Мы находимся на ios 9 Beta 3, xcode 7 beta 3.

Мы успешно сделали эти шаги:

  • @ примечание 1 Info.plist приложения ДОЛЖЕН включать массив UIBackgroundModes *, содержащий "сетевую аутентификацию".

  • @ примечание 2  * Приложение ДОЛЖНО установить в качестве одного из своих прав 'com.apple.developer.networking.HotspotHelper'  *. Значение права является логическим значением * true.

Вот наш код в приложении. Мы пытаемся аннотировать SSID по имени "Интернет" текстом "Попробуйте здесь". Мы получаем журнал, что метод setConfidence вызывается для SSID "Интернет". Тем не менее, мы не видим фактическую аннотацию на экране выбора Wi-Fi.

Мы также попытались передать 'nil' для объекта параметров, который обещал показать имя приложения в качестве аннотации по умолчанию. Но мы этого тоже не видим. Мы возвращаем 'true' для вызова метода registerWithOptions() и получаем обратные вызовы, когда открываем экран настроек wifi

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

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

Пожалуйста, помогите нам понять, чего нам не хватает?

3 ответа

Я реализовал приведенный ниже код для проверки подлинности и аннотирования точки доступа Wifi с помощью "Connect to MyWifi" для SSID "TP-LINK" из приложения. Он работает нормально.

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

Примечание: чтобы вышеприведенный код работал,

  1. вам нужно получить права доступа от Apple, отправив их по электронной почте по http://networkextension@apple.com/.
  2. После получения разрешения вам нужно создать новый профиль обеспечения, в котором вам нужно будет добавить разрешение на расширение сети (доступно только при наличии доступа) и использовать этот профиль в xcode для его работы.
  3. Добавьте право com.apple.developer.networking.HotspotHelper в значение true в файле прав в вашем xcode.
  4. В Info.plist добавьте ключ сетевой аутентификации в массив Обязательных фоновых режимов. Надеюсь, это поможет. Спасибо

Сначала вам нужно зарегистрировать приложение как Hotspot Helper по электронной почте https://forums.developer.apple.com/thread/11807

Кажется, это не работает именно так. Объект NEHotspotHelperCommand действительно ожидает NEHotspotHelperResponse. Вы не можете изменять сети напрямую.

Все, чего вам не хватает в вашем коде - это доставка 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); 
           }  
       }    
   } 
}];

Надеюсь, это поможет. Прошло больше месяца, но я только что получил разрешение на это право.

Другие вопросы по тегам