NSNetService не содержит адресов

Я размещаю службу в приложении Mac и подключаюсь к приложению iOS. Хотя приложение iOS найдет службу, служба не содержит никаких адресов, поэтому я не могу подключить сокет.

Это мой код хостинга на Mac:

- (void)start {

    queue = dispatch_queue_create("KeyboardServer", DISPATCH_QUEUE_CONCURRENT);

    socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:queue];

    NSError *error = nil;

    if ([socket acceptOnPort:0 error:&error]) {

        service = [[NSNetService alloc] initWithDomain:@"local." type:@"_probonjore._tcp." name:@"TestServer" port:[socket localPort]];

        service.delegate = self;

        [service publish];

    } else {
        NSLog(@"Unable to create server");
    }
}

Это код подключения на iOS:

- (BOOL)connectToServer:(NSNetService *)service {

    NSArray *addresses = service.addresses;

    socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:queue];

    for (NSData *address in addresses) {

        NSError *error;

        if ([socket connectToAddress:address error:&error]) {
            NSLog(@"Socket connected!");

            return true;
        }
    }

    return false;
}

Проблема в том, что service.addresses всегда пуст, и цикл мгновенно завершается.


person Lepidora    schedule 23.03.2019    source источник
comment
Есть ли способ, чтобы он автоматически выбирал порт, или мне просто нужно выбрать один наугад и надеяться, что он уже не будет занят?   -  person Lepidora    schedule 23.03.2019
comment
Я только что проверил, и библиотека сокетов (GCDAsyncSocket) автоматически выбирает порт, если вы передаете ей 0. Служба публикуется на порту 51417, когда я в последний раз запускал ее.   -  person Lepidora    schedule 23.03.2019


Ответы (1)


Кому интересно, я поискал и нашел решение.

в

- (void)netServiceBrowser:(NSNetServiceBrowser *)browser didFindService:(NSNetService *)service moreComing:(BOOL)moreComing

функции, вам необходимо:

  • Добавьте службу в массив, чтобы предотвратить освобождение объекта, как только он выйдет за пределы области видимости.
  • Установите делегат на объект, чтобы вы могли реагировать на его разрешение адреса
  • Вызовите функцию, чтобы разрешить ее

Что выглядит так:

- (void)netServiceBrowser:(NSNetServiceBrowser *)browser didFindService:(NSNetService *)service moreComing:(BOOL)moreComing {

    NSLog(@"Found Service %@", [service name]);

    [services addObject:service];

    [service setDelegate:self];

    [service resolveWithTimeout:5.0f];
}

Затем вы хотите реализовать

- (void)netService:(NSNetService *)sender didNotResolve:(NSDictionary *)errorDict

и

- (void)netServiceDidResolveAddress:(NSNetService *)service

Чтобы поймать, когда адрес разрешается или не разрешается.

person Lepidora    schedule 24.03.2019