【问题标题】:Angular & Ionic, $http not working on signed .apkAngular 和 Ionic,$http 不适用于签名的 .apk
【发布时间】:2017-09-22 14:29:44
【问题描述】:

我有一个运行良好的 ionic v1 应用程序,但几周前当我构建新的已签名 .apk 文件时,所有 $http 请求都停止工作了。

这里是请求示例

$http({
      method: 'GET',
      url: 'https://some-url.com/user/id'
    }).then(function (response) {
        alert(response.data);
      }, function (error) {
      alert('Error ' + JSON.stringify(error));
});

我总是收到错误回调 {data: null, status -1, headers: ...}

有趣的是,当我构建简单的 apk 或仅运行 cordova run android 时,一切正常。只是不能在签名的 apk 中工作。

我已经尝试更新cordova-plugin-whitelist并添加了

<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">

到我的 index.html 文件。还在我的 config.xml 文件中添加了&lt;allow-navigation href="*" /&gt;

有人知道为什么会这样吗?也许android sdk改变了构建签名apk的方式,我需要一些额外的配置。

【问题讨论】:

  • 我也尝试发出 AJAX 请求而不是 $http,结果是一样的
  • android 清单中是否有互联网权限?
  • @LucaNicoletti,是的,有
  • 你的后端收到请求了吗?
  • @georgeawg,这不是 CORS 问题,因为我的后端处理了这个问题。我已经解决了这个问题。问题出在我服务器端的 SSL 证书上。中间证书丢失,所以我添加了它,问题就消失了

标签: android angularjs cordova ionic-framework


【解决方案1】:

您可以通过更改 CordovaWebViewClient.java 文件中的以下代码来忽略证书,您可以在其中找到 java 文件 Cordova 版本 4 或更低版本 平台/android/CordovaLib/src/org/apache/cordova/CordovaWebViewClient.java

或 Cordova 版本 5 或更高版本 平台/android/CordovaLib/src/org/apache/cordova/engine/SystemWebViewClient.java

public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
  final String packageName = this.cordova.getActivity().getPackageName();
  final PackageManager pm = this.cordova.getActivity().getPackageManager();

  ApplicationInfo appInfo;
  try {
    appInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
    if ((appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
      // debug = true
      handler.proceed();
      return;
    } else {
      // debug = false
      // THIS IS WHAT YOU NEED TO CHANGE:
      // 1. COMMENT THIS LINE
      // super.onReceivedSslError(view, handler, error);
      // 2. ADD THESE TWO LINES
      // ---->
      handler.proceed();
      return;
      // <----
    }
  } catch (NameNotFoundException e) {
    // When it doubt, lock it out!
    super.onReceivedSslError(view, handler, error);
  }
}

希望此解决方案对您有用。

【讨论】:

    猜你喜欢
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多