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
异常,这可能会有所帮助。
我有一个 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
异常,这可能会有所帮助。