Error 0x87DD0005 when implementing Xbox Live services

942 Views Asked by At

I just got done adding Xbox support code to my project, and have run into at least two issues.

The first involves save data sync which is working just fine, however when the game reads the user's login data on Windows it behaves as if login has not been completed - no gamertag is displayed in the corner, and the login provider throws error 0x87DD0005 regardless of the number of retry attempts.

Execution of the code is just fine on Xbox - only Windows seems to be affected by this. I'm also targeting the creator's showcase initially (or at least until I can get to where I'm ready for another run at ID@Xbox) so achievements and the like aren't a concern right now.

The following is the code I'm using (and in no particular order):

public void doStartup()
{
   getData(-1);
   for (int i = 0; i <= 5; i++)
   {
      getData(i);
   }
   ContentViewport.Source = new Uri("ms-appx-web:///logo.html");
}

public async void getData(int savefileId)
{
   var users = await Windows.System.User.FindAllAsync();

   string c_saveBlobName = "Advent";
   //string c_saveContainerDisplayName = "GameSave";
   string c_saveContainerName = "file" + savefileId;
   if (savefileId == -1) c_saveContainerName = "config";
   if (savefileId == 0) c_saveContainerName = "global";
   GameSaveProvider gameSaveProvider;

   GameSaveProviderGetResult gameSaveTask = await GameSaveProvider.GetForUserAsync(users[0], "00000000-0000-0000-0000-00006d0be05f");
   //Parameters
   //Windows.System.User user
   //string SCID

   if (gameSaveTask.Status == GameSaveErrorStatus.Ok)
   {
      gameSaveProvider = gameSaveTask.Value;
   }
   else
   {
      return;
      //throw new Exception("Game Save Provider Initialization failed");;
   }

   //Now you have a GameSaveProvider
   //Next you need to call CreateContainer to get a GameSaveContainer

   GameSaveContainer gameSaveContainer = gameSaveProvider.CreateContainer(c_saveContainerName);
   //Parameter
   //string name (name of the GameSaveContainer Created)

   //form an array of strings containing the blob names you would like to read.
   string[] blobsToRead = new string[] { c_saveBlobName };

   // GetAsync allocates a new Dictionary to hold the retrieved data. You can also use ReadAsync
   // to provide your own preallocated Dictionary.
   GameSaveBlobGetResult result = await gameSaveContainer.GetAsync(blobsToRead);

   string loadedData = "";

   //Check status to make sure data was read from the container
   if (result.Status == GameSaveErrorStatus.Ok)
   {
      //prepare a buffer to receive blob
      IBuffer loadedBuffer;

      //retrieve the named blob from the GetAsync result, place it in loaded buffer.
      result.Value.TryGetValue(c_saveBlobName, out loadedBuffer);

      if (loadedBuffer == null)
      {

         //throw new Exception(String.Format("Didn't find expected blob \"{0}\" in the loaded data.", c_saveBlobName));

      }
      DataReader reader = DataReader.FromBuffer(loadedBuffer);
      loadedData = reader.ReadString(loadedBuffer.Length);
      if (savefileId == -1)
      {
         try
         {
            System.IO.File.WriteAllText(ApplicationData.Current.TemporaryFolder.Path + "\\config.json", loadedData);
         }
         catch { }
      }
      else if (savefileId == 0)
      {
         try
         {
            System.IO.File.WriteAllText(ApplicationData.Current.TemporaryFolder.Path + "\\global.json", loadedData);
         }
         catch { }
      }
      else
      {
         try
         {
            System.IO.File.WriteAllText(ApplicationData.Current.TemporaryFolder.Path + "\\file" + savefileId + ".json", loadedData);
         }
         catch { }

      }

   }
}
public async void InitializeXboxGamer()
{
   try
   {
      XboxLiveUser user = new XboxLiveUser();
      if (user.IsSignedIn == false)
      {
         SignInResult result = await user.SignInSilentlyAsync(Window.Current.Dispatcher);
         if (result.Status == SignInStatus.UserInteractionRequired)
         {
            result = await user.SignInAsync(Window.Current.Dispatcher);
         }
      }
      System.IO.File.WriteAllText(ApplicationData.Current.TemporaryFolder.Path + "\\curUser.txt", user.Gamertag);
      doStartup();
   }
   catch (Exception ex)
   {
      // TODO: log an error here
   }
}
1

There are 1 best solutions below

0
On BEST ANSWER

I finally managed to figure out why the Xbox was working but Windows was not: it was a platform support issue. In the game's creator's dashboard for Xbox Live there's a settings window that allows the support of the game to be determined. Because I originally had separate builds for Xbox and Windows, only the Xbox support item was checked, so I went ahead and also checked off for Desktop support. After saving the changes, I resubmitted with the new configuration and now it works properly.