ios - GKGameSession- saveData 在 getShareURLWithCompletionHandler 之后总是失败并出现 malloc 错误

标签 ios game-center gkgamesession

我正在尝试将 GKGameSession 合并到我的 Game Center 游戏中。我已经尝试了以下代码的几种组合:异步运行命令,将它们链接到完成处理程序中,等等。每次我看到相同的结果时:我可以使用 saveData 就好了 直到 我调用了 getShareURLWithCompletionHandler。之后,任何 saveData 的尝试都会引发错误。

这是展示问题的最简单的代码版本:

CKContainer *defaultContainer = [CKContainer defaultContainer];
[GKGameSession createSessionInContainer:defaultContainer.containerIdentifier
                              withTitle:@"temp title"
                    maxConnectedPlayers:4
                      completionHandler:^(GKGameSession * _Nullable session, NSError * _Nullable error)
{
    if (error)
    {
        [self printError:error];
    }

    [session getShareURLWithCompletionHandler:^(NSURL * _Nullable url, NSError * _Nullable error)
    {
        if (error)
        {
            [self printError:error];
        }
    }];


    NSData *newData = [NSData dataWithBytesNoCopy:@"abcdefghijklmnopqrstuvwxyz" length:26];
    [reSession saveData:newData completionHandler:^(NSData * _Nullable conflictingData, NSError * _Nullable error)
    {
            if (error)
            {
                [self printError:error];
            }
    }];


}];

在大多数情况下,saveData 调用只会崩溃:

malloc: *** error for object 0x32df14: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

但有时它会抛出一个错误:

GKGameSessionErrorDomain:GKGameSessionErrorUnknown

我尝试过保存不同类型的数据。我尝试通过链接完成处理程序中的所有调用来顺序调用。我已经尝试在 creationSession 完成处理程序的内部和外部进行 URL 获取和数据保存。

我这里有什么地方做错了吗?

最佳答案

我看到了同样的结果,但有一个更有用的错误:

The requested operation could not be completed because the session has been updated on the server, causing a conflict.

save 文档说,

It is up to the developer to decide how to handle save conflicts.

虽然在这里,每次重试保存都会失败,永远。是的,这与您所处的状态相同。

然而,当加入游戏的玩家在他们的设备上输入 URL 时,他们的 GKGameSessionEventListenerdidAddPlayer: 被调用,然后如果他们保存...得到相同的冲突错误,但如果他们随后重试保存...它有效!

创建链接的玩家无法保存或更新游戏状态,直到加入的玩家更新了数据。当其他玩家保存时,原始玩家会在 GKGameSessionEventListener 上调用 session:player:didSave:

此时原始播放器可以按预期保存。

关于ios - GKGameSession- saveData 在 getShareURLWithCompletionHandler 之后总是失败并出现 malloc 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40300104/

相关文章:

ios - iOS 10 GameCenter 基于 iMessaged 的​​邀请

ios - 应用程序从挂起状态进入 applicationDidBecomeActive 状态后未发生网络请求

ios - Cloudkit: "ZoneId provided doesn' t 匹配目标区域”

ios - 检测用户何时停止/暂停在 Swift 中输入

ios - 崩溃没有警告xcode

ios - 保存游戏中心数据(GKTurnBasedMatch)的良好做法?

iphone - 如何支持 iOS 4 的游戏中心但仍可在 3 上运行

ios - 如何在比赛中将数据从 GKPlayer 发送到另一个?