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

时间:2015-04-10 19:03:12

标签: swift game-center

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

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

我已经向苹果提出了一个错误报告,看看它是否真的是一个错误,或者我们需要了解iOS8.3中是否存在一些无证的行为变化。

3 个答案:

答案 0 :(得分:3)

我有同样的问题..我有多个设备,而8.3的设备不会触发receiveTurnEventForMatch事件,但是当应用程序在后台运行时,关于转弯的横幅通知将照常显示。只有在应用程序处于前台时才会出现问题。

另一方面,8.2或8.1.3的设备在任何情况下都能正常工作。所以这肯定是由8.3引起的。同样具有8.3的设备在Xcode中被标记为不合格。它也会发生在你身上吗?

答案 1 :(得分: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 ,将刚刚下载的匹配数据传递给它。

  10. 总而言之,player1发送一个额外的saveTurn事件来表示他打算结束转弯。当player2收到该信号时,他重新读取匹配数据,直到它显示他已经变为活动状态。然后他使用更新的匹配数据调用自己的receivedTurnEventForMatch,允许转弯继续。

    我还没有完成所有方案,但看起来这样可行。

答案 2 :(得分:2)

我们在iOS 8.3下遇到了同样的问题,并且已在昨天发布的iOS 8.4中得到修复。

更新1

在我们的案例中,@ appsunited的解决方法确实解决了它的iOS 8.3,并且不再需要iOS 8.4。

我们测试了沙箱和我们当前的应用商店版本。并且使用带有iOS 7.1.2的iPad 3和另一款带有iOS 8.3和昨天8.4的iPad 3进行游戏。