【发布时间】:2013-05-20 17:15:57
【问题描述】:
我有一个我认为是现有网络应用程序的相当标准的设置,并希望获得有关如何最好地调整它以通过 PhoneGap 创建本地版本的建议,以一种我们可以继续开发网络应用程序的方式并以最少的返工更新 phonegap 生成的版本。
我是 PhoneGap 新手。我四处搜索并尝试了 StackOverflow 等的各种建议,但没有运气,至少对于我的设置而言。
该应用是在 GWT 中开发的,包括:
所有应用的共享文件夹中的静态资源
/static/ 带有图像、字体、css。 css 定义了一些字体系列,引用 /fonts 中的字体文件
我们使用绝对值从 html 文件和 JavaScript 代码中引用这些静态资源 路径。
多个子文件夹中的静态资源(由 GWT 模块仅供参考)
例如 /LoginGadget,它将有 GWT 生成的 html、Javascript 以及有时带有 css 和 css-images 的子文件夹。
GWT-RPC
这些基本上是 servlet,其中 GWT 负责序列化等,并且可以通过 XHR 从我们的客户端代码访问
PhoneGap 构建
我已经开始考虑使用 PhoneGap 创建一个打包的应用程序,但遇到了一些我需要建议的问题(Android 示例)。
我创建了 /assets/www 并在其中放置了一个 index.html 文件并开始运行。 我复制了我们的 /static/ 文件夹和 /LoginGadget 文件夹的版本在那个“根”下查看,并使用
super.loadUrl("file:///android_asset/www/index.html");
哪个有效。
在我们所有 GWT 生成的 html 和 Javascript 文件中,我们使用绝对路径(例如“/static/....”)和相对路径(例如来自 LoginGadget Javascript,它可能引用“css/some”)来引用静态资源.css")。
相对路径有效,因为它们位于引用它们的 html/js 所在的文件夹“下”。
问题 1
然而,对绝对路径的引用失败,尽管 PhoneGap 开头说:
DroidGap: url=file:///android_asset/www/index.html baseUrl=file:///android_asset/www/
我希望将 index.html 中对“/static/images/file.png”的引用附加到“baseUrl”以提供 file:///android_asset/www/static/images/file.png 和因此工作,因为那是文件所在的位置。
我必须修改 index.html 以使用“static/image/file.png”才能使其工作。 但是我必须使用不同的配置重新编译我们所有的 GWT 应用程序以修改对资源的所有引用,如果修改为只是“静态/”,则子文件夹中其他文件的引用返回“/static/”将不起作用”。
如何获得对“映射”到 /assets/www 或类似文件的绝对路径引用? (见下文,我已经研究过使用“base”标签......)
问题 2
GWT RPC 向提供 html/js 的服务器发出 XHR 请求。 这很好用,因为该应用程序没有硬编码主机服务器名称,实际上部署在许多不同的应用程序引擎应用程序 ID/域上以进行测试等。
这里的 html/js 文件是从 file:/// “提供”的,因此我需要以某种方式指定服务器。
我尝试使用文档中的“base”标记进行指定,但是我在 html/js 中对未指定“file://”的资源的任何引用似乎都是针对“ base".....因此我不再加载我的本地资源,我基本上有一个从我的服务器提供的网络应用程序。
想要
我想做的是能够从我的 wab 应用程序的战争(/static 和我所有的 /GWT-Module 文件夹)中获取(相当大的)编译和测试的应用程序,并将它们复制到 / assets/www 在我的 PhoneGap 应用程序上,然后添加一些样板或启动代码并按原样运行。
听起来是一个很大的要求,但我想如果我能正确指定两件事:
用作“根”的文件路径,用于未指定 http/https 协议(或其他协议......我已经看到在 DroidGap.java 中处理)的资源请求的绝对路径
用于任何 XHR 请求的服务器(协议、主机名、端口)
然后一切都会洗出来!
我认为这将是一个失败的“标准”设置,并且已经涵盖。也许是这样,我只是错过了一些东西。
评论?建议?
提前感谢您的帮助。
【问题讨论】:
-
注意海关字体。并非所有浏览器都支持它。例如。 WP7 没有。
-
我经常做这种类型的开发。不知道为什么你会使用绝对路径。仅使用相对路径,因为 phonegap 的目的是为多个设备构建。