AirSensor

Bonjour !!


Elle est validée par Apple, il a même déjà  une mise à  jour (validée hier; 3 jours seulement après son upload). Mais le forum ne m'autorise pas à  publier dans la section des apps terminées et validées, je ne sais pas pourquoi.


 


Donc voilà  :


https://itunes.apple.com/fr/app/id949621529


 


Air Sensor est ma toute première Appli. Elle est gratuite, destinée aux pilotes de loisir (avion, ULM,..). Elle fournit à  ces pilotes une fonction bien pratique qui n'existe que sur des avions plus gros : la surveillance de l'altitude. J'y ai ajouté la surveillance de cap. L'intérêt : avertir l'utilisateur, lorsqu'il pilote à  la main, s'il fait des écarts de cap ou d'altitude au delà  des marges admissibles (2° en cap, 200 pieds en altitude) par des indications visuelles et sonores.


 


L'appli est "sensée" être multilingue français / anglais mais j'ai tellement eu de difficultés à  mettre ça en place que des bugs sont possibles, ne pas hésiter à  me les remonter le cas échéant.


 


C'est donc une toute petite appli, très peu de fonctionnalités pour l'instant, bien travaillée tout de même au niveau graphique sur conseils d'un ami graphiste. D'autres idées d'applis plus complexes commencent à  bourgeonner...


 


Merci pour vos retours !!!


