NSErrorClientCertificateStateKey depuis autre classe
NSErrorClientCertificateStateKey depuis autre classe - iOS - Programmation
MarshPosté le 02-08-2020 à 17:03:08
Bonjour tout le monde
Je débute en programmation swift après m'être enfin acheté un mac. Je suis donc un bébé dans le domaine
Après avoir suivi plusieurs tuto, je me lance dans un projet factice donc le but est de récupérer des données via un webservice. L'URL en question est sous couvert d'un certificat autosigné, donc quand on s'y connecte depuis swift j'ai le message suivant :
2020-08-02 16:41:00.352081+0200 Meteo3D[40325:3674569] Task <68502971-2F6B-4A13-A89C-EDB632C75B09>.<1> finished with error [-1202] Error Domain=NSURLErrorDomain Code=-1202 "The certificate forthis server is invalid. You might be connecting to a server that is pretending to be “meteo.mondomaine.com” which could put your confidential information at risk." UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x60000357ccf0>, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9807, NSErrorPeerCertificateChainKey=(
"<cert(0x7ff0b880c800) s: synology.com i: Synology Inc. CA>"
"<cert(0x7ff0b880c800) s: synology.com i: Synology Inc. CA>"
)}}, NSLocalizedDescription=The certificate forthis server is invalid. You might be connecting to a server that is pretending to be “meteo.mondomaine.com” which could put your confidential information at risk., NSErrorFailingURLKey=https://meteo.mondomaine.com:1234/request/, NSErrorFailingURLStringKey=https://meteo.mondomaine.com:1234/request/, NSErrorClientCertificateStateKey=0}
Optional(Error Domain=NSURLErrorDomain Code=-1202 "The certificate forthis server is invalid. You might be connecting to a server that is pretending to be “meteo.mondomaine.com” which could put your confidential information at risk." UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x60000357ccf0>, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9807, NSErrorPeerCertificateChainKey=(
"<cert(0x7ff0b880c800) s: synology.com i: Synology Inc. CA>"
"<cert(0x7ff0b880c800) s: synology.com i: Synology Inc. CA>"
)}}, NSLocalizedDescription=The certificate forthis server is invalid. You might be connecting to a server that is pretending to be “meteo.mondomaine.com” which could put your confidential information at risk., NSErrorFailingURLKey=https://meteo.mondomaine.com:1234/request/, NSErrorFailingURLStringKey=https://meteo.mondomaine.com:1234/request/, NSErrorClientCertificateStateKey=0})
server error
Après pas mal de recherches, j'ai pu contourner le problème en ajoutant le code suivant à mon fichier Info.plist :
Code :
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
J'ai ensuite créé la classe suivante pour pouvoir lancer des requêtes facilement dans mon projet, en contournant au passage le problème de certificat (partie "extension" ) :
Tout pourrait s'arrêter ici et je n'aurai pas eu à poster sur le forum Mais voilà, j'aime me prendre la tête et j'ai créé une classe pour pouvoir gérer une CollectionView que j'ai ajouté sur mon storyboard :
Code :
import UIKit
class TemperatureController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, URLSessionDelegate {
@IBOutlet weak var temperaturesCollection: TemperatureController!
let identifier = "temperatureCell"
var items = [Temperature]()
override func viewDidLoad() {
super .viewDidLoad()
//Récupération des données
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
Et j'ai affecté cette classe au ViewController de mon storyboard afin de ne plus passer par ViewController.swift mais par TemperatureController.swift.
Mon problème le voici : si j'utilise ma commande de récupération de données dans cette nouvelle classe, j'obtiens alors l'erreur de certificat que j'avais à l'origine... Message que je n'obtiens pas quand j'exécute cette même commande dans ViewController.swift.
J'imagine qu'il doit y avoir une histoire de contexte ? Ou bien une subtilité que je ne comprend pas encore...
Quelqu'un a une idée ?
Message édité par matheo265 le 02-08-2020 à 17:04:35
Marsh Posté le 02-08-2020 à 17:03:08
Bonjour tout le monde
Je débute en programmation swift après m'être enfin acheté un mac. Je suis donc un bébé dans le domaine
Après avoir suivi plusieurs tuto, je me lance dans un projet factice donc le but est de récupérer des données via un webservice. L'URL en question est sous couvert d'un certificat autosigné, donc quand on s'y connecte depuis swift j'ai le message suivant :
Après pas mal de recherches, j'ai pu contourner le problème en ajoutant le code suivant à mon fichier Info.plist :
J'ai ensuite créé la classe suivante pour pouvoir lancer des requêtes facilement dans mon projet, en contournant au passage le problème de certificat (partie "extension" ) :
Résultat, depuis mon fichier ViewController.swift, j'ajoute le code suivant et j'obtiens bien mes données :
Tout pourrait s'arrêter ici et je n'aurai pas eu à poster sur le forum Mais voilà, j'aime me prendre la tête et j'ai créé une classe pour pouvoir gérer une CollectionView que j'ai ajouté sur mon storyboard :
Et j'ai affecté cette classe au ViewController de mon storyboard afin de ne plus passer par ViewController.swift mais par TemperatureController.swift.
Mon problème le voici : si j'utilise ma commande de récupération de données dans cette nouvelle classe, j'obtiens alors l'erreur de certificat que j'avais à l'origine... Message que je n'obtiens pas quand j'exécute cette même commande dans ViewController.swift.
J'imagine qu'il doit y avoir une histoire de contexte ? Ou bien une subtilité que je ne comprend pas encore...
Quelqu'un a une idée ?
Message édité par matheo265 le 02-08-2020 à 17:04:35