ios - 你怎么 "resolve"一个GKTurnBasedExchange?

标签 ios game-center

我正在使用 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).这种方式的可取之处在于,不必轮到发件人来取消它。这是当前轮到者无关紧要的少数情况之一。不幸的是,这也有一个问题:如果有人已经回复,则不能取消交换。

因此结果是无法保证任何单个玩家都能解决交换问题,原因有二:

  1. active exchanges 移动到completed exchange 的过程只能以编程方式访问以取消exchange,并且只能由发起它的玩家访问,并且只有当还没有人回应。
  2. 已完成交换变为已解决交换的实际过程只能由比赛的currentParticipant属性中的玩家触发。

就我个人而言,我可以使用它,现在我理解了它(我希望),但毫无疑问这很痛苦。

关于ios - 你怎么 "resolve"一个GKTurnBasedExchange?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29322257/

相关文章:

xcode - 如何使用SwiftUI显示Game Center排行榜

iphone - 我可以更改游戏中心成就的图像吗?

ios - 回合制游戏中心在离线时显示不正确的游戏状态

android - 当应用程序 React Native 发生某些变化时的后台通知

ios - 由于 & 符号无法识别路径

ios - 停止 tableView.reloadData() 抛出错误?

ios - 未完成的执行警告

iOS 游戏中心组

iphone - 在 SQLite 中获取表中填充行的总数

ios - GameCenter 报告 Swift 3 成就