J'ai créé une application iOS avec Cordova 3.2 et jquery mobile 1.3. J'utilise jquery ajax pour envoyer des demandes à un service RESTfull pour récupérer/mettre à jour des informations.
J'ai un certain nombre d'appareils de test, divers iPhones, avec différentes versions iOS différentes. Sur un iPhone 4S, exécutant iOS 7, je reçois l'erreur suivante lorsqu'une demande ajax est envoyée:
NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
Cela ne se produit que sur cet appareil, sur un autre iPhone 4S, exécutant également iOS 7, cela fonctionne parfaitement, comme c'est le cas sur tous les autres appareils de test que j'utilise.
J'ai lu que cela indique que le certificat n'est pas valide d'une manière ou d'une autre, cela étant le cas, cela peut-il être ignoré et pourquoi cela affecterait-il un appareil?
Quelqu'un peut-il suggérer pourquoi cela pourrait se produire et ce qui pourrait être différent sur l'appareil qui l'empêcherait de fonctionner uniquement sur l'un de mes appareils. Merci
Si cela fonctionne sur certains appareils et pas sur d'autres, il y a une différence dans les paramètres de validation de certificat pour ces appareils. Voici quelques éléments à considérer:
Si vous accédez à l'URL de votre point de terminaison dans le navigateur de l'appareil malheureux, quelle erreur cela vous donne-t-il? (Remarque: évidemment, votre serveur vous donnera également une erreur parce que vous ne demandez pas avec les bons en-têtes et paramètres. Je parle de Safari lui-même, cependant - il devrait donner un message plus détaillé sur ce qu'il (pense)) mal avec le certificat.)
* Modifié pour corriger quelque chose dont je me suis souvenu: vous n'avez pas la possibilité d'accepter le certificat feuille si vous allez à l'URL dans Safari, vous n'avez que le possibilité d'accepter des certificats intermédiaires si vous essayez de les charger directement.
J'ai eu un problème similaire, mais dans mon cas, sur tous les appareils, cela se produisait et uniquement lors d'un appel ajax avec https.
Si tel est votre cas, l'ajout du code ci-dessous à la fin du fichier appDelegate.m atténuera votre problème.
@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)Host
{
return YES;
}
@end
Mais je doute que si cela fonctionne dans d'autres appareils, la solution que j'ai donnée pourrait ne pas être efficace. Mais essayez-le.
La version Swift de réponse Markivs (tirée de ici ):
extension NSURLRequest {
static func allowsAnyHTTPSCertificateForHost(Host: String) -> Bool {
return true
}
}
Xcode 7.3 Swift 2.2
Pour que cela fonctionne, je devais faire 3 choses:
J'ai eu le même problème lors de l'exécution de l'application dans le simulateur. La raison derrière cela est qu'il n'y a pas de certificat de confiance dans le simulateur.
faites simplement glisser et déposez vos fichiers .cer dans votre fenêtre Simulator en cours d'exécution. Vous verrez Safari clignoter, puis la boîte de dialogue d'importation de votre certificat (ou autorité de certification) ...