Partager via


Xamarin.iOS 9 – Résolution des problèmes

Cet article fournit plusieurs conseils de dépannage pour l’utilisation d’iOS 9 dans les applications Xamarin.iOS.

Où sont les simulateurs iOS 8 ?

Si vous avez installé Xcode 7 (ou version ultérieure), il remplace automatiquement tous les simulateurs iOS 8 par des simulateurs iOS 9 par défaut. Si vous avez toujours besoin de tester sur iOS 8, vous pouvez démarrer Xcode, puis télécharger et installer les simulateurs iOS 8.

Dans Xcode, sélectionnez le menu Xcode , puis Préférences...>Téléchargements :

iOS 8 Simulators Downloads

Sélectionnez le bouton Vérifier et installer maintenant pour réinstaller les simulateurs iOS 8.

Contrainte de disposition avec erreurs d’attribut gauche/droite

Dans iOS 8 (et avant), les éléments d’interface utilisateur dans les storyboards peuvent utiliser un mélange d’attributs de droite et de gauche (NSLayoutAttributeRight>NSLayoutAttributeLeft) et d’attributs de début et de fin (NSLayoutAttributeLeading&NSLayoutAttributeTrailing) dans la même disposition.

Si le même Storyboard est exécuté dans iOS 9, une exception s’affiche sous la forme suivante :

Fin de l’application en raison d’une exception non coquine 'NSInvalidArgumentException', raison : '*** +[NSLayoutConstraint constraintWithItem :attribute :relatedBy :toItem :attribute :multiplier :constant :] : une contrainte ne peut pas être effectuée entre un attribut de début/fin et un attribut de droite/gauche. Utilisez le début/la fin pour les deux ou les deux.

iOS 9 applique des dispositions pour utiliser les attributs Right & Leftou Leading & Trailing, mais pas les deux. Pour résoudre ce problème, modifiez toutes les contraintes de disposition pour utiliser le même jeu d’attributs dans votre fichier Storyboard.

Pour plus d’informations, consultez la discussion sur la contrainte Stack Overflow iOS 9 .

ERREUR ITMS-90535 : Clé CFBundleExecutable inattendue

Après avoir basculé vers iOS 9, à partir d’une application utilise des composants tiers (en particulier notre composant Google Cartes existant) compilés et exécutés sur iOS 8 (ou version antérieure), lorsque vous essayez d’envoyer la nouvelle build à iTunes Connecter vous pouvez obtenir une erreur dans le formulaire :

ERREUR ITMS-90535 : Clé CFBundleExecutable inattendue. Le bundle sur « Payload/app-name.app/component.bundle » ne contient pas d’exécutable de bundle...

Ce problème peut généralement être résolu en recherchant l’offre groupée nommée dans le projet, alors, comme le suggère le message d’erreur , modifié celui-ci Info.plist dans le bundle en supprimant la CFBundleExecutable clé. La CFBundlePackageType clé doit également être définie BNDL .

Après avoir apporté ces modifications, effectuez une propre et régénérez l’ensemble du projet. Vous pouvez soumettre à iTunes Connecter sans problème après avoir apporté ces modifications.

Pour plus d’informations, consultez cette discussion Stack Overflow .

Échec de l’erreur CFNetwork SSLHandshake (-9824)

Lorsque vous tentez de vous connecter à Internet, directement ou à partir d’une vue web dans iOS 9, vous pouvez obtenir une erreur dans le formulaire :

2015-09-04 14:38:05.757 FormsWebViewiOS[2553:30362] CFNetwork SSLHandshake failed (-9824)
2015-09-04 14:38:05.758 FormsWebViewiOS[2553:30363] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824)

Ou sous la forme :

2015-09-04 14:39:17.881 FormsWebViewiOS[2568:30974] App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure.
Temporary exceptions can be configured via your app's Info.plist file.

Dans iOS9, App Transport Security (ATS) applique des connexions sécurisées entre les ressources Internet (telles que le serveur principal de l’application) et votre application. En outre, ATS nécessite la communication à l’aide du protocole et de la HTTPS communication d’API de haut niveau pour être chiffrée à l’aide de TLS version 1.2 avec secret avant.

