我正在尝试将 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 时,他们的 GKGameSessionEventListener
的 didAddPlayer:
被调用,然后如果他们保存...得到相同的冲突错误,但如果他们随后重试保存...它有效!
创建链接的玩家无法保存或更新游戏状态,直到加入的玩家更新了数据。当其他玩家保存时,原始玩家会在 GKGameSessionEventListener
上调用 session:player:didSave:
。
此时原始播放器可以按预期保存。
关于ios - GKGameSession- saveData 在 getShareURLWithCompletionHandler 之后总是失败并出现 malloc 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40300104/