Réponses

  • Alf1996Alf1996 Membre
    décembre 2014 modifié #2

    Bravo !   :D   :D


    Je crois qu'il faut au moins 10 messages pour pouvoir publier un message dans la section "Applications validées" pour éviter que les gens ne s'inscrivent que pour faire de la pub...


     


    Un peu de patience


     


    PS : sinon, c'est pas un peu juste 2° de précision de cap pour les pilotes privés ? Ce serait peut-être pas mal de pouvoir régler les seuils, via un menu "réglages"...


  • Merci Cathy.


     


    Actuellement le seuil d'alerte de cap est de 5° (enfin ça devrait être ainsi), mais le rendre configurable est une des idées d'évolution. Je vais aussi rentre l'alerte d'altitude progressive, avec un marquage coloré de l'altitude qui dépendra de l'écart (+/- 50ft : jaune, +/-100ft : orange, +/-200ft : rouge).


     


    Ceci dit j'ai un gros soucis à  régler avant tout ça : elle plante au chargement sous iOS 7  :'(


     


    Problème d'image d'accueil apparemment. Je ne veux pas d'image d'accueil mais apparemment sous iOS 7 on n'a pas le choix.


  • Certains utilisateurs sous iOS7 me disent que l'image d'accueil s'affiche puis l'appli plante.


  • DrakenDraken Membre
    décembre 2014 modifié #5
    Quand je clique sur le lien de ton application, ça ne donne rien sur mon iPhone 4 (iOS 7.1). Safari affiche une page vide !

    Par contre, ton lien fonctionne sur mon MacBookPro (Yosemite). Curieux ce truc ..


    à‰dit : je l'ai finalement trouvé sur l'iPhone 4 en passant par la fonction "Recherche" de l'AppStore. Effectivement ça plante systématiquement au démarrage !


    Ma machine : iPhone 4 - 16 Go - iOS 7.1.2
  • Pourquoi ne voulais tu pas d'image d'accueil ? Et avais tu testé sur iOS7 justement (avec le simulateur au moins) ?


  • à‰trange que la validation Apple soit restée muette devant un plantage systématique. Ils ne testent plus que iOS 8 ou quoi ?

  • à‰trange que la validation Apple soit restée muette devant un plantage systématique. Ils ne testent plus que iOS 8 ou quoi ?




    C'est vrai ça ! Tu as dû tomber sur un lutin pressé !!! ;)
  • DrakenDraken Membre
    décembre 2014 modifié #9
    Hypothèse : le problème ne se produit peut-être que sur l'iPhone 4 avec iOS 7, considéré comme obsolète par Apple depuis la sortie de l'iPhone 6 ? D'ailleurs le simulateur d'Xcode 6 ne supporte plus l'iPhone 4, la liste des devices virtuels commençant à  l'iPhone 4S.


    Un volontaire pour tester l'application avec un 4S/5/5C/5S/6 sous iOS 7 ?
  • AliGatorAliGator Membre, Modérateur
    décembre 2014 modifié #10
    J'ai pas testé, mais si l'hypothèse de Draken est bonne (le crash n'est pas dû à  iOS7 mais au modèle d'iPhone) c'est peut-être aussi à  cause du fait que les iPhones où ça crash sont en 32 bits alors que tu as toujours testé avec des iPhones 64 bits.

    Ou que tu as une division par zéro, ce qui passe sur simulateur en i386 (et retourne un nombre dénormalisé) mais crash sur iOS en armv7/armv7s/arm64 (enfin je crois que c'est dans ce sens-là  et pas l'inverse) ? (bon zut en fait si c'est justement l'inverse, donc c'est pas ça sinon ça aurait crashé sur simu mais marché sur device)

    Bref, ça peut être un bug dû à  iOS7 (ce qui est qd mm le plus probable, par exemple utilisation d'une méthode qui n'est apparue que dans le SDK iOS8 et n'existait pas en iOS7), mais ça peut aussi être un problème dû à  autre chose (architecture), faut se méfier des conclusions hâtives.
  • Je suis d'accord avec Draken.. bon ce n'est pas à  nous de nous reposer sur Apple pour tester nos applis, mais je suis étonné qu'elle ait été validée si vite avec en plus ce bug.


     


    Alf, je viens de découvrir que l'on pouvait installer un simulateur iOS 7. Je pense avoir trouvé le problème.. un petit warning que je ne comprenais pas et que j'ai donc laissé trainer en me disant que ce n'était surement pas grave.. problème d'autolayout incompatible iOS 7. Vais essayer de changer ça mais c'est pénible.. car je ne sais pas comment faire tenir les éléments de ma vue sur un écran d'iPhone 4 sans utiliser ces fonction d'autolayout (tailles proportionnelles, etc..)


     


    Pourquoi je ne voulais pas d'image d'accueil ? Et bien c'est juste un choix.. il y a bien des applis sur mon iPhone qui démarrent direct sans passer par un écran d'accueil, et je voulais la même chose.


  • Malheureusement le problème n'est pas là  où je le croyais. Le simulateur plante iOS 7 et.. je n'y comprends pas grand chose. I'm not fluent in stack. 


     


    Si vous y voyez une piste, ça m'intéresse : 


     


    2014-12-22 14:50:37.556 AirSensor[9492:607] -[__NSCFString containsString:]: unrecognized selector sent to instance 0x7a67a570


    2014-12-22 14:50:37.610 AirSensor[9492:607] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString containsString:]: unrecognized selector sent to instance 0x7a67a570'


    *** First throw call stack:


    (


    0   CoreFoundation                      0x00c431e4 __exceptionPreprocess + 180


    1   libobjc.A.dylib                     0x009bf8e5 objc_exception_throw + 44


    2   CoreFoundation                      0x00ce0243 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275


    3   CoreFoundation                      0x00c3350b ___forwarding___ + 1019


    4   CoreFoundation                      0x00c330ee _CF_forwarding_prep_0 + 14


    5   AirSensor                           0x0008619d -[ViewController viewDidLoad] + 229


    6   UIKit                               0x011da33d -[UIViewController loadViewIfRequired] + 696


    7   UIKit                               0x011da5d9 -[UIViewController view] + 35


    8   UIKit                               0x010fa267 -[UIWindow addRootViewControllerViewIfPossible] + 66


    9   UIKit                               0x010fa5ef -[UIWindow _setHidden:forced:] + 312


    10  UIKit                               0x010fa86b -[UIWindow _orderFrontWithoutMakingKey] + 49


    11  UIKit                               0x011053c8 -[UIWindow makeKeyAndVisible] + 65


    12  UIKit                               0x010b5bc0 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 2097


    13  UIKit                               0x010ba667 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 824


    14  UIKit                               0x010cef92 -[UIApplication handleEvent:withNewEvent:] + 3517


    15  UIKit                               0x010cf555 -[UIApplication sendEvent:] + 85


    16  UIKit                               0x010bc250 _UIApplicationHandleEvent + 683


    17  GraphicsServices                    0x033a2f02 _PurpleEventCallback + 776


    18  GraphicsServices                    0x033a2a0d PurpleEventCallback + 46


    19  CoreFoundation                      0x00bbeca5 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53


    20  CoreFoundation                      0x00bbe9db __CFRunLoopDoSource1 + 523


    21  CoreFoundation                      0x00be968c __CFRunLoopRun + 2156


    22  CoreFoundation                      0x00be89d3 CFRunLoopRunSpecific + 467


    23  CoreFoundation                      0x00be87eb CFRunLoopRunInMode + 123


    24  UIKit                               0x010b9d9c -[UIApplication _run] + 840


    25  UIKit                               0x010bbf9b UIApplicationMain + 1225


    26  AirSensor                           0x00088b46 main + 94


    27  libdyld.dylib                       0x02ad46d9 start + 1


    28  ???                                 0x00000007 0x0 + 7


    )


    libc++abi.dylib: terminating with uncaught exception of type NSException


    (lldb)


  • Ca plante dans mon ViewDidLoad sur la ligne suivante : 


    if([language containsString:@fr]) isLanguageFrench = YES;


     


    isLanguageFrench est un booléen que j'utilise plus loin pour adapter les alarmes vocales selon la langue utilisée par l'iPhone. 


  • Bon, vu le code erreur, il semblerait que language ne soit pas un NSString, donc, il est probablement nil.


     


    Par contre, je ne connais pas encore l'utilisation des sons (je n'ai pas lu la doc.), mais je pense que tu dois avoir des fichier sons, et tu dois pouvoir les internationaliser au même titre que les strings, donc pas besoin de booléen isLanguageFrench.


  • Il te suffit de mettre les fichiers soit dans en.lproj, soit dans fr.lproj, et Xcode se débrouille tout seul. Comme tu as dû le faire pour les textes internalisés, je suppose.

  • AliGatorAliGator Membre, Modérateur
    décembre 2014 modifié #16
    Elle sort d'où cette méthode "-[NSString containsString:]" ?!

    Parce que bon, l'erreur dit clairement dès la première ligne du crash qu'il ne connait pas cette méthode, qu'une méthode avec ce nom n'existe pas dans NSString. Donc la raison du crash me parait on ne peut plus clair.

    Et effectivement la méthode n'existe que depuis iOS8, et encore, elle apparaà®t dans les headers de NSString.h (et est bien annotée comme n'était available que depuis 10.10 et 8.0) mais pas dans la documentation...
  • Elle sort d'où cette méthode "-[NSString containsString:]" ?!Parce que bon, l'erreur dit clairement dès la première ligne du crash qu'il ne connait pas cette méthode, qu'une méthode avec ce nom n'existe pas dans NSString. Donc la raison du crash me parait on ne peut plus clair.Et effectivement la méthode n'existe que depuis iOS8, et encore, elle apparaà®t dans les headers de NSString.h (et est bien annotée comme n'était available que depuis 10.10 et 8.0) mais pas dans la documentation...




    C'est vrai c'est la méthode qu'il ne connaà®t pas, j'ai lu la stack trop vite ! Cela dit, je ne suis pas sûre que l'utilisation d'un booléen pour tester la langue soit la bonne façon de faire...
  • Joanna CarterJoanna Carter Membre, Modérateur

    Utilises -rangeOfString


  • AliGatorAliGator Membre, Modérateur
    décembre 2014 modifié #19

    Ca plante dans mon ViewDidLoad sur la ligne suivante : 
    if[/size]([language [/size]containsString[/size]:[/size]@fr[/size]]) [/size]isLanguageFrench[/size] = [/size]YES[/size];[/size]
     
    isLanguageFrench est un booléen que j'utilise plus loin pour adapter les alarmes vocales selon la langue utilisée par l'iPhone.

    Ceci dit c'est quoi ce test bizarre ?!
    • Non seulement c'est bizarre de n'avoir qu'un booléen (quid si demain t'as 5 langues dans tes alarmes vocales ?) plutôt que d'indexer tes alarmes par locale
    • En plus ça me fait peur ce code, pourquoi as-tu besoin de tester cela ? Si tu embarques tes sons qui servent à  tes alarmes locales dans ton application, tu n'as certainement pas besoin de bidouiller des trucs comme cela toi-même. Je t'invite à  aller lire les Programming Guides concernant l'internationalisation et la localisation de ton application et la gestion du multi-langue. En particulier il suffit de mettre tes sons de différentes langues dans les dossiers ".lproj" adéquat (autrement dit, de localiser tes ressources de type fichiers sonores " comme tu le ferais pour n'importe quelle autre ressource) et iOS ira chercher le son dans la bonne langue tout seul.
      A bidouiller les choses toi-même tu risques d'avoir des surprises.
    • Enfin, si vraiment tu veux tester des choses sur la locale, c'est avec NSLocale qu'il faut le faire (genre avec le countryCode) et pas directement sur le localeIdentifier.
    Mais bon encore une fois je le répète, avoir une condition booléenne pour cela plutôt que d'indexer tes sons par langue est une mauvaise idée. Pour l'instant peut être que tu n'auras que "fr.lproj" pour les sons français et "Base.lproj" pour toutes les autres langues " pour lesquelles il n'y a pas de traduction spécifique et donc pour lesquelles tu as fourni des sons par défaut " mais il faut en tous les cas utiliser la localization de ressources prévue par iOS et tous les systèmes et méthodes qui tournent autour.
    D'une part parce qu'il y a tout ce qu'il faut de prévu déjà  pour ça dans l'OS, et qu'il le gère très bien, et parce que la localization ce n'est pas un sujet simple (y'a plein de cas tordus, de régions dans les locales, de réglages possibles, ...) et que tu ne feras jamais mieux que iOS lui-même en essayant de réinventer la roue.
  • Il te suffit de mettre les fichiers soit dans en.lproj, soit dans fr.lproj, et Xcode se débrouille tout seul. Comme tu as dû le faire pour les textes internalisés, je suppose.

     



     

    En particulier il suffit de mettre tes sons de différentes langues dans les dossiers ".lproj" adéquat (autrement dit, de localiser tes ressources de type fichiers sonores " comme tu le ferais pour n'importe quelle autre ressource) et iOS ira chercher le son dans la bonne langue tout seul.A bidouiller les choses toi-même tu risques d'avoir des surprises.[/*][*]Enfin, si vraiment tu veux tester des choses sur la locale, c'est avec NSLocale qu'il faut le faire (genre avec le countryCode) et pas directement sur le localeIdentifier.[/*][/LIST]Mais bon encore une fois je le répète, avoir une condition booléenne pour cela plutôt que d'indexer tes sons par langue est une mauvaise idée. Pour l'instant peut être que tu n'auras que "fr.lproj" pour les sons français et "Base.lproj" pour toutes les autres langues " pour lesquelles il n'y a pas de traduction spécifique et donc pour lesquelles tu as fourni des sons par défaut " mais il faut en tous les cas utiliser la localization de ressources prévue par iOS et tous les systèmes et méthodes qui tournent autour.D'une part parce qu'il y a tout ce qu'il faut de prévu déjà  pour ça dans l'OS, et qu'il le gère très bien, et parce que la localization ce n'est pas un sujet simple (y'a plein de cas tordus, de régions dans les locales, de réglages possibles, ...) et que tu ne feras jamais mieux que iOS lui-même en essayant de réinventer la roue.




    Je crois qu'exeptionnellement je t'ai grillé Ali !!!
  • AliGatorAliGator Membre, Modérateur
    Un point de + Alf, à  ce rythme là  tu mangeras du chat pour les fêtes :D
  • Alf1996Alf1996 Membre
    décembre 2014 modifié #22

    Pour être un peu plus complet dans la réponse de Joanna, si tu veux tester la présence d'une chaine de caractères dans une autre pour un projet <iOS8, tu dois faire ceci (indépendamment du fait que dans ton cas, ce n'est pas la bonne solution) :



    if ([language rangeOfString:@fr].location!=NSNotFound) ...

    Et dans le cas d'une méthode qui ne fonctionne pas sur tous les iOS, on ne teste pas l'iOS lui même, mais  l'existence de la méthode :



    if ([self respondsToSelector:@selector(containsString:)]) ...

  • SimmerSimmer Membre
    décembre 2014 modifié #23

    Hello,


    J'ai été un peu occupé hier, mais que de réponses à  mon retour ! Vais essayer de répondre à  tout. Déjà  merci à  tous, je vois que j'ai encore beaucoup à  apprendre. Pour info de base, bien avant d'être pilote, j'étais développeur de logiciels embarqués dans l'électronique automobile, donc du language C très bas niveau (en terme de couches physiques), un OS temps réel très rudimentaire (OSEK) et donc l'habitude de tout faire soit même... Et pour le développement iOS il m'a fallut me mettre à  la POO, ça a été violent pour mon cerveau ramolli, mais c'est bien, ça stimule !!!


     


    D'où vient containsString ? Et bien je n'ai effectivement rien trouvé dans la doc, mais la méthode est bien implémentée dans NSString.h



    /* containsString: returns YES if the target string is contained within the receiver. Same as calling rangeOfString:options: with no options, thus doing a case-sensitive, non-literal search. localizedCaseInsensitiveContainsString: is the case-insensitive variant. Note that it takes the current locale into effect as well. Locale-independent case-insensitive operation, and other needs can be achieved by calling rangeOfString:options:range:locale: directly.
    */
    - (BOOL)containsString:(NSString *)aString NS_AVAILABLE(10_10, 8_0);

    Donc NS_AVAILABLE(10_10, 8_0) je suppose que ça signifie que la méthode n'est disponible qu'à  partir d'OS X 10.10 et iOS 8.0, ce qui explique effectivement mes soucis. 


     


    NB : Je viens de découvrir comment on insère un bout de code dans les messages du forum, mais je ne vois aucun choix de language C ou dérivés.. vous mettez "Auto Detect" ?

  • Pour mes choix concernant l'internationalisation, voilà  comme dit précédemment, ça a été un peu fait à  l'arrache. Je ne savais pas comment internationaliser les sons.


     


    Mon appli devait n'être qu'en anglais (langue que tous les pilotes sont sensés maitriser... hum...). Bref, donc pour certains qui ont des soucis avec la langue de Shakespeare, j'ai finalement ajouté le français. Et puis ça ne marchait pas comme je le voulais, donc je l'ai retiré. Et puis quand j'ai eu un peu plus de temps à  accorder à  l'internationalisation, je l'ai remis. Beau merdier au final... tu avais raison d'avoir peur AliGator !! 


     


    Donc un booléen me semblait très convenable pour une variable qui ne pouvait prendre que deux états (français, ou pas français). 


     


    Vais essayer de tenir compte de toutes vos remarques, et je reviens vers vous avec de bonnes nouvelles, surement ! Merci encore. 


  • SimmerSimmer Membre
    décembre 2014 modifié #25

    Bon et bien... ça fonctionne nickel, les bons sons dans les bons dossiers, pas mal de lignes de code en moins, c'est propre et ça fonctionne. Y compris sous iOS 7 si j'en crois le simulateur. 


     


    Merci encore à  tous. 


  • Joanna CarterJoanna Carter Membre, Modérateur

    ça y est ! 


  • C'est Noël !
  • Joanna CarterJoanna Carter Membre, Modérateur

    à‰videmment. Du coup... ?


  • J'ai du mal à  vous suivre. Du coup ? Champagne ?


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