Étant donné que ATS est activé par défaut dans les applications créées pour iOS 9 et OS X 10.11 (El Capitan), toutes les connexions utilisant NSURLConnection, CFURLou NSURLSession seront soumises à des exigences de sécurité ATS. Si vos connexions ne répondent pas à ces exigences, elles échouent avec une exception.

Pour plus d’informations sur la façon de résoudre ce problème, consultez la section Opting-Out of ATS de notre Guide de sécurité des transports d’application.

Mes applications existantes ne s’exécutent pas sur iOS 9

Consultez nos informations de compatibilité iOS 9 pour obtenir des instructions sur la reconstruction et le redéploiement de vos applications existantes à exécuter sur iOS 9.

UICollectionViewCell.ContentView est Null dans les constructeurs

Motif : Dans iOS 9, le initWithFrame: constructeur est désormais requis, en raison des modifications de comportement dans iOS 9 comme états de documentation UICollectionView. Si vous avez inscrit une classe pour l’identificateur spécifié et qu’une nouvelle cellule doit être créée, la cellule est désormais initialisée en appelant sa initWithFrame: méthode.

Correctif : Ajoutez le initWithFrame: constructeur comme suit :

[Export ("initWithFrame:")]
public YourCellClassName (CGRect frame) : base (frame)
{
    Initialize (); // refactor initialize code into a method
}

Exemples connexes : MotionGraph, TextKitDemo

UIView ne parvient pas à init avec Coder lors du chargement d’une vue à partir d’un xib/nib

Motif : le initWithCoder: constructeur est appelé lors du chargement d’une vue à partir d’un fichier Xib Du Générateur d’interface. Si ce constructeur n’est pas exporté, le code non managé ne peut pas appeler la version managée de celui-ci. Précédemment (par exemple, dans iOS 8), le IntPtr constructeur a été appelé pour initialiser les vues.

Correctif : Créez et exportez le initWithCoder: constructeur comme suit :

[Export ("initWithCoder:")]
public YourClassName (NSCoder coder) : base (coder)
{
    Initialize (); // refactor initialize code into a method
}

Exemple connexe : Conversation

Message Dyld : Aucune image de cache avec le nom...

Vous pouvez rencontrer un blocage avec les informations suivantes dans le journal :

Dyld Error Message:
Dyld Message: no cach image with name (/System/Library/PrivateFrameworks/JavaScriptCore.framework/JavaScriptCore)

Raison : Il s’agit d’un bogue dans l’éditeur de liens natif d’Apple, qui se produit lorsqu’il rend un framework privé public (JavaScriptCore a été rendu public dans iOS 7, avant qu’il ne s’agissait d’une infrastructure privée), et que la cible de déploiement de l’application concerne une version iOS lorsque le framework était privé. Dans ce cas, l’éditeur de liens Apple établira un lien avec la version privée de l’infrastructure au lieu de la version publique.

Correctif : Cela sera traité pour iOS 9, mais il existe une solution de contournement facile que vous pouvez appliquer vous-même en attendant : ciblez simplement une version ultérieure d’iOS dans votre projet (vous pouvez essayer iOS 7 dans ce cas). D’autres frameworks peuvent présenter des problèmes similaires, par exemple le framework WebKit a été rendu public dans iOS 8 (et donc le ciblage d’iOS 7 entraîne cette erreur ; vous devez cibler iOS 8 pour utiliser WebKit dans votre application).

Développeur d’entreprise non approuvé

Lorsque vous tentez d’exécuter la version iOS 9 de votre application Xamarin.iOS sur du matériel iOS réel, vous pouvez recevoir un message indiquant que votre compte de développeur n’a pas été approuvé sur l’appareil. Par exemple :

Untrusted Enterprise Developer alert

