crash sur device et debug
Bonjour
J'ai compilé mon app pour un iPhone 8 plus, app qui fonctionnait parfaitement sur un 6 plus.
Au lancement l'app crash et si je la relance aussitôt elle fonctionne sans problème.
Quand je compile l'app et la lance depuis Xcode tout fonctionne sans crash...
Avez-vous une idée de la manière dont je peux tracer/debugger la raison de ce crash ?
Merci
PS : app utilisant Core Location, Baromètre, NSURLSession, MapView
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Il n'y aurait pas une tentative de lecture de préférences dans les userDefaults à la première utilisation ? Ou encore une tentative d'utiliser la localisation avant que l'utilisateur ne l'ait autorisé ?
Bon j'ai trouvé ça dans la partie "view device logs", je mets tout de peur d'omettre une ligne importante...
Tiens d'ailleurs il n'y a pas que la mienne d'app qui plante ! ::)
Zut, post too long...
On voit que UIApplication envoie la notification "willEnterForeground". Ensuite, je ne comprends pas bien pourquoi un UIResponder n'arrive pas à comprendre un appel de méthode.
Tu m'étonnes !
Merci je vais jeter un coup d'oe“il sur willEnterForeground mais j'ai l'impression que je ne suis pas le cul sorti des ronces...!
Oui, tu construis ton interface dynamiquement ?
C'est là que les bactéries attaquent :
Tu utilises le NSNotificationCenter ? Je me demande si ce n'est pas lié à un observer qui n'existe plus. Mais c'est vraiment étrange que cela se produise au premier lancement uniquement.
Non storyboard...
Merci je vais regarder !
Oui NSNotificationCenter, je vais regarder aussi...
Pour info, pas un seul plantage aujourd'hui, pas simple !
::)
Bon alors le coupable c'est ça :
Quand je commente cette ligne plus de plantage aléatoire mais le souci c'est que du coup l'application n'est pas mise à jour quand elle est relancée...
>:(
au début de :
Et à quel moment tu enlèves cet observer?
Où suis-je censé enlever l'observer ?
(Et comment si tu as le nom de la fonction...)
Merci
Merci
A quel endroit dois-je utiliser cette fonction ?
applicationWillEnterForeground est définit dans la classe ou tu utilises cette ligne ? (avec @objc en swift 4 apparemment)
oui et applicationWillEnterForeground est bien appelée
Le "deinit" de la classe semble l'endroit le plus judicieux j'imagine
Là où cela parait judicieux.
En général, dans la méthode " inverse ". Par exemple, un viewDidAppear() pour le addObserver: et viewDidDisappear() pour le removeObserver: semble cohérent.
Il faut juste faire en sorte que pour chaque addObserver, il y ait un removeObserver. Donc, par exemple, éviter de mettre ça dans une méthode qui serait appelée 50 fois pour un addObserver, mais il n'y aurait qu'un seul appel à un removeObserver.
bon j'abuse...
où est donc le "deinit" d'une classe ViewController ?
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Deinitialization.html
Je suis désolé mais je n'avance guère...
Mes appels addObserver sont dans la fonction viewDidLoad du controller principal.
Du coup je ne vois pas du tout où placer le removeObserver puisque il faut bien continuer à observer...?
euh...
je regarde de ce côté-là aussi !
Perso je ferais plutôt çà dans viewWillAppear et viewWillDisappear...
Eh bien. Le problème n'a rien à voir avec si on a ou on n'a pas appelé removeObserver !!!
Le problème se trouve dans cette ligne :
Là , tu as, au moins, deux fautes.
1. tu a mis self comme cible pour recevoir la notification
2. il n'y a pas de méthode applicationWillEnterForeground(_ dans la classe du contrôleur ou tu as mis le code
3. la méthode applicationWillEnterForeground(_ existe déjà dans l'appDelegate, si tu l'avais implémenté
4. Tu ne peux pas utiliser une méthode d'une classe en dehors de ce qui est la cible.
5. je répète, pourquoi as-tu écrit cette ligne de code, n'importe où, quand la notification est déjà géré dans l'appDelegate ?
Si tu voulais vraiment capter cette notification dans le viewController, tu aurais dû écrire :
Bon je n'ai pas attendu que les filles soient couchées et ça fonctionne !
Merci encore Joanna !
Donc j'en ai bien conscience, mon code est pourri et pourtant ça fonctionne comme ça depuis iOS 9 sur un iPhone 6 plus...
iOS 11 et iPhone 8 plus sont sûrement plus exigeant...
Parce que je suis encore un mauvais programmeur...
Je me souviens avoir tenté des choses avec l'appDelegate sans parvenir à le faire, donc j'avais cherché autre chose.