将 GWT 应用打包为完全脱机运行,而不是通过"marketplace"安装



有几个类似的问题,所以我会尽量弄清楚。

我们有一个现有的、相当大和复杂的GWT网络游戏,我被要求离线工作。从最严格的意义上讲,它必须离线。想象一下,我们被告知要让它在光盘上运行。所以安装是允许的,但我们不能指望用户去Chrome/Firefox商店安装。它需要从光盘上取下。同样,更改浏览器启动标志对于用户来说也是不合理的。

理想情况下,如果他们只是点击一个HTML文件作为起始页,并在他们选择的浏览器中打开,那就太好了。

我们在Firefox中成功地通过添加;

"<add-linker name='xsiframe' />"

到我们的gwt.xml设置。这似乎解决了FF在本地文件访问方面的任何安全问题。

然而,这并不能解决Chrome的问题。主游戏启动,但由于安全问题,各种文件请求被阻止;

XMLHttpRequest cannot load file:///E:/Game%20projects/[Thorn]%20Game/ThornGame/text/messages_en.properties. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.MyApplication-0.js:34053 com_google_gwt_http_client_RequestBuilder_$doSend__Lcom_google_gwt_http_client_RequestBuilder_2Ljava_lang_String_2Lcom_google_gwt_http_client_RequestCallback_2Lcom_google_gwt_http_client_Request_2 MyApplication-0.js:34053 

现在我意识到同源策略问题可能会弹出,因为在开发过程中,我们经常使用chrome中的标志进行本地测试,以双向传递它们。

问题是……当我们不能使用启动标志时,我不知道如何避开它们。

显然,在给定的示例中,GWT仅使用.properties文件来获取一些与语言相关的文本。我可以用这样或那样的方式转储内联。然而,它只是被阻止的众多文件中的一个。整个游戏都是在服务器上运行*.txt游戏脚本,以便非程序员轻松更新。实际上,实际的GWT代码只是一个"引擎",所有XMLHttpRequested文件都提供了实际的"游戏"。

这些文件有各种类型csv,txt,ntlist,jam最后两个是真正的txt文件的自定义扩展名。

所有这些文件都被chromes安全阻止了。据我所知,似乎只有图像可以在本地访问。

编译所有这些文件是不可能的,因为它们的数量不是固定的(即,一个中心.txt文件决定了各种场景.txt文件,而这些文件又决定了各种对象文件和目录…)。将所有这些放在一个捆绑包中对于创建和维护来说将是一场噩梦。


因此,从本质上讲,我需要某种方式来提供GWT项目的离线版本,该版本可以访问其子目录中的大量各种文件,而不会出现安全问题。

到目前为止,我能想到的只有

A)我可以通过html或gwt告诉chrome,它允许像FF一样在chrome中读取这些文件。(我怀疑这是不可能的)。可能是XMLHttpRequest的替代方案?

B)我需要以某种方式将游戏+网络浏览器打包到一个可执行包中,该可执行包有权访问其目录中的文件。(http://www.appcelerator.com/titanium??)。

C)我需要打包并让用户运行一个完整的Web服务器,然后该服务器可以以XMLHttp可访问的方式传递所有这些文件。

D)有点好笑。。。我们不能告诉用户在浏览器启动时添加标志。。。但也许我可以写一个游戏安装程序,只检测他们是否有Chrome或Firefox。然后它在浏览器中打开游戏html,并为其提供正确的标志?如果他们使用该实例浏览其他地方,这将引发安全问题,因此如果可能的话,Id可能需要其他标志来禁用url栏。


我很乐意对我们的代码进行各种更改,以实现这些目标,但如上所述,无法确定编译时需要访问的所有文件。

最后,当然,对于最终用户来说,这一切都必须尽可能简单。理想情况下,只需点击一个html文件,或者安装一些不比标准windows程序更复杂的东西。

感谢您阅读这篇相当长的解释,任何建议和想法都将非常受欢迎。我将特别感谢任何做过这件事的人提供的多种不同的选择或反馈。

========================================

我接受了使用下面嵌入的Chromium的建议

这是有效的,做了我需要的(以及更多)

为了帮助其他可能想要使用它的人,我特别对示例项目进行了两个关键的更改;

  1. 因为CEF需要一个指向web应用程序本地html的绝对路径,所以我编写了一个c++函数来获取.exe的启动目录。这是一个特定于平台的实现,所以如果支持几个操作系统(CEF确实支持),一定要为每个操作系统编写专用代码。

  2. 因为我的网络应用程序将使用本地文件,我通过更改浏览器设置启用了Chrome标志;browser_settings.file_access_from_file_url=STATE_ENABLED;

这两个更改足以让我的应用程序正常工作,但这显然是制作应用程序的最低要求。希望我的发现能帮助其他人。

我建议使用包装器路由。也就是说,提供一个直接打开文件的最小浏览器实现。选项为铬嵌入[1]。如果应用程序的性质绝对要求文件作为非文件URL,那么绑定一个最小的Web服务器,让磁盘上的可执行文件启动服务器,并使用您想要的任何启动参数打开绑定的浏览器。

[1]https://bitbucket.org/chromiumembedded/cef

最新更新