Application refusée

Bonjour,


 


J'ai soumis mon application vendredi dernier et je viens de voir qu'Apple l'a refusé et je ne comprends pas pourquoi..


La première fois, il avait un problème pour se connecter via le login et mdp que je leur avait fournit (il n'avait pas rempli l'url du serveur que je leur avis fournit via la soumission de l'app..donc ils avaient une erreur explicite qui leur disait de remplir l'url du serveur..).


 


Je re-soumet l'application et là  je me retrouve avec ce message :


 



 


De : Apple


  • 2. 1 PERFORMANCE: APP COMPLETENESS


Hello,


Thank you for your resubmission. However we still observed the previously stated issues within your app.



 

Performance - 2.1



Your app still crashed on iPad and iPhone running iOS 10.2.1 connected to an IPv6 network when we attempted to log in.


This occurred when your app was used:


- On Wi-Fi


We have attached detailed crash logs to help troubleshoot this issue.

Next Steps


Please revise your app and test it on a device while connected to an IPv6 network (all apps must support IPv6) to ensure that it runs as expected.

Resources


For information on how to symbolicate and read a crash log, please see Tech Note TN2151 Understanding and Analyzing Application Crash Reports.


For information about supporting IPv6 Networks, please refer to Supporting IPv6 DNS64/NAT64 Networks and About Networking.

Additional Information


If you have difficulty reproducing a reported issue, please try testing the workflow described in Technical Q&A QA1764: How to reproduce bugs reported against App Store submissions.


If you have code-level questions after utilizing the above resources, you may wish to consult with Apple Developer Technical Support. When the DTS engineer follows up with you, please be ready to provide:

- complete details of your rejection issue(s)

- screenshots

- steps to reproduce the issue(s)

symbolicated crash logs - if your issue results in a crash log


Best regards,

App Store Review


 


J'ai donc lu leur logs mais ce n'est pas clair du tout..


J'ai uploader les 2 fichiers ici : https://www.dropbox.com/sh/ddvmoqurmwlcam4/AAA3ldezfWWwo_5jnKEpA-b-a?dl=0


 


Si quelqu'un peut m'aiguiller, ce n'est pas de refus :s


Merci de votre aide ^^


