compatibilité et validation sur l'AppStore

denis_13denis_13 Membre
Bonjour,
pour publier une application compatible 2.2.1, Apple recommande de l'avoir compilé préalablement en 3.0 afin de faire sortir les warnings et éliminer les fonctions qui sont marquées obsolètes en 3.0.
Parmi ces fonctions, il y en a qui ne posent pas de problèmes, comme éliminer les setText sur des cellules, mais d'autres sont plus compliquées. Par exemple l'initialisation d'une cellule, j'ai utilisé #ifdef --IPONE_3_0 pour installer les deux codes (3.0 et 2.2.1), mais comme c'est de la compilation conditionnelle, cela ne doit pas beaucoup se voir dans l'exécutable que l'on livre... (donc j'imagine qu'ils sont obligés de le tolérer, puisque l'on doit compiler avec le SDK2.2.1.).
Mais ce qui me gène un peu plus c'est la capture d'image, on peu recourir à  la même stratégie, mais cela pose quelques problèmes, dans le frameworks 3.0, le callback
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo

par

- (void)imagePickerController:(UIImagePickerController *)imgPicker didFinishPickingMediaWithInfo:(NSDictionary *)info

on peu récupérer l'image dans le paramètre "info"
par [info objectForKey:UIImagePickerControllerEditedImage]

qui n'est pas reconnue en 2.2.1, comme précédemment on peu éviter les warnings en utilisant la directive de compilation, mais on ne peut pas vérifier proprement si le média est bien une image car il faut faire appel à  une constante (kUTTypeImage) déclarée dans un frameworks 3.0... Comme c'est une chaine, on peu toujours la remplacer par @public.image, mais il ne faut pas abuser.

Donc du coup, je me demande comment on fait en pratique, dans les deux cas cités, j'aurais tendance à  penser que la directive de compilation ne sert pas à  la validation et que l'on a pas d'autre choix que de garder les deux méthodes obsolètes si l'on veut rester compatible 2.2.1.
Quel est votre expérience et votre avis sur la question?
Merci d'avance
Denis

