我正在使用 GKTurnBasedExchange 以一种方式发送数据。当某些触发器发生时,它会通知其他玩家。然而,当时其他玩家甚至可能不在游戏中。轮流有 48 小时的超时,所以理论上,如果玩家 1 发送所述交换,玩家 3 可能几天都不会接收它。没关系,玩家 1 不需要或期望任何响应。
但是,当 player1 尝试保存比赛数据、结束回合或退出比赛时,我得到一个错误:
Error Domain=GKErrorDomain Code=3 "The requested operation could not be completed due to an error communicating with the server." UserInfo=0x19317970 {GKServerStatusCode=5134, NSUnderlyingError=0x16f15db0 "The operation couldn’t be completed. status = 5134, Invalid operation for this session because the exchange was not resolved. All exchanges must be resolved before the current player can complete this operation.
好吧,除了一个小细节外,加粗的文字似乎很容易解释:我在任何地方都找不到任何关于什么构成“已解决”交换的引用。我不希望回复此消息。即使我这样做了,也可能需要几天时间才能收到。我能看到的唯一选择是发送方取消交换,这违背了发送交换的初衷
那么,究竟如何完成一笔交易呢?除了取消兑换外,还有哪些步骤能让游戏中心认为兑换已经“解决”了? 我只是在使用:
[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 调用返回上述错误。
谢谢!
最佳答案
我想我明白了。 伙计,伙计,这是理解 Apple 文档的苦差事。
最后我其实也没看懂:这是蛮力试错的结果。
事情是这样的:你可以用交换做很多事情,但要真正解决它们,你必须调用:
saveMergedMatch(matchData: Data, withResolvedExchanges: [GKTurnBasedExchange], completionHandler: ((Error?) -> Void))
虽然有几个问题。
- 只有比赛的
currentParticipant
(轮到的玩家)才能成功调用saveMergedMatch
。 - 它仅适用于不处于
.active
状态的交易所。 - 据我所知,只有两种方法可以通过编程方式使交换脱离
.active
状态。 - 更难的方法:交换的所有接收者都必须对交换采取行动——这本身就是一个模糊的过程,对此无能为力。如果所有收件人都响应它,Game Center 本身将处理更改交换状态,我认为。不过不确定,因为我不这样做。 [我在这里唯一能提供的帮助是,如果你在发送时给交换一个非常短的超时时间,超时过后Game Center会自动调整交换状态,你的收件人不需要做任何事情。]
- 不太简单的方法:发送方并且只有发送方可以通过调用交换的方法
cancel(withLocalizableMessageKey key: String, arguments: [String ], completionHandler: ((Error?) -> Void)? = nil)
.这种方式的可取之处在于,不必轮到发件人来取消它。这是当前轮到者无关紧要的少数情况之一。不幸的是,这也有一个问题:如果有人已经回复,则不能取消交换。
因此结果是无法保证任何单个玩家都能解决交换问题,原因有二:
- 将active exchanges 移动到completed exchange 的过程只能以编程方式访问以取消exchange,并且只能由发起它的玩家访问,并且只有当还没有人回应。
- 将已完成交换变为已解决交换的实际过程只能由比赛的
currentParticipant
属性中的玩家触发。
就我个人而言,我可以使用它,现在我理解了它(我希望),但毫无疑问这很痛苦。
关于ios - 你怎么 "resolve"一个GKTurnBasedExchange?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29322257/