使用 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)

UWP Json 到 C# 的转换

在 Windows UWP 应用程序中使用 Python 和 C#

如何将使用 InkCanvas 在画布上完成的工作保存到 UWP C# 中的图像文件?