Text-to-speech marche avec le simulateur mais pas les devices reels

j'utilise xcode v7.0 beta 4 et le programme suivant:


 


import UIKit


import AVFoundation


 


class ViewController: UIViewController {


    override func viewDidLoad() {


        super.viewDidLoad()


        /


    }


    @IBAction func speech() {


        let synth = AVSpeechSynthesizer()


        let myUtterance = AVSpeechUtterance(string: "foo")


        synth.speakUtterance(myUtterance)


 


    }


}


 


Je charge le framework 9.0 AVFoundation.framework.


Je me connecte a un ipad2 qui tourne iOS 8.4.1 donc je mets comme deployment target 8.4. 


Mon appli marche bien avec les simulateurs mais pas avec l'ipad.


Y-a-t-il un probleme de sdk Vs deployment target?


Je ne comprend pas le modele de deployment target: si on precise une version ex: v9, ca ne marche que avec une v9?


 


j'ai les messages d'erreur suivant:


 


2015-09-03 16:53:22.659 tt2[3256:263974] |AXSpeechAssetDownloader|error| ASAssetQuery error fetching results Error Domain=ASError Code=21 "The operation couldn't be completed. (ASError error 21 - Unable to copy asset information)" UserInfo=0x14674450 {NSDescription=Unable to copy asset information}


2015-09-03 16:53:22.667 tt2[3256:263974] Building MacinTalk voice for asset: (null)


 


 J'ai essaye le forum apple, stack overflow, et personne ne me repond. Text-2-speech et voice recognition sont clé pour mon appli que je porte d'android.


Réponses

  • CéroceCéroce Membre, Modérateur

    Deployment: la version du SDK minimum que l'appli exige pour se lancer. Par exemple, si tu veux que l'appli fonctionne sur iOS 7 mais aussi utiliser les nouvelles API, il faudra mettre la deployment version à  7, et le Base SDK à  9.


    Il faudra bien évidemment vérifier que les nouvelles API sont dispos avant de les utiliser.


     


    J'ai déjà  utilisé AVSpeechSynthesizer, dont les API sont des plus simples, alors ça m'étonne que ça ne fonctionne pas.


    Essaie de changer la langue (dans AVSpeechSynthesisVoice), et vérifie également les réglages de langue sur ton iPad.


  • Merci. Je vais faire plus de tests par rapport à  la langue.

    Je ne suis pas très clair sur ton explication par rapport au deployment target.

    Ou définis - tu la version de sdk?

    Je veux couvrir le max de version d'ios 7 à  9, par exemple, sans parler du iPhone.

    Comment dois - je faire pour être générique?
  • AliGatorAliGator Membre, Modérateur
    Le SDK te liste les fonctions, classes, méthodes... disponibles jusqu'à  la version X. Il définit donc finalement jusqu'à  quelles APIs tu vas avoir le droit d'utiliser.
    --> Avec le SDK 8 par exemple tu vas pouvoir appeler toutes les méthodes disponibles pour iOS7 et 8, mais tu ne pourras pas appeler les méthodes qui ont été rajoutées dans iOS9, puisqu'elles ne sont pas encore présentes dans le SDK8.
    --> Ca n'empêchera pas ton application de tourner sous iOS9 et supérieurs quand même, elle pourra continuer de s'exécuter sous iOS9 même si elle a été compilée avec le SDK 8. C'est juste qu'elle ne pourra pas profiter des spécificités et nouveautés que iOS9 apporte en terme d'APIs.

    C'est pour cela que tout nouveau projet Xcode est par défaut configuré pour utiliser comme SDK le "Latest SDK"" ce que tu peux voir dans les Build Settings de ton projet, dans "Base SDK" " et qu'on ne le change en pratique jamais (d'autant que maintenant chaque version de Xcode n'est plus livrée qu'avec le SDK le plus récent correspondant à  ladite version de Xcode, donc en fait on n'a pas trop le choix par défaut). Comme ça tu as accès au dernier SDK donc à  toutes les APIs connues.

    ---


    Le Deployment Target, c'est la version minimum d'iOS que tu cibles. Si tu mets un Deployment Target à  iOS9, les utilisateurs ne pourront lancer ton application que s'ils sont sous iOS9 ou supérieur.

    Par exemple si tout le concept de ton application est basé sur HealthKit (qui est un framework et une fonctionnalité introduite avec iOS8), ça n'a pas de sens que ton application puisse être lancée sous iOS7 puisqu'elle ne fonctionnera pas, Healthkit n'étant pas dispo sous iOS7. Du coup dans ce cas tu vas mettre un Deployment Target à  iOS8, pour limiter ton application à  iOS8 et supérieur.

    ---

    Donc avec un Deployment Target à  7.0 et un SDK à  9.0 tu vas pouvoir :
    - Appeler toutes les méthodes qui ont été introduites dans iOS 7.0 et inférieur, de façon inconditionnelle " puisque si elles ont été rajoutées dans iOS6 ou iOS7 par exemple, normalement elles existent encore sous iOS7, puis iOS8 puis iOS9 (bon sauf certaines méthodes qui peuvent avoir été dépréciées ("deprecated") par exemple sous iOS8 et avoir été supprimées avec iOS9...
    - Appeler les méthodes qui ont été introduites après iOS7, par exemple dans iOS 7.1 ou dans iOS 8.0, de façon conditionnelles " c'est à  dire après t'être assuré qu'elles étaient disponibles. En effet, tu utilises le SDK 9 donc tu as la possibilité d'appeler ces méthodes, mais tu vises des utilisateurs entre iOS7 et iOS9, donc si tu utilises une méthode qui n'a été rajoutée que depuis iOS8, il faut vérifier avant de l'appeler qu'elle existe, pour ne pas l'appeler pour les utilisateurs qui sont encore sous iOS7


    Tout est expliqué en détail dans le Programming Guide dédié d'Apple.

    using_sdks_2x.png

  • Excellente explication! Merci!

    Mon iPad est en 8.4.1 donc je mets la deployment target en 8.4.

    Avec xcode v7 le système ne me laisse pas le choix pour le load de avfoundation.framework. il m'oblige à  sélectionner la v9. Il n'y a pas d'autres choix. Maintenant comme dit Céroce l'api est simplissime. Donc elle n'aurait pas dû changer...

    Je vais faire plus de test ou bien retourner avec xcode v6.4 et payer les $99 :)
Connectez-vous ou Inscrivez-vous pour répondre.