question

gkrwls2710@gmail.com avatar image
gkrwls2710@gmail.com asked

PlayFabClientAPI.GetUserData User data is not partially loaded

Hello, you are busy, but I really need help, so I am leaving a question.

During the process of loading user data, it seems that some data is not loading.

This error did not occur in all users, but occurred in some users. I have data in my player data (title) but I think it is not loading and I am looking for a way to fix this error.

During the saving process, an error called DataUpdateRateExceeded occurs. Does this have anything to do with this? Or maybe there's a problem with my loading code and I'd like to find an answer.

Because loading does not specify a separate path, all of the user's title data is loaded and the data is parsed based on the Dictionary Key value.

Below I have attached the load code, load failure log and a picture of "GetUserData OperationCanceled" from the dashboard.

If you have any further clues, please let me know. We desperately need help.

My English is not good so I'm sorry I used Google Translator.

 /*플레이어 모든 데이터 로드 코루틴*/
     private IEnumerator LoadAllData_Coroutine()
     {
         isDataLoad = false;
         var request = new GetUserDataRequest() { PlayFabId = PlayFabManager.instance.playfab_id, Keys = null };
         Dictionary<string, UserDataRecord> data_dict = new Dictionary<string, UserDataRecord>();
    
         //네트워크 연결 확인
         yield return new WaitUntil(() => (Application.internetReachability == NetworkReachability.NotReachable) == false);
    
         PlayFabClientAPI.GetUserData(request,
             result =>
             {
                 if (result.Data == null)
                 {
                     LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData_Coroutine Fail - Not Have Data");
                     Debug.Log("SaveLoadManager - LoadAllData_Coroutine Fail - Not Have Data");
                 }
                 else
                 {
                     data_dict = result.Data;
                     Debug.Log("SaveLoadManager - LoadAllData_Coroutine : Data Load Success");
                 }
                 isDataLoad = true;
             },
             error =>
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData_Coroutine Error - " + error.GenerateErrorReport());
                 Debug.Log("SaveLoadManager - LoadAllData_Coroutine Error - " + error.GenerateErrorReport());
                 isDataLoad = true;
             });
         yield return new WaitUntil(() => isDataLoad == true);
    
         isDataLoad = false;
         LoadReceiptData();
    
         //데이터 로드 확인
         yield return new WaitUntil(() => isDataLoad == true);
    
         if (tutorialData.isTutorialFinish)
         {
    
             //플레이어 데이터 로드
             if (data_dict.ContainsKey(PLAYER_DATA_KEY))
             {
                 PlayerManager.instance.player.playerData = JsonMapper.ToObject<PlayerData>(data_dict[PLAYER_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + PLAYER_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + PLAYER_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + PLAYER_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             //길드 정보 데이터 로드
             if (data_dict.ContainsKey(GUILD_DATA_KEY))
             {
                 PlayerManager.instance.player.guild_info = JsonMapper.ToObject<GuildInfo>(data_dict[GUILD_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + GUILD_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + GUILD_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + GUILD_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             //의뢰 클리어 데이터 로드
             if (data_dict.ContainsKey(QUEST_CLEAR_DATA_KEY))
             {
                 PlayerManager.instance.player.questClear_Data = JsonMapper.ToObject<QuestClearData>(data_dict[QUEST_CLEAR_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + QUEST_CLEAR_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + QUEST_CLEAR_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + QUEST_CLEAR_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             //에피소드 데이터 로드
             if (data_dict.ContainsKey(EVENT_DATA_KEY))
             {
                 PlayerManager.instance.player.event_Data = JsonMapper.ToObject<EventData>(data_dict[EVENT_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + EVENT_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + EVENT_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + EVENT_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             //해금 데이터 로드
             if (data_dict.ContainsKey(UNLOCK_INFO_DATA_KEY))
             {
                 PlayerManager.instance.player.unlock_info = JsonMapper.ToObject<UnlockInfo>(data_dict[UNLOCK_INFO_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + UNLOCK_INFO_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + UNLOCK_INFO_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + UNLOCK_INFO_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             //미션 데이터 로드
             if (data_dict.ContainsKey(MISSION_DATA_KEY))
             {
                 PlayerManager.instance.player.missionData = JsonMapper.ToObject<MissionData>(data_dict[MISSION_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + MISSION_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + MISSION_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + MISSION_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             //가구 인벤토리 데이터 로드
             if (data_dict.ContainsKey(FURNITURE_DATA_KEY))
             {
                 PlayerManager.instance.player.inven.furni_inven.save_data = JsonMapper.ToObject<FurnitureSaveData>(data_dict[FURNITURE_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + FURNITURE_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + FURNITURE_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + FURNITURE_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             //의뢰 데이터 로드
             if (data_dict.ContainsKey(QUEST_DATA_KEY))
             {
                 PlayerManager.instance.player.inven.quest_List = JsonMapper.ToObject<List<Quest>>(data_dict[QUEST_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + QUEST_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + QUEST_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + QUEST_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             //용병 인벤토리 데이터 로드
             if (data_dict.ContainsKey(BRAVE_DATA_KEY))
             {
                 PlayerManager.instance.player.inven.brave_inven.saveDataList = JsonMapper.ToObject<List<CharacterSaveData>>(data_dict[BRAVE_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + BRAVE_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + BRAVE_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + BRAVE_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             //음식 데이터 로드
             if (data_dict.ContainsKey(FOOD_DATA_KEY))
             {
                 PlayerManager.instance.player.inven.food_inven.foodList = JsonMapper.ToObject<List<FoodData>>(data_dict[FOOD_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + FOOD_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + FOOD_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + FOOD_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             //아이템 데이터 로드
             if (data_dict.ContainsKey(ITEM_DATA_KEY))
             {
                 PlayerManager.instance.player.inven.item_List = JsonMapper.ToObject<List<ItemData>>(data_dict[ITEM_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + ITEM_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + ITEM_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + ITEM_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             //선물 데이터 로드
             if (data_dict.ContainsKey(PRESENT_DATA_KEY))
             {
                 PlayerManager.instance.player.inven.present_inven = JsonMapper.ToObject<PresentInventory>(data_dict[PRESENT_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + PRESENT_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + PRESENT_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + PRESENT_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             //무기 데이터 로드
             if (data_dict.ContainsKey(WEAPON_DATA_KEY))
             {
                 PlayerManager.instance.player.inven.gear_inven.weaponSaveDataList = JsonMapper.ToObject<List<WeaponSaveData>>(data_dict[WEAPON_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + WEAPON_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + WEAPON_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + WEAPON_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             //아머 데이터 로드
             if (data_dict.ContainsKey(ARMOR_DATA_KEY))
             {
                 PlayerManager.instance.player.inven.gear_inven.armorSaveDataList = JsonMapper.ToObject<List<ArmorSaveData>>(data_dict[ARMOR_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + ARMOR_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + ARMOR_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + ARMOR_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             //헬멧 데이터 로드
             if (data_dict.ContainsKey(HELMET_DATA_KEY))
             {
                 PlayerManager.instance.player.inven.gear_inven.helmetSaveDataList = JsonMapper.ToObject<List<ArmorSaveData>>(data_dict[HELMET_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + HELMET_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + HELMET_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + HELMET_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             //신발 데이터 로드
             if (data_dict.ContainsKey(SHOES_DATA_KEY))
             {
                 PlayerManager.instance.player.inven.gear_inven.shoesSaveDataList = JsonMapper.ToObject<List<ArmorSaveData>>(data_dict[SHOES_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + SHOES_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + SHOES_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + SHOES_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             if (data_dict.ContainsKey(BYPRODUCT_DATA_KEY))
             {
                 PlayerManager.instance.player.inven.byproduct_List = JsonMapper.ToObject<List<ByproductData>>(data_dict[BYPRODUCT_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + BYPRODUCT_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + BYPRODUCT_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + BYPRODUCT_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             if (data_dict.ContainsKey(HOUSE_FURNITURE_DATA_KEY))
             {
                 PlayerManager.instance.player.inven.house_furni_List = JsonMapper.ToObject<List<HouseFurniData>>(data_dict[HOUSE_FURNITURE_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + HOUSE_FURNITURE_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + HOUSE_FURNITURE_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + HOUSE_FURNITURE_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             if (data_dict.ContainsKey(ACHIVEMENT_COUNT_DATA_KEY))
             {
                 PlayerManager.instance.player.achivmentCountData = JsonMapper.ToObject<AchivementCountData>(data_dict[ACHIVEMENT_COUNT_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + ACHIVEMENT_COUNT_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + ACHIVEMENT_COUNT_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + ACHIVEMENT_COUNT_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             if (data_dict.ContainsKey(ACHIVEMENT_DATA_KEY))
             {
                 PlayerManager.instance.player.achivementData_List = JsonMapper.ToObject<List<AchivementData>>(data_dict[ACHIVEMENT_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + ACHIVEMENT_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + ACHIVEMENT_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + ACHIVEMENT_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             if (data_dict.ContainsKey(TITLE_DATA_KEY))
             {
                 PlayerManager.instance.player.inven.title_List = JsonMapper.ToObject<List<TitleData>>(data_dict[TITLE_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + TITLE_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + TITLE_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + TITLE_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             if (data_dict.ContainsKey(COLLECTION_DATA_KEY))
             {
                 PlayerManager.instance.player.inven.collection_inven = JsonMapper.ToObject<CollectionInventory>(data_dict[COLLECTION_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + COLLECTION_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + COLLECTION_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + COLLECTION_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             if (data_dict.ContainsKey(INVENTORYCOUNTINFO_DATA_KEY))
             {
                 PlayerManager.instance.player.inven.invenCountInfo = JsonMapper.ToObject<InventoryCountInfo>(data_dict[INVENTORYCOUNTINFO_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + INVENTORYCOUNTINFO_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + INVENTORYCOUNTINFO_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + INVENTORYCOUNTINFO_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             if (data_dict.ContainsKey(ADMOB_DATA_KEY))
             {
                 PlayerManager.instance.player.admobData = JsonMapper.ToObject<AdmobData>(data_dict[ADMOB_DATA_KEY].Value);
                 Debug.Log("SaveLoadManager - LoadAllData :" + ADMOB_DATA_KEY + " Data Load Success");
             }
             else
             {
                 LogManager.instance.SaveLogMessage("SaveLoadManager - LoadAllData " + ADMOB_DATA_KEY + " Fail : Not Have Key or Data");
                 Debug.Log("SaveLoadManager - LoadAllData " + ADMOB_DATA_KEY + " Fail : Not Have Key or Data");
             }
    
             //백업 데이터 생성
             if (PlayerManager.instance.player.playerData.nickname != "")
             {
                 if(data_dict.ContainsKey(BACKUP_DATA_KEY))
                 {
                     PlayerBackUpData backUpData = JsonMapper.ToObject<PlayerBackUpData>(data_dict[BACKUP_DATA_KEY].Value);
                     Debug.Log("SaveLoadManager - LoadAllData :" + BACKUP_DATA_KEY + " Data Load Success");
    
                     StartCoroutine("BackUpCheckCoroutine", backUpData);
                     yield return new WaitUntil(() => isBackUpFinish == true);
                 }
                 else
                 {
                     SaveBackUpData();
                     Debug.Log("SaveLoadManager - LoadAllData " + BACKUP_DATA_KEY + " Fail : Not Have Key or Data");
                     Debug.Log("SaveLoadManager - Create BackUp Data");
                     yield return new WaitUntil(() => PlayFabManager.instance.isSaved == true);
                 }
             }
    
             string logmessage = LogManager.instance.LoadLogMessage();
             if(logmessage != "")
             {
                 logmessage = logmessage + "/" + DateTime.Now.ToLocalTime().ToString();
                 Dictionary<string, string> data = new Dictionary<string, string>();
                 data.Add(ERROR_LOG_DATA_KEY, JsonMapper.ToJson(new { ErrorLog = logmessage }));
                 PlayFabManager.instance.UpdateData(data, UserDataPermission.Private);
                 yield return new WaitUntil(() => PlayFabManager.instance.isSaved == true);
                 LogManager.instance.DeleteLogMessage();
             }
         }
    
         isLoading = false;
         yield return null;
     }

6784-playerdata.png

6785-apilog.png

apisunity3d
playerdata.png (37.5 KiB)
apilog.png (15.0 KiB)
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Neils Shi avatar image
Neils Shi answered

The specific error you encounter while updating the player data is the "DataUpdateRateExceeded" error, which generally means that you were attempting to update player data too frequently, and it will cause the user data to fail to be updated. The details of the user data update limits are listed in [Game Manager] -> [Title Settings] ->[Limits]:

Player data value updates per 15 seconds 5 update operations

Player data value updates per 5 minutes 150 update operations

Player data value updates per hour 1,800 update operations

Basically, what you need to do is to find a way to reduce the player data update frequency. And you need to make sure that the player data has been successfully updated before loading it. In addition, we suggest you use the “Keys” fields to specify the data to retrieve instead of retrieving all data. If you retrieve a large amount of data in a single call, then it will cause a timeout, and resulting in the “OperationCanceled” error.

3 comments
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

gkrwls2710@gmail.com avatar image gkrwls2710@gmail.com commented ·

Based on our guess, it doesn't seem to have been a failure to load due to a save failure. This is because the data is loaded with the data at the time of last save rather than starting with the initialized value. You said that it is a good idea to specify the data to search using the "key" field when loading, but it is better to load the user's data without specifying the key field (path = null) and to load the user's data by specifying the "key" field. Is the cost the same as when I load it?

0 Likes 0 ·
Neils Shi avatar image Neils Shi gkrwls2710@gmail.com commented ·

The API GetUserData belongs to Profile Reads, it has a 1KB weight for their meters. And for Profile Reads, this 1 KB calculation applies to the total data returned, regardless of the number of key value pairs. It's when you're writing data that it's counted per KVP. This means that writing 10 keys of 100 bytes each is 10 "ticks" of the profile write meter, since each key value pair write is a minimum of 1 KB, while a read of those 10 keys is 1 "tick", since it's a total of 1 KB. For more details about usages, please refer to Pricing Meters - PlayFab | Microsoft Learn.

0 Likes 0 ·
gkrwls2710@gmail.com avatar image gkrwls2710@gmail.com Neils Shi commented ·
  1. So, if there are a total of 10 keys/values in the user data, does this mean that the same 10 call costs are incurred when setting "path = null" in "GetUserData api" and when loading the key in "path"?

  2. When a situation occurs where there is no value in the data loaded through GetUserData, the following error log is output. Does this error affect your issue? So what is the solution? One of our hypotheses is that data cannot be loaded if Google login is not completed properly. The strange thing here is that if the data cannot be loaded, it should not be saved as well, but it is saved as the default value. (Of course, I checked to see if the data was null or if there was an error when loading data (GetUserData). As a result, there were no problems in that area.)

/Client/GetTitleData: Unhandled error in PlayFabUnityHttp: System.NullReferenceException: Object reference not set to an instance of an object.\n" /Client/GetTitleData: Unable to complete SSL connection" /Client/GetTitleData: Failed to receive data /Client/LoginWithGoogleAccount: HTTP/1.1 409 Conflict /Client/LoginWithGoogleAccount: Google API error code: invalid_grant details: Bad Request

0 Likes 0 ·
Neils Shi avatar image
Neils Shi answered

So, if there are a total of 10 keys/values in the user data, does this mean that the same 10 call costs are incurred when setting "path = null" in "GetUserData api" and when loading the key in "path"?

If there are a total of 10 keys/values in the user data, and you want to call the API GetUserData 10 times separately to retrieve 10 key-value pairs, since the Profile Reads API has a 1KB weight for their meters, in general, this will cost more than retrieving the 10 key-values in a single API request. In addition, the API GetUserData allows you to specify multiple keys in one request, you don't have to retrieve only one key-value pair per request.

When a situation occurs where there is no value in the data loaded through GetUserData, the following error log is output. Does this error affect your issue? So what is the solution? One of our hypotheses is that data cannot be loaded if Google login is not completed properly. The strange thing here is that if the data cannot be loaded, it should not be saved as well, but it is saved as the default value.

About the “SSL connection” error, it is usually caused by internet connection related issues. If this is an occasional issue, you can implement a retry mechanism (if it fails, you can try again a certain number of times). And the “HTTP/1.1 409 Conflict” error occurs when multiple calls attempt to modify a certain data in a short period of time, you may check your code to see if players call the login API multiple times in a short period of time. And the issue should not be related to player login. Because only after the player has successfully logged in and obtained the session ticket, then they can call the Client APIs to update/retrieve user data. In addition, could you provide the specific error stack only when the issue occurred?

2 comments
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

gkrwls2710@gmail.com avatar image gkrwls2710@gmail.com commented ·

/Client/UpdateUserData: Cannot connect to destination host Thank you so much for your reply!

Can you tell me what these error logs mean?

0 Likes 0 ·
Neils Shi avatar image Neils Shi gkrwls2710@gmail.com commented ·

The error “Cannot connect to destination host” is a common network error that returned by Unity. And excepting for the service issue, it may be related to the IPS, and the Firewall, etc. You can suggest the user try to configure the firewall or use another network to see if it works.

0 Likes 0 ·

Write an Answer

Hint: Notify or tag a user in this post by typing @username.

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.