Bonjour TXT record vs Network framework

I'm creating a simple p2p server to advertise a service:

// server
	let txtRecord = NWTXTRecord(["key": "value"])
	NWListener.Service(name: name, type: "_p2p._tcp", domain: nil, txtRecord: txtRecord)

and client to look that service up:

// client
	switch result.endpoint {
		case let .service(name: name, type: type, domain: domain, interface: interface):
			print(result.metadata)

The client is getting the advertisement ok, but metadata is nil. I expected to see a txt record there, is that not supported?

	public let metadata: NWBrowser.Result.Metadata
	/// Additional metadata provided to the browser by a service. Currently,
	/// only Bonjour TXT records are supported.

Is the above server making a Bonjour TXT record or something else?

Basically what I want is to pass a short key/value data as part of advertisement.

Answered by Etresoft in 849494022

According to this post: https://stackoverflow.com/questions/76238555/why-are-txt-records-set-to-nil-when-using-nwbrowser-for-network-framework

the problem is in the NWBrowser. There are two different descriptor types, .bonjour and .bonjourWithTXTRecord.

Hopefully that will fix it. If not, you'll have to work your way through the debugging path.

Accepted Answer

According to this post: https://stackoverflow.com/questions/76238555/why-are-txt-records-set-to-nil-when-using-nwbrowser-for-network-framework

the problem is in the NWBrowser. There are two different descriptor types, .bonjour and .bonjourWithTXTRecord.

Hopefully that will fix it. If not, you'll have to work your way through the debugging path.

Thank you!

Using bonjourWithTXTRecord instead of bonjour on the client (browser) fixed the problem. Note that there are two relevant fields:

  • result.metadata - this is getting set to txt record (when using bonjourWithTXTRecord,
  • result.endpoint.txtRecord - this is nil
Bonjour TXT record vs Network framework
 
 
Q