【问题标题】:Can't override preference using PhoneGap Build (order in generated config.xml is wrong)无法使用 PhoneGap Build 覆盖首选项(生成的 config.xml 中的顺序错误)
【发布时间】:2026-01-31 08:35:01
【问题描述】:

我正在使用 cordova-plugin-statusbar 来自定义我的应用在 iOS 上的状态栏的外观。具体来说,我想将StatusBarOverlaysWebView 的值更改为false,因此我在config.xml 中包含以下行:

<preference name="StatusBarOverlaysWebView" value="false" />

当我使用本地 XCode 构建进行测试时,这非常有用。但是,当我在 PhoneGap Build 上构建时,此值的默认设置(true)不会被覆盖。

经过一番折腾,我注意到config.xml 中的偏好顺序与PhoneGap 生成的偏好顺序不同。在我的本地构建中,插件plugin.xml 中的以下行包含在覆盖设置的行之前

<feature name="StatusBar"> <param name="ios-package" value="CDVStatusBar" /> <param name="onload" value="true" /> </feature> <preference name="StatusBarOverlaysWebView" value="true" />

然而,在PhoneGap 生成的config.xml 中,这些行出现在文件的最后。我猜测“最后写入获胜”,因此默认值会覆盖我的自定义首选项。

我有什么方法可以影响这个还是只是 PhoneGap Build 的错误?

【问题讨论】:

  • 有什么方法可以使用 Xcode 构建?您可以修改 plist 以隐藏状态栏。
  • 实际上您可以使用config-file tag 覆盖plist 设置。我知道我可以在启动时隐藏状态栏,然后使用 JavaScript 对其进行配置。我可能最终会将此作为一种解决方法,但我想了解为什么以“正确”的方式进行操作是行不通的。

标签: ios cordova phonegap-plugins phonegap-build statusbar


【解决方案1】:

@马修,
好的。感谢您加载您的config.xml。我确实读过它。我不确定您是否需要 NSAppTransportSecurity 的扩展名。暂时把它们拿出来,但要保存它们,以防万一。

这里还有一些东西可以帮助澄清。

插件

白名单

  • 以下博客文章更正了有关白名单、插件和 CSP 的误解和错误信息。雷蒙德承认犯了错误,幸运的是,人们可能不会犯这些错误。我几乎可以肯定你没有。
  • Important information about Cordova 5

此外,请阅读the documentation with the plugin(靠近顶部),而不仅仅是white-list guide

您可能需要添加:

  • &lt;allow-navigation (..)&gt;
  • &lt;allow-intent (..)&gt;

让我知道进展如何。哦,让我看看你最后的config.xml。 TIA

【讨论】:

  • 谢谢。实际上,我的cordova-plugin-statusbar 版本比您引用的页面上列出的版本更新(1.0.1 与 1.0.0)。 plugin.xml 包含以下导致问题的feature 标记和默认preference 标记。我会按照您的建议进行更改,但我仍然不明白这将如何解决问题。由于插件有preference 标签,PhoneGap Build 在我的preference 标签之后放置,我如何防止它们覆盖我想要的设置?
  • 我已经尽可能清楚了。但我会再试一次。你没有为你的编译器设置你的版本。所以你有级联错误。您正在使用已弃用的项目,这会造成混乱。在white-list 的东西上,当您修复其他问题时,white-list 可能会弹出一个问题。这是cascading这个词的定义——名词#2和#4,动词#3——在你的脑海中关于相互覆盖的事情是一条红鲱鱼,从级联错误中放出来.只是修复你的基地。我们会让事情顺利进行。我哪儿也不去。
  • 你说我应该设置我的编译器版本,因为我使用的是不推荐使用的项目。你能帮我把这个拼出来吗?即: 1) 我应该使用哪个版本的编译器? PhoneGap Build 告诉我它正在使用5.2.0,这在我看来就像一个最新版本。 2) 我正在使用哪些已弃用的项目?在您的原始答案中,您说我不应该使用&lt;feature&gt; 标签,但该字符串不会出现在我的config.xml 中的任何地方。 3) 为什么在 PhoneGap Build 上使用默认编译器(即5.2.0)会导致在我的应用程序中使用不推荐使用的项目?再次感谢您的帮助!
  • @MatthewGertner,感谢您的直接提问。我们正在取得很大进展。 ON #1,您使用的版本并不重要。使用版本字段很重要。如果不这样做,下次编译时可能会出现级联错误。这意味着我们重新开始这个过程你很幸运,这是一个简单的修复。使用一个版本确保你的程序在你下次编译时可以工作——尤其是从头开始。
  • ON #2,从您的原始帖子来看,您似乎在说插件中正在使用&lt;feature&gt;。这是一面红旗。首先,您没有理由查看plugin.xml 的内部,除非作者要求您这样做。如果您正在深入研究插件,那么作者犯了一些基本错误。如果我们正在采取的步骤解决了您的问题,那么就没有坏处。如果我们正在采取的步骤解决您的问题,那么还有其他问题 - 但查看plugin.xml 对大多数开发人员来说是一个红鲱鱼。