Pour résoudre ce problème, procédez comme suit :

  1. Démarrez Xcode (la dernière version bêta) sur le Mac de développement.

  2. Sélectionnez Appareils dans le menu Fenêtre pour ouvrir la fenêtre Appareils :

    The Devices Window

  3. Sous le panneau latéral APPAREILS , sélectionnez votre appareil, cliquez avec le bouton droit, puis sélectionnez Afficher les profils d’approvisionnement... :

    SShow Provisioning Profiles

  4. Sélectionnez actuellement chaque profil d’approvisionnement sur l’appareil et sélectionnez le bouton pour le - supprimer :

    Deleting a provisioning profile

  5. Dans le menu Xcode , sélectionnez Préférences... et Comptes :

    Xcode account preferences

  6. Cliquez sur le bouton Afficher les détails... puis sélectionnez le bouton Télécharger tout :

    Download all profiles

  7. Lorsque la liste a terminé la mise à jour, sélectionnez le bouton Terminé et fermez la fenêtre Préférences.

  8. Supprimez la version existante de l’application Xamarin.iOS que vous essayiez de tester à partir de l’appareil iOS.

  9. Revenez à Visual Studio pour Mac, effectuez une build propre et essayez de réexécuter l’application sur l’appareil.

Vous devrez peut-être arrêter et redémarrer Visual Studio pour Mac avant que les nouveaux profils d’approvisionnement chargés par Xcode soient visibles. Vous devrez peut-être également ajuster les options de signature de bundle iOS pour votre application Xamarin.iOS pour sélectionner les nouveaux profils d’approvisionnement.

Problèmes liés à l’écran de lancement

IOS 9 applique désormais les exigences de l’écran de lancement afin que la même image de lancement ne puisse plus être réutilisée pour prendre en charge différentes orientations de l’interface. Pour plus d’informations, consultez la référence UILanchImage d’Apple.

Si vous le souhaitez, vous pouvez utiliser un fichier storyboard pour présenter l’écran de lancement de votre application par opposition à l’utilisation d’un ensemble de fichiers image .png . Il s’agit maintenant de la méthode préférée d’Apple pour présenter les écrans de lancement. Pour plus d’informations, consultez notre guide d’introduction aux storyboards unifiés .

Enfin, votre application doit utiliser un fichier storyboard pour son écran de lancement et prendre en charge les quatre orientations de l’interface (Portrait, Portrait à l’envers, Paysage gauche et Paysage droit) à prendre en compte pour l’exécution dans un panneau De diapositive ou en mode Mode Fractionné. Pour en savoir plus sur les nouvelles capacités multitâche d’iOS 9, consultez notre guide multitâche pour iPad .

NSInternalInconsistencyException Exception

Lors de la compilation et de l’exécution d’une application Xamarin.iOS existante pour iOS 9, vous risquez d’obtenir une erreur dans le formulaire :

Objective-C exception levée. Nom : NSInternalInconsistencyException Raison : Les fenêtres d’application sont censées avoir un contrôleur de vue racine à la fin du lancement de l’application

Cette erreur est déclenchée, car l’application Windows est censée avoir un contrôleur de vue racine à la fin du lancement de l’application et que votre application existante ne l’a pas fait.

Il existe au moins deux solutions de contournement possibles pour ce problème :

  1. Mettez à jour l’application pour utiliser le fichier storyboard au lieu de xib fichiers pour définir son interface utilisateur. Cela nécessite beaucoup de temps pour corriger, en fonction de la taille de votre application et de la connaissance de l’utilisation du Générateur d’interface de Xcode pour mettre en page des storyboards. Pour plus d’informations, consultez notre documentation Introduction aux storyboards unifiés .
  2. Configurez la RootViewController propriété de la fenêtre d’application dans la méthode dans FinishedLaunching la AppDelegate classe pour pointer vers un contrôleur d’affichage dans l’interface utilisateur de votre application.

Quand initialiser des vues et des contrôleurs de vue

Avec Xamarin.iOS, il est possible d’initialiser des vues ou des contrôleurs de vue à l’intérieur des constructeurs, appelés lorsqu’un élément est exposé dans le code managé, mais il interrompt la conception iOS.

En général, vous ne devez pas initialiser quoi que ce soit qui peut rappeler Objective-C le code du constructeur, car vous ne pouvez pas être sûr quand il sera appelé. Cela signifie également qu’il existe un meilleur emplacement (autre .ctor) ou des appels à remplacer (comme Objective-C il n’y a pas d’événements) où cette initialisation doit être effectuée.