Réponses

  • Es-tu sûr que tu as symbolysé tes crashs ?


  • InsouInsou Membre
    février 2017 modifié #3

    Qu'est ce que ça veut dire ? :s


     


    // Edit :


    Juste pour info, l'application fonctionne parfaitement bien sur mon iPhone de test.


    Elle a été faite sur le même modèle qu'une autre application qui a été validée sur le store, du coup c'est pour ça que je ne comprends pas leur refus :/


  • C'est cette partie là  de leur réponse :

     



    - symbolicated crash logs - if your issue results in a crash log


     


     



    En bref, le crashlog est "anonymisé", et seul celui qui a produit l'application peut la rendre compréhensible en symbolisant le crash log, de manière à  avoir un log identique à  celui que te donnes XCode quand tu as un crash, avec un belle callstack.


  • et concrètement, comment je symbolise le crash log ?


    J'ai essayé quelques trucs mais ça ne fonctionne pas.. j'suis pas sûr de bien m'y prendre :/




  • et concrètement, comment je symbolise le crash log ?


    J'ai essayé quelques trucs mais ça ne fonctionne pas.. j'suis pas sûr de bien m'y prendre :/




     


    As-tu essayé les infos dans leur lien ?

  • Je viens de refaire le truc pour symboliser, je me retrouve avec ça : https://www.dropbox.com/s/e93csvo71l3gkhy/crash%20symboliser.txt?dl=0


     


    Est-ce-qu'il à  l'air bien symboliser pour toi ?


  • Oui.


     


    Tu es passé de 



    ​0   IremosMessenger                0x00000001001390b0 0x1000e4000 + 348336
    1   IremosMessenger                0x000000010013b338 0x1000e4000 + 357176
    2   IremosMessenger                0x00000001001365ac 0x1000e4000 + 337324

    à  



    0   IremosMessenger                0x00000001000710b0 ViewController.Connexion() -> Bool (ViewController.swift:232)
    1   IremosMessenger                0x0000000100073338 specialized ViewController.shouldPerformSegue(withIdentifier : String, sender : Any?) -> Bool (ViewController.swift:141)
    2   IremosMessenger                0x000000010006e5ac @objc ViewController.shouldPerformSegue(withIdentifier : String, sender : Any?) -> Bool (ViewController.swift:0)

    C'est déjà  beaucoup.


     


    Fais-le pour les deux. J'suis pas forcément bon dans ce domaine, mais :


    ViewController.Connexion() -> Bool (ViewController.swift:232) semble être celle qui fait merder.


    Alors, aurais-tu le code de ViewController, notamment la méthode Connexion()?


    Potentiellement, elle a pris un paramètre quelque part qu'elle n'a pas aimé.


  • CéroceCéroce Membre, Modérateur

    Oui, on voit clairement que l'appli a planté dans le processus IremosMessenger, à  la ligne 232 de ViewController, méthode Connexion().


  • Merci, je vais continuer à  fouiller par là ..


     


    Par contre je ne comprends pas comment ils peuvent faire planter ça.. lorsque j'essaie avec le compte de démo que je leur ai fait, tout fonctionne bien..


  • CéroceCéroce Membre, Modérateur

    Fais voir le code.


  • Le code de ? Toute la fonction Connexion() ?


    Ou juste la ligne 232 ?


     


    (J'ai fais un peu de ménage dans le code et j'ai reuploader sur iTunes Connect.. j'attends de voir si le soucis persiste..)


  • LeChatNoirLeChatNoir Membre, Modérateur

    Oui, la fonction Connexion() a priori.


  • InsouInsou Membre
    février 2017 modifié #14

    func Connexion() -> Bool{

    let Paramètres = [
    "Login": textfieldLogin.text!,
    "Password" : textfieldMotDePasse.text!
    ]

    // requete Json Synchrone
    // On ATTENDS le résultat avant de continuer
    // Obligé de faire ça pour traiter les résultats
    let recupJsonSync = Alamofire.request(UrlMessenger+"/api/authentification/login", method: .post, parameters: Paramètres).responseJSON()

    var continueVersLaProchainePage = false

    switch recupJsonSync.result {
    case .success:
    if let value = recupJsonSync.result.value {
    let recupJSON = JSON(value)
    if(recupJSON["Error","Code"] == 0){
    // Connexion OK
    // On redirige vers la page suivante

    // Sauvegarde le login (et l'UrlMessenger aussi) - DEBUT
    // et le Token
    if let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first {
    let pathString = path + "/" + Config.fichierConfigurationDeBase // converti en String
    //print(pathString)

    let Token = String(describing: recupJSON["Token"])

    // On créer le fichier
    let jsonConfiguration = "{\"UrlMessenger\":\"\(UrlMessenger)\",\"Login\":\"\(textfieldLogin.text!)\",\"Token\":\"\(Token)\",\"IdSociete\":\"\(recupJSON["Data","Societe","IdSociete"])\"}"
    // writing
    do {
    try jsonConfiguration.write(toFile: pathString, atomically: false, encoding: String.Encoding.utf8)

    }
    catch {/* error handling here */}

    // stock le nom de la société
    let defaults = UserDefaults.standard
    defaults.set(recupJSON["Data","Societe","NomSociete"].stringValue, forKey: "NomSocieteActuelle")

    }
    // Sauvegarde le login (et l'UrlMessenger aussi) - FIN

    // Recupère le token de notification - DEBUT
    let defaults = UserDefaults.standard
    let TokenNotificationIOs = String(describing: defaults.value(forKey: "TokenNotificationIOs")!) // ligne 232
    //print(TokenNotificationIOs)

    let ConfigUrl = ViewController().retourneConfigJson()
    let urlMessengerTokenNotif = ConfigUrl["UrlMessenger"].stringValue
    let Token = ConfigUrl["Token"].stringValue

    let Paramètres = [
    "Token": Token,
    "Token_iOs" : TokenNotificationIOs
    ]

    // requete Json Synchrone
    // On ATTENDS le résultat avant de continuer
    // Obligé de faire ça pour traiter les résultats
    let recupJsonSync = Alamofire.request(urlMessengerTokenNotif+"/api/authentification/updateTokenIOs", method : .post, parameters: Paramètres).responseJSON()

    switch recupJsonSync.result {
    case .success:
    if let value = recupJsonSync.result.value {
    let recupJSON = JSON(value)
    if(recupJSON["Error","Code"] == 0){
    // rien
    }
    else{
    // PAS OK
    let message : String = recupJSON["Error","Message"].stringValue // recupère le message d'erreur
    // Message d'erreur - DEBUT
    let appearance = SCLAlertView.SCLAppearance(
    showCloseButton: false
    )
    let alert = SCLAlertView(appearance: appearance)
    alert.addButton("OK", action: {
    fonctions().actionAprèsErreur(recupJSON["Error","Code"].stringValue)
    })
    alert.showError(TL_TITRE_ALERTE_ERREUR, subTitle: message)
    // Message d'erreur - FIN
    }
    }
    case .failure(let error):
    let message : String = error.localizedDescription // recupère le message d'erreur
    // Message d'erreur - DEBUT
    let alert = SCLAlertView()
    alert.showError(self.TL_TITRE_ALERTE_ERREUR, subTitle: message, closeButtonTitle: "OK")
    // Message d'erreur - FIN
    break
    }
    // Sauvegarde le token de notification - FIN

    textfieldMotDePasse.text = ""
    continueVersLaProchainePage = true

    }
    else{
    // Pas OK
    let MessageDErreur = recupJSON["Error","Message"].stringValue // recupère le message d'erreur via l'api
    view.endEditing(true) // fait disparaitre le clavier // première méthode
    // Message d'erreur - DEBUT
    let alert = SCLAlertView()
    alert.showError(self.TL_TITRE_ALERTE_ERREUR, subTitle: MessageDErreur, closeButtonTitle: "OK")
    // Message d'erreur - FIN
    continueVersLaProchainePage = false
    }
    }
    case .failure(let error):
    let message : String = error.localizedDescription // recupère le message d'erreur
    // Message d'erreur - DEBUT
    let alert = SCLAlertView()
    alert.showError(self.TL_TITRE_ALERTE_ERREUR, subTitle: message, closeButtonTitle: "OK")
    // Message d'erreur - FIN

    continueVersLaProchainePage = false
    }

    return continueVersLaProchainePage
    }

    Ma fonction renvoi un booléen et elle est utilisée dans shouldPerformSegue()



    // test sur un segue avant de le déclencher
    override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
    if(identifier == "versLoginOk"){ // test avant la connexion

    let configMessenger = retourneConfigJson() // Récupère la configuration en JSON
    UrlMessenger = configMessenger["UrlMessenger"].stringValue // assigne la valeur
    //print("UrlMessenger = "+UrlMessenger)

    if(UrlMessenger != ""){
    // Si les champs sont vides
    if(textfieldLogin.text == "" || textfieldMotDePasse.text == ""){

    // Message d'erreur - DEBUT
    let alert = SCLAlertView()
    alert.showError(self.TL_TITRE_ALERTE_ERREUR, subTitle: NSLocalizedString(TL_TITRE_ALERTE_MESSAGE_LOGINMDPVIDES, comment: "Veuillez entrer un login et un mot de passe"), closeButtonTitle: "OK")
    // Message d'erreur - FIN

    return false
    }
    else{
    // tester la connexion ici
    return Connexion() // renvoi un booleen, test la connexion via l'api
    }
    }
    else{
    // le champs de configuration UrlMessenger est vide
    // Pas d'url de connexion !!

    // Message d'erreur - DEBUT
    let alert = SCLAlertView()
    alert.showError(self.TL_TITRE_ALERTE_ERREUR, subTitle: NSLocalizedString(TL_TITLE_ALERTE_MESSAGE_URLMESSENGERVIDE, comment: "L'Url est manquante !"), closeButtonTitle: "OK")
    // Message d'erreur - FIN
    return false
    }
    }
    else{
    // toute les autres pages
    // on transite
    return true
    }
    }

  • CéroceCéroce Membre, Modérateur

    Quelle est la ligne 232? Parce que c'est un gros pâté à  décortiquer.


  • La ligne 232 est celle la : 



    let TokenNotificationIOs = String(describing: defaults.value(forKey: "TokenNotificationIOs")!)

    J'ai re-soumis l'application hier et dans la nuit, même erreur.


    Toujours la ligne 232.


     


    Voici le message qu'Apple m'a mis dans le centre de résolution des problèmes :


     



     


    De : Apple


    • 2. 1 PERFORMANCE: APP COMPLETENESS


    Performance - 2.1


    Hello,


    Thank you for your resubmission. We noticed that the previous issue has not been resolved. We are unable to proceed with the review of your app until this issue has been addressed. 


    Your app crashed on iPad and iPhone running iOS 10.2.1 connected to an IPv6 network when we:


    - attempted to log in.


    This occurred when your app was used:


    - Offline

    - On Wi-Fi


    We have attached detailed crash logs to help troubleshoot this issue.

    Next Steps


    Please revise your app and test it on a device while connected to an IPv6 network (all apps must support IPv6) to ensure that it runs as expected.

    Resources


    For information on how to symbolicate and read a crash log, please see Tech Note TN2151 Understanding and Analyzing Application Crash Reports.


    For information about supporting IPv6 Networks, please refer to Supporting IPv6 DNS64/NAT64 Networks and About Networking.


    If you have any questions about the information provided, please reply to this message and we will get back to you as soon as we can.


    Best regards,

    App Store Review


     


    ils me parlent aussi d'ipv6 mais j'ai rien qui parle d'ipv4 dans mon code..


    Surtout que cette partie là  (la page de connexion), elle est déjà  utilisée dans une autre appli et elle a été validée sans problème sur le store.


  • ça m'est déjà  arrivé d'avoir une erreur parlant d'IPV6 et ce n'était pas lié.


     


    Cependant, avec cette ligne :



    let TokenNotificationIOs = String(describing: defaults.value(forKey: "TokenNotificationIOs")!)

    Que se passe-til si la valeur est nil? String(nil), ça crash? valueNilAvecUnPointDExclamation!, ça crash ?


  • A mon avis ça doit surement crasher MAIS ce n'est pas le cas.. le token était bien remplis vu qu'il s'est mis à  jour dans ma bdd ^^


    Donc il était pas vide et ça n'a pas généré d'erreur à  cause de ça.. d'où ma surprise quand ils me disent que le soucis vient de cette ligne :/


  • Comment tu sais qu'il s'est mis à  jour dans ta DB ?


     


    Si t'es déterminé à  pousser ton application sur le store, je pense que tu devrais quand même ne pas utiliser "!". ça te coûte rien de regarder si la valeur existe sinon de gérer le cas où elle est inexistante.


  • InsouInsou Membre
    février 2017 modifié #20

     


    Comment tu sais qu'il s'est mis à  jour dans ta DB ?



     


    Pour utiliser notre application, il faut renseigné un serveur distant et il faut avoir un compte.


    J'ai été vérifier que le token avait été mis à  jour dans la bdd et c'est le cas ^^


     



     


     


    Si t'es déterminé à  pousser ton application sur le store, je pense que tu devrais quand même ne pas utiliser "!". ça te coûte rien de regarder si la valeur existe sinon de gérer le cas où elle est inexistante.

     


    En effet, ça mange pas de pain ^^


    Mais j'pense pas que ce soit à  cause de ça que ça bloque non plus nan ?


  • CéroceCéroce Membre, Modérateur

    Pour utiliser notre application, il faut renseigné un serveur distant et il faut avoir un compte.
    J'ai été vérifier que le token avait été mis à  jour dans la bdd et c'est le cas ^^

    ça t'indique juste que ça marche en distant.

    Nous sommes 3 à  penser que TokenNotificationIOs est nil.
    Comment je vois les choses: une ancienne version ou un autre cas a bien fixé la clef TokenNotificationIOs dans les User Defaults. Mais quand on teste avec une installation toute neuve, ce n'est pas le cas.

    Commence par virer l'application sur ton simu, ce qui effacera ses User Defaults et reteste. Je pense que tu vas avoir une surprise.

  •  


    Commence par virer l'application sur ton simu, ce qui effacera ses User Defaults et reteste. Je pense que tu vas avoir une surprise. 


     


     


    C'est c'que j'ai fait.. en fait il y a le cas où la personne refus les notifications.. J'avais pas testé ça..


    Je fais donc un test maintenant si la valeur existe (au lieu du !)


    J'ai renvoyé l'appli pour vérification, on verra bien ^^


     


    Merci en tout cas :)


  • Bon bah l'application à  été validée cette nuit, c'était bien cette ligne qui foutait le bordel..


    Ce qui est étrange c'est qu'elle a été validée dans une autre application.. bref pas grave, c'est réglé ^^


     


    Merci :)


  • Rassuré ?

  • Oui rassuré ^^


     


    Puis ça m'aura au moins appris à  lire les logs de crash qu'Apple renvoi :p


  • C'est en forgeant qu'on se brise les doigts devient forgeron !

Connectez-vous ou Inscrivez-vous pour répondre.