web-dev-qa-db-fra.com

Les requêtes HTTP n'échouent qu'en libérant Android APK

Je ne parviens pas à faire fonctionner mon application sur la version Android APK, le seul scénario qui échoue consiste à générer et à signer l'apk. Toutes les requêtes http ne fonctionnent pas. (Le serveur fonctionne sous SSL)

Tous les scénarios que j'ai déjà essayés: 

  • ionic serve -> Fonctionne bien.
  • ionic cordova run Android --device -> Fonctionne bien.
  • Fonctionne aussi sur les émulateurs.

Fonctionne également très bien pour générer la version iOS:

  • ionic cordova build ios.
  • Sur Xcode, exécutez la construction en ciblant un périphérique réel.
  • Sur Xcode, archivez et téléchargez-le sur Itunesconnect, puis téléchargez-le depuis AppStore une fois accepté par Apple.

Donc, le seul cas où cela ne fonctionne pas, c’est lorsque j’essaie de générer c’est apk via ionic cordova build Android --prod --release et de le signer.

Google Play accepte également le nouveau fichier APK, il n'y a donc aucun problème avec le signe du package.

Comme il fonctionne sur iOS et s'exécute directement sur un périphérique Android, il ne s'agit pas d'un problème de certificat CORS ou HTTPS.

Le code:

extrait de 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');
                    }
                });
            }
        );

méthode 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 est:

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

Méthode 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();
}

L'application reste bloquée lorsque je clique sur le bouton "Connexion" et que la demande est faite. Le serveur n'émet aucune exception. L'écran de chargement s'affiche donc pour toujours.

Je suis à court de solutions et j'espère que vous pourrez m'aider.

Informations ioniques:

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
8
Pedro Papadópolis

J'ai eu exactement le même problème il y a quelque temps. Dans mon cas, le problème était un certificat invalide. Le certificat me paraissait bien dans le navigateur (chrome a même montré le verrou vert), sur iOS et lors des tests sur Android. Mais des utilisateurs d'Android se sont plaints que cela ne fonctionnait pas pour eux.

Après des heures de recherche, il est apparu que les demandes adressées à des sites Web dotés de certificats non valides étaient simplement supprimées, ce qui signifie qu'il n'y a aucune réaction. Aucune erreur, rien. (Si je me souviens bien, le code js venait juste de cesser de s'exécuter sans retourner ni exécuter de callback.) Cela se produit UNIQUEMENT lors de la compilation en mode release.

Une solution de contournement est décrite ici:

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

La meilleure solution consiste à épingler le certificat dans votre application.

12
Andreas Gassmann

Mon problème était une chaîne SSL incomplète, résolvez-la en reconfigurant nginx pour avoir la chaîne complète de certificats SSL comme décrit ici: http://nginx.org/en/docs/http/configuring_https_servers.html

1
Daniel M