问题描述
我刚刚在项目中添加了XBox支持代码,并且遇到了至少两个问题。
第一个涉及到保存数据同步,该同步工作正常,但是当游戏在Windows上读取用户的登录数据时,其行为就像未完成登录一样-角落没有显示gamertag,并且登录提供程序抛出错误0x87DD0005,无论重试次数如何。
在XBox上执行代码就可以了-只有Windows似乎受此影响。最初,我(也至少要等到我准备在ID @ XBox再次进行展示之前)以创作者的展示台为目标,因此,成就和类似目标现在不再是问题。
以下是我正在使用的代码(且无特定顺序):
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
}
}
解决方法
我终于设法弄清楚Xbox为何能运行,而Windows无法运行:这是一个平台支持问题。在Xbox Live游戏创建者的仪表板中,有一个设置窗口,可以确定游戏的支持。因为我最初有分别用于Xbox和Windows的版本,所以只检查了Xbox支持项,因此我继续进行并检查了桌面支持。保存更改后,我重新提交了新配置,现在它可以正常工作。