GameKit:在没有实际连接的情况下使用GKSession发送额外信息?

时间:2012-10-10 17:14:21

标签: iphone ios ipad gamekit gksession

我正在开发一个iOS应用程序,允许用户在本地与其他设备共享PDF。当应用程序启动时,设备会主动成为搜索正在广播文件的服务器的客户端。当客户端看到服务器时,它会在其选项卡中添加一个徽章,并在其表中添加一个条目。

我遇到的问题是GKSession只允许在建立连接之前传输一个字符串 - 对等显示名称。我想传达的是文件名,页数和缩略图。

我目前能想到实现此行为的唯一方法是自动连接客户端和服务器,交换文件信息,然后自动断开连接。如果当前只有一个或两个文件正在广播,这可能会很好用,当很多不同的设备正在广播时,可能会出现线程/同步问题。

例如,可能有7个文件可用。因此,客户端必须逐个连接它们才能接收所有文件的信息。这可能需要相当长的时间,并且用户可能已经决定他们希望下载“文件1”。通过点击“文件1”,应该建立连接并开始传输。如果客户端忙于检索有关其他可用文件的信息,则可能无法立即执行此操作。

我还看到了在断开连接后立即再次连接服务器的一些问题..(what GKSession doesn't connect on every attempt?)。

所以我想这可归结为简单的问题 - 有没有人有任何想法如何让客户端除了peerID和peerName之外还能接收有关服务器的其他信息?

2 个答案:

答案 0 :(得分:2)

如何以csv格式设置显示名称,当您收到csv名称时,只显示设备名称。

或者您可以发送NSDictionary的JSON字符串作为显示名称

示例Json转为NSString:

{
     "DeviceName" : "Example",
     "File" : [
            {
                "FileName" : "PDF1"
                "TotalPages" : 100
            }
            ]
}

字符串化版本:

{"DeviceName" : "Example","File" : [{"FileName" : "PDF1","TotalPages" : 100}]}

然后,当您收到DisplayName时,只显示DeviceName并在某处解析文件详细信息以便在以后发送服务器请求。

请记住,我不知道GKSession是否对显示名称长度有限制,因此此解决方案可能无法处理大量文件

答案 1 :(得分:0)

我所做的是将显示名称限制为16个字符,并使用剩余的24个字符供我使用。

我创建了偏移量,从中读取了应用所需的不同信息。例如,0到15将代表设备名称; 16-24将代表文件扩展名。 24到39将代表文件名。如果字符串比其各自的空间长,则将其截断,或根据您的喜好截断。如果字符串比其各自的空间短,则用空格填充。我编写了从40字符显示名称中获取这些字符串的方法。如果有人有更好的解决方案,我会很高兴在这里。目前无法发布代码,因为我无法访问它。

干杯