iOS で Bonjour は NSNetService 一発で OK!

とりあえず参考にしたのはこのページ。

かな〜り古い話だけど、仕組みの基本みたいな話なので問題なし。
「Announcing the server via Bonjour」という項目にちょこっと説明が書いてある。
けど、実際のコードを見た方がこの件については早いかな。

#pragma mark Bonjour

- (BOOL) publishService {
	// come up with a name for our chat room
	NSString* serviceName = @"iPhone daap";
	
	// create new instance of netService
 	self.netService = [[NSNetService alloc]
					   initWithDomain:@"" type:@"_daap._tcp."
					   name:serviceName port:HTTP_SERVER_PORT];
	if (self.netService == nil)
		return NO;
	
	// Add service to current run loop
	[self.netService scheduleInRunLoop:[NSRunLoop currentRunLoop]
							   forMode:NSRunLoopCommonModes];
	
	// NetService will let us know about what's happening via delegate methods
	[self.netService setDelegate:self];
	
	// Publish the service
	[self.netService publish];
	
	return YES;
}

- (void) unpublishService {
	if ( self.netService ) {
		[self.netService stop];
		[self.netService removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
		self.netService = nil;
	}
}

前回の続きなので、実際に daap のサービスは提供しないけど type は "_daap._tcp" にしておいた。
これで publishService してから昨日の mDNS アプリを起動すると…。

こんな感じでちゃんと daap サーバ情報が見つかる。
1つは昨日も見つかった CentOS で動いている mt-daapd(Firefly)。
もう一つは今回 iPhone でサービスを提供してるよ!と Bonjour で宣伝した "iPhone daap"。
ちゃんと発信できてる!


というわけで、先日の AndroidBonjour 使ってネットワーク内のサービスを確認するのと、今回の iOSBonjour を使ってネットワーク内にサービスの提供を発信するのを組み合わせて、Android から iOS のサービスのアドレスとポートを知ることができるようになったよ〜!


今まで imMap と imGPS の間のやりとりは imMap が自身のアドレスを確認して「そのアドレスの一番右側の数字を 1 にすればテザリングしてくれてる iPhone だろう!」ということでアドレスを設定していたのだけど、これでテザリングしてくれている iPhone 以外の iPhone に imGPS が入っていても大丈夫!(って、そんな使い方絶対にしないけど…)


ところで、mDNS の type に使う文字列は他とぶつかりそうにない物を適当に使っても良いものなのかな?