游戏中心 - iOS - 沙盒中的重新匹配与完成处理程序的问题



我有以下代码:

   if(tappedItem.match.status == GKTurnBasedMatchStatusEnded){
        [[GameKitHelper sharedGameKitHelper] findMatchWithViewController:self delegate:self debug:false  invite:tappedItem.player];
        return;
        NSLog(@"Participants %@", [tappedItem.match.participants description]);
        [tappedItem.match rematchWithCompletionHandler:^(GKTurnBasedMatch *match, NSError *error)
         {
             if (error) {
                 NSLog(@"%@", error);
             }
             else
             {
                 [[GameKitHelper sharedGameKitHelper] setMatch:tappedItem.match];
                 [[NSNotificationCenter defaultCenter]
                  postNotificationName:ShowGameScreen
                  object:tappedItem.match];
             }
         }];
    }

我有很多人在启用沙盒的情况下通过 TestFlight 对其进行了测试,但由于某种原因,我在尝试重新匹配时出现以下错误:

{GKServerStatusCode=5121, NSLocalizedDescription=请求的操作无法完成,因为播放器无效。NSUnderlyingError=0x17045cdd0 "无法完成操作。状态 = 5121,邀请来自:224002977:不允许225851510,因为他们既不是朋友,也不是最近玩过"}

比赛正确结束,所以不是这样:

[_match
        endMatchInTurnWithMatchData:data
        scores:scores
        achievements:nil
        completionHandler:^(NSError *error) {}];

我认为这是沙盒的一个孤立问题,但除非我可以测试它,否则我不相信它会在发布后工作。

编辑#2:

下面是tappedItem.match对象:

    <GKTurnBasedMatch 0x174250200 -
matchID:0049f124-b8c3-43d8-9964-beaf58af69f8
bundleID:--- REMOVED ---
status:GKTurnBasedMatchStatusEnded
message:''
creationDate:2015-06-24 23:12:31 +0000
currentParticipant:(null)
participants:<GKTurnBasedParticipant 0x174205450 -
playerID:G:225851510
status:Done
matchOutcome:Won
lastTurnDate:2015-06-24 23:12:32 +0000
timeoutDate:(null)>,
<GKTurnBasedParticipant 0x174205460 -
playerID:G:224002977 (local player)
status:Done
matchOutcome:Lost
lastTurnDate:2015-06-24 23:16:56 +0000
timeoutDate:(null)>
matchData.length:295
matchDataMaximumSize:65536
exchanges:(null)>

所以正如你所看到的,比赛在几个小时前才结束。只要他们是朋友,这就可以按预期工作,但我需要先测试重新匹配功能,然后才能将其上线。

编辑#1:

当我使用findMatchForRequest时,我收到相同的错误代码:

GKMatchRequest *request = [[GKMatchRequest alloc] init];
    if(player != NULL)
        request.recipients= [NSMutableArray arrayWithObject:player];
    request.minPlayers = 2;
    request.maxPlayers = 2;

根据错误,"他们既不是朋友,也不是最近玩过",但他们最近玩过。

我在这里抓住了稻草,但你的编辑看起来类似于我在 GKTurnBasedMatchTurn GameCenter 结束时试图构建 nextParticipant 数组的问题:endTurnWithNextParticipant 不前进。它没有给我一个连贯的错误,它只是不断地将回合发回给同一个玩家。根源似乎是:当您将指针传递给它之前发送给您的不可变对象时,Game Center 不喜欢它。

我必须改变

NSMutableArray *nextPlayers = (NSMutableArray *)theMatch.participants;
..some sorting logic deleted for brevity...
[theMatch endTurnWithNextParticipants:nextPlayers
                          turnTimeout:GKTurnTimeoutDefault
                            matchData:updatedMatchData
                    completionHandler:^(NSError *error)
{

自:

NSMutableArray *nextParticipants = [NSMutableArray new];
for (GKTurnBasedParticipant *participant in theMatch.participants)
{
    ...some sorting logic deleted for brevity...
    [nextParticipants addObject:participant];
}
[theMatch endTurnWithNextParticipants:nextParticipants
                          turnTimeout:GKTurnTimeoutDefault
                            matchData:updatedMatchData
                    completionHandler:^(NSError *error)
{

您的代码块没有显示您从哪里获取播放器,因此我不清楚这些是新对象还是重用对象。我想知道这段代码是否

if(tappedItem.match.status == GKTurnBasedMatchStatusEnded){
    [[GameKitHelper sharedGameKitHelper] findMatchWithViewController:self delegate:self debug:false  invite:tappedItem.player];

和这个代码

if(player != NULL)
    request.recipients= [NSMutableArray arrayWithObject:player];

是问题所在。如果您尝试创建播放器的副本并将其传递给复赛和 findMatch 调用,会发生什么情况?

最新更新