Réponses

  • AliGatorAliGator Membre, Modérateur
    22:54 modifié #2
    La directive de compilation est la bonne solution, mais il faut l'appliquer à  un scope plus large.
    Car de toute façon avec la version 2.2.1 tu ne peux pas récupérer une vidéo, il faut plutôt faire un truc comme (pseudo code)
    #if 2.2.1<br />&nbsp; traiterImage();<br />#else // 3.0<br />&nbsp; si image alors traiterImage();<br />&nbsp; sinon si video alors traiterVideo();<br />#endif<br /><br />traiterImage() {<br />&nbsp; ...<br />}<br /><br />#if 3.0 // #if pas obligé ici, mais bon la méthode est inutile en 2.2.1 alors...<br />traiterVideo()<br />{<br />&nbsp;  ...<br />}<br />#endif
    
  • denis_13denis_13 Membre
    22:54 modifié #3
    merci de m'avoir lu (et répondu). Je reviens toutefois sur ma question, même en utilisant une directive de compilation, si je compile en 2.2.1, la directive permet de ne pas passer sur le code 3.0, mais comme je dois inclure un frameworks qui n'existe pas en 2.2.1 (MobileCoreServices) où est définit kUTTypeImage pour pouvoir interpréter le type du média, et qui est incompatible avec ce sdk, ca coince au pre-build. Il faudrait pouvoir faire une inclusion de framework conditionnelle, bref cela devient rapidement une usine à  gaz... Maintenant j'attends un iPhone3GS pour voir comment se comporte l'applie compilée en 2.2.1, tournant en 3.X, pour voir si je peux ou non choisir une vidéo (si je ne peux pas cela règle le problème).
  • AliGatorAliGator Membre, Modérateur
    22:54 modifié #4
    Pour l'inclusion conditionnelle de Frameworks, tu peux mettre le flag "-framework MobileCoreServices" dans les Build Settings "Other Linker Flags", plutôt que d'utiliser le drag & drop... Et du coup tu peux, avec le bouton en bas à  gauche de la fenêtre de Build Settings, choisir "Add Build Settings Condition" pour que ce flag ne soit rajouté que pour certains SDK (3.x) et pas d'autres (2.x)

    Ou sinon, dans l'onglet "Général" à  côté de "Build", quand tu vois la liste des frameworks ajoutés à  ton projet, à  droite de chaque framework tu as un petit menu avec "Required" de choisi... Je me demande si tu mets sur "weak" à  la place si ça ne ferait pas un chargement faible et donc uniquement si nécessaire et donc ne sera pas chargé en 2.2.1...?
  • denis_13denis_13 Membre
    22:54 modifié #5
    merci pour le conseil, j'ai un peu expérimenté pour finalement obtenir un résultat en choisissant le frameworks depuis le menu, mais en l'ayant préalablement copié dans un dossier séparé, car si je lui livre le chemin d'accès des librairies 3.0, je ne peux plus compiler en 2.0... (si on l'a mis un peu trop vite il faut penser à  le retirer en éditant la target. Il faut aussi mettre le #import dans un conditionnel, ensuite on peu compiler même en laissant le frameworks comme requis (???). Ca marche, (je ne suis pas sur que cela soit super propre), ce sera le plan en cas de besoin.
    Denis
  • denis_13denis_13 Membre
    22:54 modifié #6
    après quelques tests, je me suis aperçu qu'il était nécessaire de positionner la libraire en "weak". Dans mes premiers essais je n'avais vais pas eu d'erreurs à  l'exécution en la mettant en "required", mais je crois que cela venait d'XCode qui ne se mettait pas correctement à  jour, en reprenant le build en effaçant le cache d'XCode cela semble plus cohérent (en ayant fait un clean à  chaque fois avant). Si je suis en required il cherche la lib à  l'exécution, même s'il ne va pas l'utiliser.
  • AliGatorAliGator Membre, Modérateur
    22:54 modifié #7
    Attention, pense à  tester ces configurations diverses de tes frameworks inclus ou non en mode Release et non pas juste en mode Debug.
    Car en configuration "Debug", le processus de build utilise le zero-link, donc ne fait pas le linkage des différents fichiers objets générés, qui sont chargés à  la volée. Ceci pour gagner en temps de build quand tu es en phase de debug et que tu build assez souvent.
    Alors qu'en configuration "Release" il va jusqu'au bout du linkage et là  s'il ne trouve pas un framework avec lequel tu as linké, il te mettra une erreur (alors qu'en Debug tu ne le verras qu'au runtime et seulement si tu utilises une fonction du framework en question si je ne m'abuse)
  • denis_13denis_13 Membre
    22:54 modifié #8
    oui c'est très juste, en release il n'y a plus rien qui marche ... (que ce soit en required ou en weak),donc je vais revenir à  ma théorie du départ... et mettre les directive de côté et maintenir un projet par version.
    Merci pour tout
    Denis
  • AliGatorAliGator Membre, Modérateur
    septembre 2009 modifié #9
    Mettre "-framework MobileCoreServices" dans "Other Link Flags" en setting conditionnel selon le SDK choisi (comme je te le suggérais plus haut) ne fonctionne pas ?

    J'ai pas testé perso, car j'ai pas de modèle de projet qui colle et pas trop le temps de faire un truc en contexte... mais bon, c'est ce que je ferais en tout cas si j'avais un cas comme ça.
  • denis_13denis_13 Membre
    22:54 modifié #10
    décidément j'ai du mal en ce moment ... ;)  en fait le problème que j'avais rencontré était le même que pour le debug, un chemin en trop "$(DEVELOPER_DIR)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/System/Library/Frameworks"
    rajouté au moment du premier ajout du framework par le menu... je l'ai viré et cela fonctionne (je n'avais pas fait attention que je ne l'avais effacé que pour le mode debug). Par ailleurs je n'avais pas vu ces menus conditionnels qui sont en effet vraiment intéressants.
    Merci
    Denis
Connectez-vous ou Inscrivez-vous pour répondre.