1

我不明白这有什么意义。我将两个对象放在我创建的 MCNearbyServiceAdvertiser 对象内的 discoveryinfo 字典中,并且浏览器看不到广告商,但是当我将第二个对象移出字典并在行尾将其注释掉时,浏览器会看到广告商。discoveryinfo 字典是否只接受一个对象才能工作?我有一个字符串作为第一个对象,一个数组作为第二个对象。这是它的样子:

advertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:myPeerID discoveryInfo:@{@"Name": [[NSString alloc] initWithString:myUniqueID], @"Peers": [[NSArray alloc] initWithArray:connectedPeersAry]} serviceType:@"Blahblah"];

在该行之前,我尝试了这种更简单的格式(但为了以防语法出现问题,请转到上面):

advertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:myPeerID discoveryInfo:@{@"Name": myUniqueID, @"Peers": connectedPeersAry} serviceType:@"FRCSCOUT"];

我想我可以在 discoveryinfo 字典中放置一个字典或数组,但我觉得这是一种非常愚蠢的做事方式,因为在任何情况下字典都不应该仅限于一个对象。

我将继续将我的对象放在另一个层中,以在 discoveryinfo 字典中“节省空间”,但如果你们中的任何人找到更好的做事方式或遇到同样的问题,请告诉我。

4

2 回答 2

1

字典中可以有多个对象discoveryInfo,但请记住,字典将被编码在 Bonjour TXT 记录中。这对可以放入该字典的内容施加了一些限制。

文档中所述[MCNearbyServiceAdvertiser initWithPeer:discoveryInfo:serviceType:]

此数据使用根据 RFC 6763(第 6 节)编码的 Bonjour TXT 记录进行广告。因此:

  • 以 UTF-8 格式编码时,键值对必须不超过 255 个字节(总计),键和值之间使用等号 (=)。
  • 键不能包含等号。

为获得最佳性能,此字典中键和值的总大小不应超过 400 字节,以便整个广告可以容纳在单个蓝牙数据包中。

于 2014-01-21T16:23:38.883 回答
0

嗯,发现了我的问题。正如 Apple 在 MCNearbyServiceAdvertiser 的类参考中引用的那样:

“discoveryInfo 的内容将在 Bonjour TXT 记录中公布,因此您应该保持字典较小以获得更好的发现性能。”

所以,看起来我将不得不使用某种逗号分隔的字符串......

编辑

我误解了 Multipeer Connectivity API。我认为角色互换了,广告商基本上是 Multipeer Session 的公共主机,但它应该是邀请广告商的浏览器。我现在只生成了唯一 ID 作为发现信息。

感谢大家的帮助,并对我的 API 混淆感到抱歉。

于 2014-01-11T20:52:08.017 回答