将 GWT 应用程序打包为 运行 完全离线未通过 "marketplace" 安装
Packaging a GWT app to run completely offline NOT installed via a "marketplace"
有几个类似的问题,我尽量说清楚。
我们有一个现有的、相当大和复杂的 GWT 网页游戏,我被要求离线工作。从最严格的意义上讲,它必须是离线的。
想象一下,我们被告知要让它在 CD Rom 上工作。
所以安装是允许的,但我们不能指望用户去 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 代码只是一个 "engine",所有 XMLHttpRequested 文件都提供实际的 "game".
这些文件有多种类型; csv、txt、ntlist、jam。
最后两个是真正只是 txt 文件的自定义扩展名。
所有这些文件都被 chrome 的安全措施阻止了。据我所知,似乎只允许在本地访问图像。
编译所有这些文件是不可能的,因为它们的数量不固定(即,一个中央 .txt 文件决定各种场景 .txt 文件,而这些文件又决定各种目标文件和目录...) .
将所有这些放入一个包中将是创建和维护的噩梦。
所以本质上我需要一些方法来提供 GWT 项目的离线版本,该项目可以访问其子目录中的大量各种文件而不会出现安全问题。
目前我能想到的就是;
A) 我可以通过 html 或 gwt 告诉 chrome 允许这些文件像 FF 一样在 Chrome 中读取能够。 (我怀疑这是不可能的)。
也许是 XMLHttpRequest 的替代品?
B) 我需要以某种方式将游戏+网络浏览器打包到一个可执行程序包中,该程序包有权访问其目录中的文件。 (http://www.appcelerator.com/titanium ???)。
C) 我需要打包并让用户 运行 一个完整的网络服务器,然后可以以 XMLHttp 可访问的方式传送所有这些文件。
D) 有点好笑……我们不能告诉用户在浏览器启动时添加标志……但也许我可以写一个游戏安装程序,它只是检测他们是否有 Chrome 或 Firefox。然后它会在他们的浏览器中使用正确的标志打开游戏 html?如果他们使用该实例浏览其他地方,这将打开安全问题,因此如果可能的话,我可能需要其他标志来禁用 url 栏。
我很高兴对我们的代码进行各种更改以实现其中的任何一个 - 但如上所述,无法确定在编译时需要访问的所有文件。
最后,当然,对于最终用户而言,这一切都必须尽可能简单。
理想情况下只需单击 html 文件,或安装一些不比标准 windows 程序复杂的东西。
感谢阅读这篇相当长的解释,欢迎任何指点和想法。我特别感谢任何人的多种不同选择或反馈。
========================================
我接受了下面使用 Chromiumembedded 的建议。
这有效并且满足了我的需要(以及更多)
为了帮助可能想要使用它的其他人,我特别对示例项目做了两个重要的更改;
因为 CEF 需要本地 Web 应用程序的绝对路径 html,我编写了一个 c++ 函数来获取启动 .exe 的目录。这是一个特定于平台的实现,因此如果支持几个 OS(CEF 支持),请确保为每个都编写专用代码。
因为我的 webapp 将使用本地文件,我通过更改浏览器设置为此启用了 Chrome 标志;
browser_settings.file_access_from_file_urls = STATE_ENABLED;
这两项更改足以让我的应用程序运行,但显然这是制作应用程序的最低要求。希望我的发现能对其他人有所帮助。
我建议走包装路线。也就是说,提供可直接打开文件的最小浏览器实现。选项是 Chromium Embedded[1]。如果应用程序的性质绝对需要将文件作为非文件 url 提供,那么捆绑一个最小的网络服务器,让磁盘上的可执行文件启动服务器并使用您想要的任何启动参数打开捆绑的浏览器。
有几个类似的问题,我尽量说清楚。
我们有一个现有的、相当大和复杂的 GWT 网页游戏,我被要求离线工作。从最严格的意义上讲,它必须是离线的。 想象一下,我们被告知要让它在 CD Rom 上工作。 所以安装是允许的,但我们不能指望用户去 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 代码只是一个 "engine",所有 XMLHttpRequested 文件都提供实际的 "game".
这些文件有多种类型; csv、txt、ntlist、jam。 最后两个是真正只是 txt 文件的自定义扩展名。
所有这些文件都被 chrome 的安全措施阻止了。据我所知,似乎只允许在本地访问图像。
编译所有这些文件是不可能的,因为它们的数量不固定(即,一个中央 .txt 文件决定各种场景 .txt 文件,而这些文件又决定各种目标文件和目录...) . 将所有这些放入一个包中将是创建和维护的噩梦。
所以本质上我需要一些方法来提供 GWT 项目的离线版本,该项目可以访问其子目录中的大量各种文件而不会出现安全问题。
目前我能想到的就是;
A) 我可以通过 html 或 gwt 告诉 chrome 允许这些文件像 FF 一样在 Chrome 中读取能够。 (我怀疑这是不可能的)。 也许是 XMLHttpRequest 的替代品?
B) 我需要以某种方式将游戏+网络浏览器打包到一个可执行程序包中,该程序包有权访问其目录中的文件。 (http://www.appcelerator.com/titanium ???)。
C) 我需要打包并让用户 运行 一个完整的网络服务器,然后可以以 XMLHttp 可访问的方式传送所有这些文件。
D) 有点好笑……我们不能告诉用户在浏览器启动时添加标志……但也许我可以写一个游戏安装程序,它只是检测他们是否有 Chrome 或 Firefox。然后它会在他们的浏览器中使用正确的标志打开游戏 html?如果他们使用该实例浏览其他地方,这将打开安全问题,因此如果可能的话,我可能需要其他标志来禁用 url 栏。
我很高兴对我们的代码进行各种更改以实现其中的任何一个 - 但如上所述,无法确定在编译时需要访问的所有文件。
最后,当然,对于最终用户而言,这一切都必须尽可能简单。 理想情况下只需单击 html 文件,或安装一些不比标准 windows 程序复杂的东西。
感谢阅读这篇相当长的解释,欢迎任何指点和想法。我特别感谢任何人的多种不同选择或反馈。
========================================
我接受了下面使用 Chromiumembedded 的建议。
这有效并且满足了我的需要(以及更多)
为了帮助可能想要使用它的其他人,我特别对示例项目做了两个重要的更改;
因为 CEF 需要本地 Web 应用程序的绝对路径 html,我编写了一个 c++ 函数来获取启动 .exe 的目录。这是一个特定于平台的实现,因此如果支持几个 OS(CEF 支持),请确保为每个都编写专用代码。
因为我的 webapp 将使用本地文件,我通过更改浏览器设置为此启用了 Chrome 标志; browser_settings.file_access_from_file_urls = STATE_ENABLED;
这两项更改足以让我的应用程序运行,但显然这是制作应用程序的最低要求。希望我的发现能对其他人有所帮助。
我建议走包装路线。也就是说,提供可直接打开文件的最小浏览器实现。选项是 Chromium Embedded[1]。如果应用程序的性质绝对需要将文件作为非文件 url 提供,那么捆绑一个最小的网络服务器,让磁盘上的可执行文件启动服务器并使用您想要的任何启动参数打开捆绑的浏览器。