swift - 更新到 iOS 8.3 和 swift 1.2 后,endTurnWithNextParticipants 不会触发 receivedTurnEventForMatch

标签 swift game-center

自更新到 iOS8.3 以来,有没有人注意到回合制比赛通知有任何变化?在我的应用程序中,当我在升级之前调用 endTurnWithNextParticipants 时,这会导致向对手发送通知,这将触发在他们的设备上调用 receivedTurnEventForMatch,但现在不再是这种情况。当对手终止应用程序并重新启动时,他们可以看到轮到他们了,因此游戏中心的比赛已根据参与顺序正确更新,但这似乎不再动态生效。

还有人看到这个吗?我希望这只是游戏中心沙盒环境中的一个临时故障。

我已经向 apple 提交了一个错误报告,看看它是否真的是一个错误,或者我们需要了解的 iOS8.3 中是否存在一些未记录的行为更改。

最佳答案

更新的答案:

我原来的想法,下面,结果证明是不可靠的。您不能指望 saveCurrentTurnWithMatchData 及时发送通知。它大部分时间都有效,但至少有 10% 的时间也无法发送通知。在此处发布的所有想法中,我发现 唯一 可以 100% 可靠地工作的方法是在非事件机器上设置一个计时器循环并持续观察直到你变得活跃。

-(void)isMatchActive:(NSTimer *)timer
{
    NSString *matchID = (NSString *)timer.userInfo;

    [GKTurnBasedMatch loadMatchWithID:matchID withCompletionHandler:^(GKTurnBasedMatch *match, NSError *error)
    {
        GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
        GKTurnBasedParticipant *currentParticipant = match.currentParticipant;

        if ([localPlayer.playerID isEqualToString:currentParticipant.player.playerID])
        {
            //we have become active. Call the event handler like it's supposed to be called
            [self player:localPlayer receivedTurnEventForMatch:match didBecomeActive:false];
        }
        else
        {
            //we are still waiting to become active. Check back soon
            float dTime = 5.0;
            gameController.IOS8BugTimer = [NSTimer scheduledTimerWithTimeInterval:dTime
                                                                          target:self
                                                                     selector:@selector(isMatchActive:)
                                                                     userInfo:matchID
                                                                      repeats:NO];
         }
     }];
}

原答案:

所以,我有一个解决方法,它虽然笨拙但看起来很有前途。请注意,根据我上面的评论,后续玩家在当前玩家执行 saveCurrentTurnWithMatchData 后仍会收到事件。所以我使用它发送我自己的自定义信号:

  1. 我在 matchData 中添加了一个字符串作为“下一个玩家的 ID”。

  2. 就在我调用 endTurnWithNextParticipants 之前,我将该字符串设置为轮换中下一位玩家的 ID。

  3. 我调用saveCurrentTurnWithMatchData

  4. 我将调用移至 saveCurrentTurnWithMatchData 的完成处理程序内的 endTurnWithNextParticipants,以确保它不会在 saveCurrentTurnWithMatchData 之后触发.

  5. 为了解决这个问题,我将 GKTurnBasedEventHandlerDelegate 添加到我的代码中。 handleTurnEventForMatch 在 8.3 中也被破坏了,但我在那里整合了我所有的解决方法代码并且不必对 receivedTurnEventForMatch

  6. 进行更改
  7. handleTurnEventForMatch 中,我检查“下一个玩家”字符串是否是我。如果是这样,我假设当前玩家刚刚在第 2 步中保存了游戏,表明他打算将回合传给我。

  8. 我启动一个计时器循环,重新加载比赛数据,直到它显示我已成为活跃玩家。

  9. 当我看到我现在是活跃玩家时,我将自定义的下一个玩家字符串重置为 nil,并手动调用 receivedTurnEventForMatch 将我刚刚下载的比赛数据传递给它。

总而言之,玩家 1 发送了一个额外的 saveTurn 事件来表示他打算结束回合。当 player2 收到该信号时,他重新读取比赛数据,直到它显示他已激活。然后他用更新的比赛数据调用他自己的 receivedTurnEventForMatch,允许回合继续进行。

我还没有完成所有场景,但看起来这会奏效。

关于swift - 更新到 iOS 8.3 和 swift 1.2 后,endTurnWithNextParticipants 不会触发 receivedTurnEventForMatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29568913/

相关文章:

ios - 无法在 IOS 13 上导入具有自定义 UTI 扩展名的文件

ios - 从 Swift 函数中的异步调用返回数据

iOS 排行榜游戏中心

iphone - 游戏中心排行榜显示计数,不输入分数

ios - 用户取消 3 次后重新启用 GameCenter(仅限 iOS7)

ios - 如何使用后退按钮更新 tableviewcell?

ios - 使用 swift 将本地 html 加载到 UIWebView

ios - NSMutableDictionary 缓存和/或大小限制

将元素添加到数组时出现 Swift 语法错误

ios - iOS 10 中的游戏中心挑战