你如何“解决”GKTurnBasedExchange?

时间:2015-03-28 20:30:16

标签: ios game-center

我正在使用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调用返回上述错误。

谢谢!

3 个答案:

答案 0 :(得分:2)

我想我想出来了。 男人哦男人这是一个了解Apple文档的障碍。

最后我实际上没有理解:这是暴力试验和错误的结果。

所以这就是交易:你可以通过交流做很多事情,但实际上解决他们你必须打电话:

saveMergedMatch(matchData: Data, withResolvedExchanges: [GKTurnBasedExchange], completionHandler: ((Error?) -> Void))

虽然有几次捕获。

  • 只有匹配的currentParticipant(转过来的玩家)才能成功拨打saveMergedMatch
  • 它仅适用于非.active状态的交易。
  • 据我所知,只有两种方式可以通过编程方式获得.active状态的交换。
  • 更难的方式:交易所的所有接受者都必须在交易所上行动 - 这本身就是一个模糊的过程,无法帮助。如果所有收件人都对此做出响应,Game Center本身将处理更改交换状态,我认为。但不确定,因为我不这样做。 [我能给予的唯一帮助是,如果你在发送时给交换机一个非常短暂的超时,超时通过后,Game Center会自动调整交换机的状态,你的收件人将不需要做任何事情。] < / LI>
  • 更简单的方法:通过调用交换的方法cancel(withLocalizableMessageKey key: String, arguments: [String], completionHandler: ((Error?) -> Void)? = nil),发件人和交易所的发件人可以取消它。这种节省的优点是它不必是发送者的来取消它。这是当前交易者无所谓的少数几次之一。不幸的是,这也有一个问题:如果有人已经回复了交换,则不能取消交换。

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

  1. 活动交换移动到已完成交换的过程只能以编程方式访问,以取消交换,并且只能由发起它的播放器访问,并且仅在还没有人回应。
  2. 已完成交换转换为已解决的交换的实际流程只能由匹配的currentParticipant媒体资源中的玩家触发。
  3. 就个人而言,我可以解决这个问题,因为我理解(我希望),但毫无疑问这是一个非常痛苦的事。

答案 1 :(得分:1)

好吧,结果交换不能使用。 Game Kit的另一个限制。对于遇到此主题的任何人,我发现WWDC 2013会话506说:

  1. 所有参赛者必须回应游戏中心,将交换标记为“已完成”
  2. 你必须致电:

    [match saveMergedMatchData:dataCopy
         withResolvedExchanges:match.completedExchanges
             completionHandler:...];
    
  3. 因此,您不能将交换用于单向通信。必须有响应(或等待超时)。

答案 2 :(得分:0)

我想我会回答以下未解决的问题:如何通过通知发送单向通信。

我认为最好的API是GKTurnBasedMatch实例上的setLocalizableMessageWithKey(key:arguments :)或sendReminderToParticipants(localizableMessageKey:arguments:completionHandler :)。