Hello!
A. General question on iCloud Save using SDKBoxPlay. I have tried integrating it. Seems to be working fine, but encountered issues:
(1) When calling sdkbox::PluginSdkboxPlay::loadGameData(“AAA”);, the onGameData listener gets triggered more than once with two different data. I am not sure why it’s saving two different data using 1 key. My saving code:
void MainMenuScene::savePlayerDataCloud()
{
rapidjson::Document d;
d.SetObject();
// Create a rapidjson array type with similar syntax to std::vector
rapidjson::Value array(rapidjson::kArrayType);
// Must pass an allocator when the object may need to allocate memory
rapidjson::Document::AllocatorType& allocator = d.GetAllocator();
d.AddMember(rapidjson::StringRef("iHardCurrency"), egpUser->iHardCurrency, allocator);
d.AddMember(rapidjson::StringRef("iSoftCurrency"), egpUser->iSoftCurrency, allocator);
d.AddMember(rapidjson::StringRef("fXPBarProgress"), egpUser->fXPBarProgress, allocator);
StringBuffer strbuf;
Writer<StringBuffer> writer(strbuf);
d.Accept(writer);
//log("JsonData = %s", strbuf.GetString());
sdkbox::PluginSdkboxPlay::saveGameData("AAA", strbuf.GetString());
}
I basically create a JSON, and then call saveGameData(“AAA”, JSON Formatted string); Note: egpUser is just a Player data class. And then I call the savePlayerDataCloud method everytime I needed to save one of the three data (Hard Currency, Soft Currency, and the XP Progress) of the player.
UPDATE: My observation is this happens everytime I reinstall the app. Seems like calling saveGameData on a newly installed app creates a different record in the cloud with same key name… and then when calling it using loadGameData, it returns 2 or more new results depending on how many times u reinstalled the app.
void MainMenuScene::onGameData(const string & sAction, const string & sName, const string & sData, const string & sError)
{
if(sAction == “save”)
{
log(" --------------- Saving Cloud Data ---------------");
log(" Name: %s", sName.c_str());
log(" Data: %s", sData.c_str());
log(" Error: %s", sError.c_str());
}
else if(sAction == “load”)
{
log(" ---------------Loading Cloud Data---------------");
log(" Name: %s", sName.c_str());
log(" Data: %s", sData.c_str());
log(" Error: %s", sError.c_str());
rapidjson::Document e = EGUtils::loadJsonFromString(sData.c_str());
egpUser->iHardCurrency = e["iHardCurrency"].GetInt();
auto lblPlayerGems = (Label *) utils::findChild(this, TAG_PLAYER_GEMS_LABEL);
lblPlayerGems->setString(to_string(egpUser->iHardCurrency));
egpUser->iSoftCurrency = e["iSoftCurrency"].GetInt();
egpUser->fXPBarProgress = e["fXPBarProgress"].GetFloat();
auto lbLoadingBarProgress = (LoadingBar *) utils::findChild(this, TAG_XP_BAR);
lbLoadingBarProgress->setPercent(egpUser->fXPBarProgress);
enableOverlay(false);
}
}
My onGameData code… this one gets triggered multiple times as I’ve said depending on how many times I reinstalled the app.
My expected output:
I play game using my Apple ID with iCloud/Cloud Drive enabled
Save my data to my cloud
Uninstall the app
Install the app
Load the cloud data
Get 1 data only.
(2) I also get this Error when calling saveGameData for the first time…
Error: Error Domain=GKErrorDomain Code=6 “The requested operation could not be completed because local player has not been authenticated.” UserInfo={NSLocalizedDescription=The requested operation could not be completed because local player has not been authenticated.}
But on second call, it works. I was under the impression that the iCloud save is different from the Game Center and doesn’t need any authentication. Am I right? Btw, the iCloud account I am using is not a developer account.
C. Also, do I need to setup up something in the iCloud dashboard so I can see user records? I just followed the integration manual but did not do anything after I created by iCloud containers.
Please help. Thank you.