web-dev-qa-db-ja.com

Android APKのリリース中にのみ、HTTPリクエストが失敗します

Android APKリリースでアプリを動作させるのに苦労しています。APKの生成と署名が失敗する唯一のシナリオです。すべてのhttpリクエストが機能しません。(サーバーはSSL)

私がすでに試したすべてのシナリオ:

  • ionic serve->正常に動作します。
  • ionic cordova run Android --device->正常に動作します。
  • エミュレータでも動作します。

IOSビルドの生成も正常に機能します。

  • ionic cordova build ios
  • Xcodeで、実際のデバイスをターゲットにビルドを実行します。
  • Xcodeでは、アーカイブしてItunesconnectにアップロードし、それがAppleに受け入れられたらAppStoreからダウンロードします。

したがって、機能しない唯一のケースは、ionic cordova build Android --prod --releaseでapkを生成して署名しようとした場合です。

また、Google Playは新しいAPKを受け入れるため、パッケージサインに問題はありません。

IOSで動作し、Androidデバイスで直接実行されるため、CORSまたはHTTPS証明書の問題ではありません。

コード:

login.tsのスニペット:

this.userService.loginUser(this.user).then(
            (data) => {
                let response = data.json();
                loading.dismiss().then(loadData => {
                    if (response.access_token) {
                        this.global.access_token = response.access_token;
                        this.getUserData();
                    }
                });
            }, err => {
                let error = err.json();
                loading.dismiss().then(response => {
                    if (error.message) {
                        this.showToast(error.message, 3000, 'bottom');
                    }
                });
            }
        );

userService.loginUserメソッド:

loginUser(data) {
    let headers = new Headers();
    headers.append('Access-Control-Allow-Origin', '*');
    headers.append('auth-token', '*');

    return this.abs.post('/authenticateMobile',
        {
            login_ds_email: data.email,
            login_ds_password: data.pass
        }, headers);
}

absは次のとおりです。

constructor(http) {
    this.abs = new ApiService(http);
}

ApiService.postメソッド:

public post(api, params, header): any {
    if (!header) {
        header = this.getHeaders();
    }
    let options = new RequestOptions({headers: header});
    let url = this.global.urlGlobal + api;
    return this.http.post(url, params, options).toPromise();
}

「ログイン」ボタンを押してリクエストを送信すると、アプリがスタックします。サーバーによってスローされる例外はないため、ロード画面は永久に表示されます。

このためのソリューションが不足しています。皆さんが私を助けてくれることを願っています。

イオン情報:

global packages:

@ionic/cli-utils : 1.4.0
Cordova CLI      : 6.4.0
Gulp CLI         : CLI version 3.9.1 Local version 3.9.1
Ionic CLI        : 3.4.0

local packages:

@ionic/app-scripts              : 1.3.0
@ionic/cli-plugin-cordova       : 1.4.0
@ionic/cli-plugin-gulp          : 1.0.1
@ionic/cli-plugin-ionic-angular : 1.3.1
Cordova Platforms               : Android 6.0.0 ios 4.3.1
Ionic Framework                 : ionic-angular 3.0.1

System:

Node       : v7.8.0
OS         : macOS Sierra
Xcode      : Xcode 8.3.3 Build version 8E3004b
ios-deploy : 1.9.0
ios-sim    : 5.0.6
npm        : 5.0.3
13

先ほどとまったく同じ問題がありました。私の場合、問題は無効な証明書でした。証明書は、ブラウザー(Chromeでも緑の鍵が表示されている)でも、iOSでも、Androidでのテスト中でも、問題なく見えました。しかし、私はAndroidユーザーにそれが彼らのために働いていなかったと不平を言うようにさせました。

何時間もの調査の結果、無効な証明書を使用したWebサイトへのリクエストは単に通知なしでドロップされることが判明しました。つまり、フィードバックはまったくありません。エラーなし、何もありません。 (私が正しく覚えている場合、jsコードは、コールバックを返さず、または実行せずに実行を停止しました。)これは、リリースモードでビルドする場合にのみ発生します。

回避策は次のとおりです。

http://ivancevich.me/articles/ignoring-invalid-ssl-certificates-on-cordova-Android-ios/

これを処理する最良の方法は、証明書をアプリに固定することです。

15

私の問題は不完全なSSLチェーンでした、ここで説明されているようにSSL証明書のチェーン全体を持つようにnginxを再構成することで解決します: http://nginx.org/en/docs/http/configuring_https_servers.html#chains

3
Daniel M