PhoneGap Android 从 3.7.0 到 4.0.2 跨域 XHR 404 的

PhoneGap Android from 3.7.0 to 4.0.2 cross-domain XHR 404's

我有一个 Android 应用程序,在 config.xml 中包含以下内容:

<access origin="*" />

然后,我开始使用 Angular $http 向 API 端点发出请求,如下所示:

$http({
  data: this._createTokenRequest(tenant, username, password),
  method: 'POST',
  headers: { Accept: 'application/json', 'Content-Type': 'application/json' },
  timeout: 10000,
  url: url + '/api/RequestToken'
}).catch(err => {
  alert(err.message || err);
  alert(JSON.stringify(err));
}).then(response => {
  alert(response);
});

3.7.0 中将调用响应处理程序。由于升级到 4.0.2(根据 http://phonegap.com/blog/2015/06/16/phonegap-updated-on-build/ 使用 PhoneGap 构建设置 <preference name="phonegap-version" value="cli-5.1.1" />),调用 catch 时出现 404 Not Found 错误。

这可能是什么原因造成的?我在更新日志中看不到相关条目 (https://github.com/apache/cordova-android/blob/4.0.2/RELEASENOTES.md)。

当您切换到 cli-5.1.1 时,您将切换到 Android 的 4.0.x 版本。正如@laughingpine 在评论中指出的那样,白名单机制已更改。早些时候,您可以使用 <access origin="*" /> 获得对所有域的访问权限。这不再适用。

现在您需要 cordova-plugin-whitelist (https://github.com/apache/cordova-plugin-whitelist)。具体请参考文档。早期通配符的大致等价物是 <allow-navigation href="*" />,这是新机制。

要在 PhoneGap Build(以下简称 PGB)下构建,您需要添加插件。由于该插件在 npm(节点包管理器)下可用,您可以在 cordova-plugin-whitelist 名称 (https://www.npmjs.com/package/cordova-plugin-whitelist) 下找到最新版本。 PGB 可以使用以下符号从 npm 构建插件:

<gap:plugin name="cordova-plugin-whitelist" version="1.0.0" source="npm" />

现在 PGB 将正确构建,您的白名单将像以前一样工作。

对于拥有内置 phonegap 的遗留应用程序但更新其构建过程以使用最新版本的 cordova 的任何其他人,Roel 的回答需要稍作调整。

config.xml

<widget ... />
     <name>Legacy App built in phonegap</name>
     <access origin="*" />
</widget>

科尔多瓦

的新 config.xml
<widget ... />
     <name>Legacy App built in phonegap</name>
     <plugin name="cordova-plugin-whitelist" version="1" />
     <allow-navigation href="*" />
</widget>

如果抛出 XML: unbound prefix 异常,这可能会有所帮助。