使用 C# 到 JavaScript 的 UWP WebView 中 JSON 的问题无法正确读取
Posted
技术标签:
【中文标题】使用 C# 到 JavaScript 的 UWP WebView 中 JSON 的问题无法正确读取【英文标题】:Issue with JSON in UWP WebView using C# to JavaScript not being read properly 【发布时间】:2021-01-27 08:08:28 【问题描述】:这相当令人困惑。我正在通过使用 WebView 托管游戏内容将 html5 游戏转换为 UWP,并希望从 WebView 中的 localStorage 备份并在 localStorage 中为整个应用程序创建副本(即从浏览器存储到包存储)。这当然是一个预期的安全网,以防玩家在硬件上崩溃(因为我显然希望数据备份到玩家的云存储中)但是有些事情不太对劲。具体来说,备份是正确写入的,但是当使用通过 WinRT 组件连接到主机的 javascript 方法将它们从主机应用程序读回 HTML5 部分时,它们不会对 WebView 中的 localStorage 产生影响(反过来看起来好像没有保存数据,所以继续选项被禁用)。
这是我正在做的代码示例:
var i;
for (i = -1; i <= 200; i++)
var data = window.UWPConnect.getSaveFile(i);
var key = 'File'+i;
if (i === -1) key = 'Config';
if (i === 0) key = 'Global';
localStorage.setItem(key, data);
这第一部分读取我的 WinRT 组件以从磁盘加载保存数据。
public void doSave(int key, string data)
/*StorageFolder folder = ApplicationData.Current.LocalFolder;
StorageFile saveWrite = await folder.CreateFileAsync("saveData" + key + ".json", CreationCollisionOption.ReplaceExisting);
try await saveWrite.DeleteAsync(); catch
String[] lines = data ;
await FileIO.WriteLinesAsync(saveWrite, lines);*/
if (key == -1) System.IO.File.WriteAllText(ApplicationData.Current.LocalFolder.Path + "\\config.json", data);
else if (key == 0) System.IO.File.WriteAllText(ApplicationData.Current.LocalFolder.Path + "\\global.json", data);
else
System.IO.File.WriteAllText(ApplicationData.Current.LocalFolder.Path + "\\saveData" + key + ".json", data);
public void doStartup()
StorageFolder folder = ApplicationData.Current.LocalFolder;
for (int i = -1; i <= 200; i++)
try
if (i == -1)
saveData[i] = System.IO.File.ReadAllText(ApplicationData.Current.LocalFolder.Path + "\\config.json");
else if (i == 0)
saveData[i] = System.IO.File.ReadAllText(ApplicationData.Current.LocalFolder.Path + "\\global.json");
else
saveData[i] = System.IO.File.ReadAllText(ApplicationData.Current.LocalFolder.Path + "\\saveData" + i + ".json");
Debug.WriteLine(saveData[i]);
catch
/*Debug.WriteLine(File.Exists(SaveFile));
if (File.Exists(SaveFile))
try saveData[i] = File.ReadAllText(SaveFile);
Debug.WriteLine(saveData[i]);
catch
*/
public string getSaveFile(int savefileId)
string data;
try
data = saveData[savefileId];
if (data == null) data = "";
Debug.WriteLine(data);
catch data = "";
return data;
第二部分处理磁盘的保存和加载(取自 WinRT 组件)。
【问题讨论】:
你能告诉我你使用的是WinJS开发的应用程序吗?如果没有,或许你可以调试一下 window.UWPConnect 对象是否存在,以及在 JavaScript 中调用 getSaveFile 方法是否返回预期值。 我已经检查过该对象确实存在,否则保存文件不会首先写入磁盘。另外,我刚刚有一个相当有趣的观察:当游戏返回主菜单时,读取和更新保存数据的代码被调用并且似乎工作正常。但是退出游戏后就不行了。 解决了部分问题:我在同步之前使用 localStorage.clear() 将其清空(以防有人侵入 Windows 系统上的游戏存储并删除一个文件,以便游戏会相应地运行)。不幸的是,这导致游戏中已经存在的数据被清除,而这些数据似乎并没有按预期被替换或删除。 快速更新。我注意到它至少工作了一半(至少保留了全局变量)但是我希望找到一种方法来确保游戏保存也是如此。 【参考方案1】:我想我明白了。在它加载和保存的数据读取器中,我不得不在 WinRT 端使用一组不同的指令,所以这是新的代码结构:
public void doSave(int key, string data)
if (key == -1) System.IO.File.WriteAllText(ApplicationData.Current.LocalFolder.Path + "\\config.json", data);
else if (key == 0) System.IO.File.WriteAllText(ApplicationData.Current.LocalFolder.Path + "\\global.json", data);
else
System.IO.File.WriteAllText(ApplicationData.Current.LocalFolder.Path + "\\file" + key + ".json", data);
public void doBackup(int key, string data)
System.IO.File.WriteAllText(ApplicationData.Current.LocalFolder.Path + "\\backup" + key + ".json", data);
public void doStartup()
for (int i = 0; i <= 200; i++)
if (i == -1)
if (System.IO.File.Exists(ApplicationData.Current.LocalFolder.Path + "\\config.json"))
saveData[i] = System.IO.File.ReadAllText(ApplicationData.Current.RoamingFolder.Path + "\\config.json");
else if (i == 0)
if (System.IO.File.Exists(ApplicationData.Current.LocalFolder.Path + "\\global.json"))
saveData[i] = System.IO.File.ReadAllText(ApplicationData.Current.LocalFolder.Path + "\\global.json");
else
if (System.IO.File.Exists(ApplicationData.Current.LocalFolder.Path + "\\file" + i + ".json"))
saveData[i] = System.IO.File.ReadAllText(ApplicationData.Current.LocalFolder.Path + "\\file" + i + ".json");
if (System.IO.File.Exists(ApplicationData.Current.LocalFolder.Path + "\\backup" + i + ".json"))
backup[i] = System.IO.File.ReadAllText(ApplicationData.Current.LocalFolder.Path + "\\backup" + i + ".json");
public string getSaveFile(int savefileId)
string data;
try
data = saveData[savefileId];
if (data == null) data = "";
Debug.WriteLine(data);
catch data = "";
return data;
public string getBackup(int savefileId)
string data;
try
data = backup[savefileId];
if (data == null) data = "";
Debug.WriteLine(data);
catch data = "";
return data;
public string getConfig()
string data;
try
data = System.IO.File.ReadAllText(ApplicationData.Current.LocalFolder.Path + "\\config.json");
if (data == null) data = "";
Debug.WriteLine(data);
catch data = "";
return data;
【讨论】:
以上是关于使用 C# 到 JavaScript 的 UWP WebView 中 JSON 的问题无法正确读取的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UWP C# 中使用 BezierSegment 在 Canvas 上渲染 InkStroke
如何在 UWP C# 应用程序中访问 UWP JS API?
从 StackPanel C# UWP 中选择图像(将动作侦听器添加到 UIElement 并将图像添加到 UIElement)