J'ai une application Ionic 2
qui appelle une API Spring Boot
pour envoyer des notifications Push à d'autres périphériques. L'API est configurée avec HTTPS.
La requête API POST
fonctionne sur tout sauf iOS
.
Mon certificat SSL sur le serveur est auto-signé (c'est peut-être ça?).
Travaille sur:
Voici la demande:
public sendNotificationRequest(title: string, action: string, name: string, tokens: any, notifications: boolean) {
// Check if user turned off notifications
if(!notifications) {
return;
}
let headers = new Headers({'Content-Type': 'application/json'});
headers.append('Authorization', 'Basic ' + btoa(this.username_decrypted + ':' + this.password_decrypted));
let body = this.formObj(tokens, title, action, name);
console.log(body);
this.http.post("https://<some-url>",
body, { headers: headers }
).subscribe((response) => {
console.log("HTTPS RESPONSE");
console.log(response);
}, function(error) {
console.log("HTTPS ERROR");
console.log(error);
});
}
Les réponses d'en-tête sont les suivantes:
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
Et le cette erreur est reçue:
{
"_body":
{"isTrusted":true},
"status":0,"ok":false,
"statusText":"",
"headers":{},
"type":3,
"url":null
}
API de démarrage du printemps:
@CrossOrigin
@RequestMapping(value="/notifications", method=RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE, produces=MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<NotificationParent> sendNotifications(@RequestBody NotificationParent objs) {
...
return new ResponseEntity<NotificationParent>(objs, HttpStatus.OK);
}
Je suppose que c'est un problème de sécurité iOS, mais je n'en ai aucune idée.
Je pense que votre hypothèse est correcte - un problème de sécurité iOS. Dans iOS, il existe quelque chose appelé App Transport Security qui interdit, par défaut, les connexions via HTTP et les connexions avec des certificats auto-signés.
Vous devez ajouter
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
au Info.plist
de votre projet pour autoriser votre trafic auto-signé.
Voir cette réponse ainsi que les liens ci-dessous pour plus d'informations.
http://blog.ionic.io/preparing-for-ios-9/
J'ai eu le même problème aussi. Supprimer le WkWebView résout le problème.
ionic cordova plugin remove cordova-plugin-wkwebview-engine
Plus d'informations:
https://forum.ionicframework.com/t/ios10-http-requests-blocked/67663/2?u=profitsventure
Après la suppression de ce plugin, je peux effectuer une requête http via iOS
Pour les périphériques iOS, WebViewEngine par défaut utilise toujours CORS. Pour le désactiver temporairement, ajoutez le <preference name="CordovaWebViewEngine" value="CDVUIWebViewEngine" />
au config.xml
. Toutefois, le déclassement à UIWebViewEngine
a de mauvaises performances. Le résoudre du côté serveur est la bonne solution.
Le serveur HTTP doit être configuré pour avoir la bonne réponse à la demande de contrôle en amont CORS OPTIONS. Le point clé est que les en-têtes de contrôle d'accès ne peuvent pas être «*» et doivent inclure tous les en-têtes personnalisés utilisés dans votre application. Ci-dessous mon réglage qui fonctionne:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: *
Access-Control-Allow-Headers: Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, MyCustomHeader
Pour moi, le correctif consistait à utiliser @ionic-native/http
au lieu de @angular/http
.
Documents HTTP natifs ioniques: https://ionicframework.com/docs/native/http/
Voici ce qui m'a conduit à cette solution de contournement https://blog.ionicframework.com/wkwebview-for-all-a-new-webview-for-ionic/