【解决方案2】:

@马修
你的结论是不正确的。顺序可能会有所不同,但这只是因为您使用的是已弃用的商品。

这是你需要知道的。

  1. 从现在开始 - 从上周开始,您需要从 NPM 获取所有插件。
  2. 您需要删除所有关于 &lt;feature (...)&gt; 的引用 - 见下文。
  3. 您应该开始使用编译器和插件的版本 - 见下文。
  4. 您应该在进行任何更改之前发布您的config.xml,以防出现其他问题。

此修复所需的所有解决方案都集中在一个地方: Top Mistakes by Developers new to Cordova/Phonegap 答案涵盖 CLI 和 SDK 以及 Phonegap Build 的 Cordova/Phonegap。

在 1 上。

从上面的参考你已经打了

11.您现在需要从 NPM 获取插件。

关于采购插件的规则可能相当混乱。最好的办法是阅读下面的博客文章。使用 CLI 的开发者可以从 github 获取源码,再次查看博文。

新新Cordova npm search page

在 2 上。

这是全新的,我没有时间将其添加到常见问题解答中

&lt;feature&gt; 标签已弃用。这意味着它们不再被使用。 你可以read about it here

我引用

除了debug-server 功能之外,&lt;feature&gt; 标记在 PhoneGap Build 上基本上已被弃用,因为 PhoneGap API 已被插件化。权限现在通常由单独的插件管理,应用程序清单和权限可以直接使用config-file element 进行修改。然而,为了向后兼容,它们仍然受支持并映射到 Android 和 Windows Phone 8 上的设备权限:

换句话说,你有一个重复的配置,它什么也没做。拿出来。

在 3 上。

从上面的参考你已经打了

  • #6 没有为你的编译器设置“phonegap 版本”
  • #7 没有为你的插件设置“版本”

#6 & #7

使用 CLI 版本,如果您没有为您的平台或“Phonegap Build”分配版本,如果您没有在 config.xml 中设置 phonegap-version,您将获得最新版本。如果幸运的话,您的程序会按预期运行。如果你不走运,你会得到一系列级联错误。

幸运的是,Holly Schinsky 写了一篇很好的博文来解释这一切:(注意:自从迁移到 NPM 后,Holly 没有时间更新文章,请使用 NPM 名称,而不是她正在使用的名字。)

Cordova/PhoneGap 版本混乱
http://devgirl.org/2014/11/07/cordovaphonegap-version-confusion/

我想就级联错误重新说明那部分。你和很多很多人现在都在那个阶段。部分原因是插件服务器的变化(现在在 NPM 上)和白名单限制让毫无准备的人们争先恐后。这部分非常非常重要。现在设置您的版本,并在未来根据您的时间、预算和条款进行升级,而不是听从 Cordova 团队的心血来潮。

在 4.

请发布您的config.xml。我已经这样做了几十次,当人们不发帖时,我总是付出代价。谢谢。

最后一件事,white-list 要求。我不知道您是否需要使用互联网,但如果您确实阅读了该常见问题解答中的第 10 条。

祝你好运

【讨论】:

  • 谢谢,@JesseMonroy650。你可以在这里看到我的config.xmlgist.github.com/matthewgertner/7ed0fb5f9c6882c7f197。我正在使用最新的cordova-plugin-statusbar,它在plugin.xml 中包含feature 标签,所以我仍然不确定我做错了什么。我会仔细阅读您的常见问题解答,看看我是否能弄清楚。