PhoneGap Build 提供了一个服务(目前在测试期间免费),他们使用您的 HTML+JS+CSS 源代码以及一个 XML 文件来配置构建选项(config.xml),并为所有支持的平台(iOS、Android、Blackberry、Symbian、WebOS)进行服务器端构建,这节省了大量时间,并为我节省了大量用于头痛药的钱。
不幸的是,指向外部网站的链接的工作方式存在不一致的行为:
目前,为了在外部浏览器中打开链接,需要将不同的代码上传到PhoneGap Build。对于 iOS,域必须被列入白名单,对于 Android,域必须取消列出。
您可以通过向访问标记添加属性来使其保持一致,例如includeForAndroid="false",这将不包括Android上的访问标记内容,以便链接将在外部浏览器中打开,就像在iOS上一样。
配置.xml文档;这里有一篇相关的博客文章。
虽然员工提出了修复建议,但尚未在产品中制作和发布:
我们希望在Cordova开源项目中解决这个问题:与此同时,对于PhoneGap Build,我在想这样的事情:
<access origin="*" onlyInBrowser="true" />
这不会包括Android上的标签,但在iOS上会。
在进行此更改并在产品中可用之前,解决方法是制作两个我将上传的 zip 文件:一个用于 Android(不带访问标签),另一个用于 iOS(带访问标签)。不理想,但这是一致的应用行为必须做的事情。
我已经使用 ANT 来自动执行该项目中的许多任务,因此如果 ANT 也可以为我执行配置.xml更新,那将是理想的选择。
作为参考,这是我的 ANT 代码,它将构建两个 zip:
<target name="BUILD-ZIP" depends="verify-using-minified-js,prepare-for-build">
<tstamp>
<format property="build.tstamp" pattern="yyyy-MM-dd__HH-mm-ss" />
</tstamp>
<antcall target="zip-ios">
<param name="tstamp" value="${build.tstamp}" />
</antcall>
<!-- build android second so that we can just remove the access tags -->
<antcall target="zip-android">
<param name="tstamp" value="${build.tstamp}" />
</antcall>
</target>
<target name="zip-ios">
<zip destfile="${dir.pkg.phonegap}${tstamp}-apple.zip">
<zipfileset dir="${dir.pkg.tmp}">
<exclude name="build.xml" />
<exclude name="build.properties" />
<exclude name="settings.xml" />
<exclude name=".project" />
<exclude name="**/*.psd" />
<exclude name="assets/js/app.js" />
<exclude name="assets/js/cordova-1.5.0.js" />
</zipfileset>
</zip>
</target>
<target name="zip-android">
<!-- before building android zip, get rid of the <access> tags -->
<zip destfile="${dir.pkg.phonegap}${tstamp}-android.zip">
<zipfileset dir="${dir.pkg.tmp}">
<exclude name="build.xml" />
<exclude name="build.properties" />
<exclude name="settings.xml" />
<exclude name=".project" />
<exclude name="**/*.psd" />
<exclude name="assets/js/app.js" />
<exclude name="assets/js/cordova-1.5.0.js" />
</zipfileset>
</zip>
</target>
<target name="prepare-for-build">
<!-- increment build number -->
<propertyfile file="build.properties">
<entry key="version.build.number" type="int" operation="+" default="1"/>
</propertyfile>
<property file="build.properties"/>
<echo message="BUILD NUMBER: ${version.build.number}"/>
<delete includeemptydirs="true" verbose="false">
<fileset dir="${dir.pkg.tmp}" includes="**/*"/>
</delete>
<filter token="BUILD_NUMBER" value="${version.build.number}" />
<filter token="VERSION_MAJOR" value="${version.major}" />
<filter token="VERSION_MINOR" value="${version.minor}" />
<copy todir="${dir.pkg.tmp}" verbose="true" overwrite="true" filtering="true">
<fileset dir="${dir.dev}" includes="**/*" />
</copy>
</target>
在zip-android
目标中有一个评论:
<!-- before building android zip, get rid of the <access> tags -->
这就是我想进行替换的地方。我已经尝试使用<filter>
任务以及<replace>
和<replaceRegExp>
,但我似乎找不到一种方法来做到这一点,这一切都归结为我需要替换字符串的事实:<access ... />
并且这些替换方法似乎都不允许在令牌/匹配/等属性中<
或>
。我尝试过使用 CDATA,但也无法正常工作。
我最接近的,因为ANT不会抛出任何错误,是这样的:
<replace file="${dir.pkg.tmp}config.xml" failOnNoReplacements="true">
<replacetoken>
<![CDATA[<access origin="http://example.com" subdomains="true" />]]>
</replacetoken>
</replace>
理论上,这会将指定的 <access ... />
标记替换为空字符串,因为我省略了 value
属性。
不幸的是,由于failOnNoReplacements
属性以及无论出于何种原因,它都没有进行任何替换的事实而失败。
这可能吗?如果是这样,我做错了什么?!
如果在标记和值中对 XML 字符串的元素进行编码,则 Ant 替换任务将起作用...例如:
在配置中.xml
<option name="some.unwanted.configuration" />
在构建中.xml
<replace file="${build.dir}/config.xml"
token="<option name="some.unwanted.configuration" />"
value="<!-- unwanted configuration removed -->"
/>
结果在
<!-- unwanted configuration removed -->
哈,我设法提出了一个绕过尖括号阻塞的解决方案。
在配置中.xml:
<!--access_tag1_here-->
在构建中.xml:
<replace
file="${dir.pkg.tmp}config.xml"
failOnNoReplacements="true"
token="!--access_tag1_here--"
value="access origin='http://example.com' subdomains='true' /"
/>
这会将注释转换为必要的访问标记。
我切换了我的压缩顺序,以便 Android 现在在评论仍然是评论时先行,然后 iOS zip 进程插入访问标签。
在处理xml时,我推荐xmltask。
对于您的需求,请参阅: xml 任务手册替换
一点 Xpath 知识会派上用场,请参阅:
http://zvon.org/xxl/XPathTutorial/
http://www.w3schools.com/xpath/