0

I'm working on advertising a desktop client to phones on the local network. My phone is at 6.0.2 with the Xcode 4.5.2.

I know the desktop app is registering successfully because the Discovery app (by Tildesoft) on my phone shows my service on the network (which also rules out wifi problems).

I've downloaded the Apple app example, Bonjour Web. The delegate for finding "_myservice._tcp" didn't ever fire, but the start browsing method does fire.

I tried using HHServices (which wraps DNSService), and while the start browsing method fired, the service found method doesn't fire.

In my own app, I tried using NSNetServiceBrowser. I set the delegate, and my "netServiceBrowserWillSearch" delegate method gets fired, but nothing else happens.

Code is attached if you want to verify.

Header:

#import <UIKit/UIKit.h>
@interface ClientFinder_ViewController : UIViewController<UITableViewDataSource, UITableViewDelegate,NSNetServiceBrowserDelegate>

@property (weak, nonatomic) IBOutlet UITableView *availableClientsTableView;


-(void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindDomain:(NSString *)domainString moreComing:(BOOL)moreComing;
-(void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing;
-(void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didNotSearch:(NSDictionary *)errorDict;
-(void)netServiceBrowserDidStopSearch:(NSNetServiceBrowser *)aNetServiceBrowser;
-(void)netServiceBrowserWillSearch:(NSNetServiceBrowser *)aNetServiceBrowser;

@end

Relevant Implementation:

- (void)viewDidLoad
{
    [super viewDidLoad];
    dictionaryFoundClients = [[NSMutableDictionary alloc] initWithCapacity:1];
    [self addLogoToNabar];
    [self listen];
}

-(void)listen{
    NSNetServiceBrowser *serviceBrowser = [NSNetServiceBrowser new];
    [serviceBrowser setDelegate:self];
    [self.netServiceBrowser searchForServicesOfType:TYPE inDomain:domain];
}


-(void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindDomain:(NSString *)domainString moreComing:(BOOL)moreComing{
    NSLog(@"aNetServiceBrowser didFindDomain");
}


-(void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing{
    NSLog(@"aNetServiceBrowser didFindService");
    [dictionaryFoundClients setObject:aNetService forKey:aNetService.hostName];
    NSLog(@"Found service: %@ @ %@", aNetService.name, aNetService.hostName);
}

-(void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didNotSearch:(NSDictionary *)errorDict{
    NSLog(@"aNetServiceBrowser didNotSearch. Errors enumerated");
    for(int a=0; a< errorDict.count; a++){
        NSString *key = [[errorDict allKeys] objectAtIndex:a];
        NSString *val = [errorDict objectForKey:key];
        NSLog(@"%@: %@", key, val);
    }
}

-(void)netServiceBrowserDidStopSearch:(NSNetServiceBrowser *)aNetServiceBrowser{
    NSLog(@"netServiceBrowserDidStopSearch");
}

-(void)netServiceBrowserWillSearch:(NSNetServiceBrowser *)aNetServiceBrowser{
    NSLog(@"netServiceBrowserWillSearch");
}
C Fairweather
  • 696
  • 4
  • 20
  • This looks like similar to other thread and my answer is [here][1] [1]: http://stackoverflow.com/a/17259893/1850244 – vedrano Jun 23 '13 at 10:40

2 Answers2

0

If this is all local, you need to use searchForServicesOfType: method instead of searchForRegistrationDomains method.

-(void)listen{
  NSNetServiceBrowser *serviceBrowser = [NSNetServiceBrowser new];
  [serviceBrowser setDelegate:self];
  [serviceBrowser searchForServicesOfType:@"_your_service_type._tcp" inDomain:@""];;
}

"_your_service_type._tcp" is the service type your desktop application is using when it advertises its service.

Satoshi Nakajima
  • 1,863
  • 18
  • 29
  • I apologize, before I posted by code, I was trying to get NSNetServiceBrowser to do *anything*. I'll edit my question. I actually have an answer to it now. – C Fairweather Jan 14 '13 at 17:44
0

Not sure why it started working, but here is my working code:

    [self stopCurrentResolve];
    [self.netServiceBrowser stop];
    [self.services removeAllObjects];

    NSNetServiceBrowser *aNetServiceBrowser = [[NSNetServiceBrowser alloc] init];
    if(!aNetServiceBrowser) {
        // The NSNetServiceBrowser couldn't be allocated and initialized.
        return NO;
    }

    aNetServiceBrowser.delegate = self;
    self.netServiceBrowser = aNetServiceBrowser;
    [self.netServiceBrowser searchForServicesOfType:type inDomain:domain];
C Fairweather
  • 696
  • 4
  • 20