我正在使用GKTurnBasedExchange以一种方式发送数据。当某些触发器发生时,它会通知其他玩家。但是,其他玩家当时甚至可能不在游戏中。转弯有48小时的超时,所以理论上如果玩家1发送了所述交换,玩家3可能不会在几天内接听它。没关系,玩家1不要求或期待任何回应。
但是,当player1尝试保存匹配数据,结束转弯或退出比赛时,我收到错误:
错误域= GKErrorDomain代码= 3“请求的操作不能 由于与服务器通信时出错而完成。“ UserInfo = 0x19317970 {GKServerStatusCode = 5134, NSUnderlyingError = 0x16f15db0“操作无法完成。 status = 5134,此会话的操作无效,因为交换 没有解决。 所有交易必须在当前之前解决 玩家可以完成此操作。
好吧,除了一个小细节外,粗体文字看起来很明显:我找不到任何关于什么构成“已解决”交换的参考。我不希望回复此消息。即使我这样做,也可能需要数天才能收到它。我能看到的唯一选择是发件人取消交换,这首先打败了交易所的目的
那么,一个人如何最终确定交易所?除了取消交换之外,还有哪些步骤将满足游戏中心的交换已被“解决”? 我刚刚使用:
[theMatch sendExchangeToParticipants:exchangeParticipants
data:exchangeData
localizableMessageKey:@"F1"
arguments:nil
timeout:600
completionHandler:^(GKTurnBasedExchange *exchange, NSError *error)
{
if (error)
{
VLOG(LOWLOG, @"%@", [error description]);
}
}
];
其次是:
[theMatch saveCurrentTurnWithMatchData:dataCopy completionHandler:^(NSError *error)
{
if (error)
{
VLOG(LOWLOG, @"%@", [error description])
}
}];
saveCurrentTurnWithMatchData调用返回上述错误。
谢谢!
答案 0 :(得分:2)
我想我想出来了。 男人哦男人这是一个了解Apple文档的障碍。
最后我实际上没有理解:这是暴力试验和错误的结果。
所以这就是交易:你可以通过交流做很多事情,但实际上解决他们你必须打电话:
saveMergedMatch(matchData: Data, withResolvedExchanges: [GKTurnBasedExchange], completionHandler: ((Error?) -> Void))
虽然有几次捕获。
currentParticipant
(转过来的玩家)才能成功拨打saveMergedMatch
。.active
状态的交易。.active
状态的交换。cancel(withLocalizableMessageKey key: String, arguments: [String], completionHandler: ((Error?) -> Void)? = nil)
,发件人和交易所的发件人可以取消它。这种节省的优点是它不必是发送者的来取消它。这是当前交易者无所谓的少数几次之一。不幸的是,这也有一个问题:如果有人已经回复了交换,则不能取消交换。因此结果是,任何单一玩家都无法保证能够解决交换,原因有两个:
currentParticipant
媒体资源中的玩家触发。就个人而言,我可以解决这个问题,因为我理解(我希望),但毫无疑问这是一个非常痛苦的事。
答案 1 :(得分:1)
好吧,结果交换不能使用。 Game Kit的另一个限制。对于遇到此主题的任何人,我发现WWDC 2013会话506说:
你必须致电:
[match saveMergedMatchData:dataCopy
withResolvedExchanges:match.completedExchanges
completionHandler:...];
因此,您不能将交换用于单向通信。必须有响应(或等待超时)。
答案 2 :(得分:0)
我想我会回答以下未解决的问题:如何通过通知发送单向通信。
我认为最好的API是GKTurnBasedMatch实例上的setLocalizableMessageWithKey(key:arguments :)或sendReminderToParticipants(localizableMessageKey:arguments:completionHandler :)。