Xamarin.iOS 9 – Problembehandlung
Dieser Artikel enthält mehrere Tipps zur Problembehandlung für die Arbeit mit iOS 9 in Xamarin.iOS-Apps.
Wo befinden sich die iOS 8 Simulatoren?
Wenn Sie Xcode 7 (oder höher) installiert haben, ersetzt es automatisch alle iOS 8-Simulatoren standardmäßig durch iOS 9-Simulatoren. Wenn Sie weiterhin unter iOS 8 testen müssen, können Sie Xcode starten und dann die iOS 8-Simulatoren herunterladen und installieren.
Wählen Sie in Xcode das Xcode-Menü und dann "Einstellungen" aus...>Downloads:
Aktivieren Sie die Schaltfläche "Jetzt überprüfen und installieren", um die iOS 8-Simulatoren neu zu installieren.
Layouteinschränkung mit Links-/Rechts-Attributfehlern
In iOS 8 (und früher) können UI-Elemente in Storyboards eine Mischung aus Right & Left Attributes (NSLayoutAttributeRight
& NSLayoutAttributeLeft
) und Leading & Trailing Attributes (NSLayoutAttributeLeading
& NSLayoutAttributeTrailing
) im selben Layout verwenden.
Wenn das gleiche Storyboard in iOS 9 ausgeführt wird, führt es zu einer Ausnahme in der folgenden Form:
Beenden der App aufgrund nicht zusammenhängender Ausnahme 'NSInvalidArgumentException', Grund: '*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: Eine Einschränkung kann nicht zwischen einem führenden/nachgestellten Attribut und einem rechts/links-Attribut erfolgen. Verwenden Sie führende/nachgestellte Elemente für beide oder keines.'
iOS 9 erzwingt Layouts für die Verwendung von Attributen "Right" und "Left" oder "Leading & Trailing", jedoch nicht beide. Um dieses Problem zu beheben, ändern Sie alle Layouteinschränkungen so, dass dasselbe Attribut verwendet wird, das in Ihrer Storyboarddatei festgelegt ist.
Weitere Informationen finden Sie in der Diskussion zur iOS 9-Einschränkungsfehler "Stack Overflow".
ERROR ITMS-90535: Unerwarteter CFBundleExecutable-Schlüssel
Nach dem Wechsel zu iOS 9 verwendet eine App Komponenten von Drittanbietern (insbesondere unsere vorhandene Google Maps-Komponente), die kompiliert und unter iOS 8 (oder früher) ausgeführt wurde, wenn Sie versuchen, den neuen Build an iTunes Connect zu übermitteln, erhalten Sie eine Fehlermeldung im Formular:
ERROR ITMS-90535: Unerwarteter CFBundleExecutable-Schlüssel. Das Bundle unter 'Payload/app-name.app/component.bundle' enthält keine ausführbare Datei des Bundles...
Dieses Problem kann in der Regel gelöst werden, indem das benannte Bündel im Projekt gefunden wird– genau wie die Fehlermeldung schlägt – bearbeitet, indem sie Info.plist
den CFBundleExecutable
Schlüssel entfernt. Der CFBundlePackageType
Schlüssel sollte ebenfalls festgelegt BNDL
werden.
Nachdem Sie diese Änderungen vorgenommen haben, führen Sie ein sauberes Projekt durch, und erstellen Sie das gesamte Projekt neu. Sie können iTunes Connect ohne Problem übermitteln, nachdem Sie diese Änderungen vorgenommen haben.
Weitere Informationen finden Sie in dieser Diskussion zu Stack Overflow .
CFNetwork SSLHandshake failed (-9824) Error
Wenn Sie versuchen, eine Verbindung mit dem Internet herzustellen, entweder direkt oder aus einer Webansicht in iOS 9, wird möglicherweise ein Fehler im Formular angezeigt:
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)
Oder im Formular:
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.
In iOS9 erzwingt App Transport Security (ATS) sichere Verbindungen zwischen Internetressourcen (z. B. dem Back-End-Server der App) und Ihrer App. Darüber hinaus erfordert ATS die Kommunikation mit dem Protokoll und der HTTPS
allgemeinen API-Kommunikation, die mit TLS Version 1.2 mit Weiterleitungsgeheimnis verschlüsselt werden soll.
Da ATS standardmäßig in Apps aktiviert ist, die für iOS 9 und OS X 10.11 (El Capitan) erstellt wurden, unterliegen alle Verbindungen, die atS-Sicherheitsanforderungen verwenden NSURLConnection
CFURL
oder NSURLSession
unterliegen. Wenn Ihre Verbindungen diese Anforderungen nicht erfüllen, tritt ein Ausnahmefehler auf.
Informationen zum Beheben dieses Problems finden Sie im Abschnitt "Opting-Out of ATS " in unserem App Transport Security-Handbuch .
Meine vorhandenen Apps werden nicht unter iOS 9 ausgeführt
In unseren iOS 9-Kompatibilitätsinformationen finden Sie Anweisungen zum Neuerstellen und Erneuten Bereitstellen Ihrer vorhandenen Apps für die Ausführung unter iOS 9.
UICollectionViewCell.ContentView ist null in Konstruktoren
Grund: In iOS 9 ist der initWithFrame:
Konstruktor jetzt erforderlich, aufgrund von Verhaltensänderungen in iOS 9, wie die UICollectionView-Dokumentation zugibt. Wenn Sie eine Klasse für den angegebenen Bezeichner registriert haben und eine neue Zelle erstellt werden muss, wird die Zelle jetzt durch Aufrufen der initWithFrame:
Methode initialisiert.
Fix: Fügen Sie den initWithFrame:
Konstruktor wie folgt hinzu:
[Export ("initWithFrame:")]
public YourCellClassName (CGRect frame) : base (frame)
{
Initialize (); // refactor initialize code into a method
}
Verwandte Beispiele: MotionGraph, TextKitDemo
UIView kann beim Laden einer Ansicht aus einem Xib/Nib nicht init mit Coder ausgeführt werden.
Grund: Der initWithCoder:
Konstruktor wird aufgerufen, wenn eine Ansicht aus einer Xib-Datei des Schnittstellen-Generators geladen wird. Wenn dieser Konstruktor nicht exportiert wird, kann nicht verwalteter Code die verwaltete Version nicht aufrufen. Zuvor (z. B. in iOS 8) wurde der IntPtr
Konstruktor aufgerufen, um Ansichten zu initialisieren.
Fix: Erstellen und exportieren Sie den initWithCoder:
Konstruktor wie folgt:
[Export ("initWithCoder:")]
public YourClassName (NSCoder coder) : base (coder)
{
Initialize (); // refactor initialize code into a method
}
Verwandtes Beispiel: Chat
Dyld Message: No Cache Image with Name...
Möglicherweise kann ein Absturz mit den folgenden Informationen im Protokoll auftreten:
Dyld Error Message:
Dyld Message: no cach image with name (/System/Library/PrivateFrameworks/JavaScriptCore.framework/JavaScriptCore)
Grund: Dies ist ein Fehler im nativen Linker von Apple, was geschieht, wenn sie ein privates Framework öffentlich machen (JavaScriptCore wurde in iOS 7 öffentlich gemacht, bevor es ein privates Framework war), und das Bereitstellungsziel der App ist für eine iOS-Version, als das Framework privat war. In diesem Fall wird der Linker von Apple mit der privaten Version des Frameworks statt mit der öffentlichen Version verknüpft.
Fix: Dies wird für iOS 9 behoben, aber es gibt eine einfache Problemumgehung, die Sie in der Zwischenzeit selbst anwenden können: Richten Sie einfach eine spätere iOS-Version in Ihrem Projekt an (In diesem Fall können Sie iOS 7 ausprobieren). Andere Frameworks können ähnliche Probleme aufweisen, z. B. das WebKit-Framework wurde in iOS 8 öffentlich gemacht (daher führt die Zielbestimmung von iOS 7 zu diesem Fehler; Sie sollten iOS 8 für die Verwendung von WebKit in Ihrer App verwenden).
Nicht vertrauenswürdiger Enterprise-Entwickler
Wenn Sie versuchen, die iOS 9-Version Ihrer Xamarin.iOS-App auf realer iOS-Hardware auszuführen, wird möglicherweise eine Meldung angezeigt, dass Ihr Entwicklerkonto auf dem Gerät nicht als vertrauenswürdig eingestuft wurde. Zum Beispiel:
Gehen Sie wie folgt vor, um dieses Problem zu beheben:
Starten Sie Xcode (die neueste Betaversion) auf dem Entwicklungs-Mac.
Wählen Sie im Menü "Fenster" die Option "Geräte" aus, um das Gerätefenster zu öffnen:
Wählen Sie im seitenbereich "GERÄTE" Ihr Gerät aus, klicken Sie mit der rechten Maustaste, und wählen Sie "Bereitstellungsprofile anzeigen" aus...:
Wählen Sie jedes Bereitstellungsprofil aus, das sich derzeit auf dem Gerät befindet, und wählen Sie die - Schaltfläche aus, um es zu löschen:
Wählen Sie im Menü "Xcode " " Einstellungen" und "Konten" aus:
Klicken Sie auf die Schaltfläche "Details anzeigen", und wählen Sie dann die Schaltfläche "Alle herunterladen" aus:
Wenn die Liste die Aktualisierung abgeschlossen hat, wählen Sie die Schaltfläche "Fertig " aus, und schließen Sie das Fenster "Einstellungen".
Entfernen Sie die vorhandene Version der Xamarin.iOS-App, die Sie auf dem iOS-Gerät testen wollten.
Kehren Sie zu Visual Studio für Mac zurück, führen Sie einen sauberen Build durch, und versuchen Sie, die App auf dem Gerät erneut zu starten.
Möglicherweise müssen Sie Visual Studio für Mac beenden und neu starten, bevor die von Xcode geladenen neuen Bereitstellungsprofile angezeigt werden. Möglicherweise müssen Sie auch die iOS Bundle-Signaturoptionen für Ihre Xamarin.iOS-App anpassen, um die neuen Bereitstellungsprofile auszuwählen.
Probleme mit dem Startbildschirm
iOS 9 erzwingt jetzt die Startbildschirmanforderungen, sodass dasselbe Startimage nicht mehr wiederverwendet werden kann, um unterschiedliche Schnittstellenausrichtungen zu unterstützen. Weitere Informationen finden Sie in der UILanchImage-Referenz von Apple.
Optional können Sie eine Storyboarddatei verwenden, um den Startbildschirm Ihrer App darzustellen, anstatt eine Reihe von .png Bilddateien zu verwenden. Dies ist jetzt Apples bevorzugte Methode zum Präsentieren von Startbildschirmen. Weitere Informationen finden Sie in unserem Leitfaden zur Einführung in Unified Storyboards .
Schließlich muss Ihre App eine Storyboarddatei für den Startbildschirm verwenden und alle vier Schnittstellenausrichtungen (Hochformat, Hochformat, Querformat, Querformat links und Querformat rechts) unterstützen, damit sie in einem Folienüberlaufbereich oder im Geteilten Ansichtsmodus ausgeführt werden. Weitere Informationen zu den neuen Multitasking-Fähigkeiten von iOS 9 finden Sie in unserem Leitfaden Multitasking für iPad.
NSInternalInconsistencyException-Ausnahme
Beim Kompilieren und Ausführen einer vorhandenen Xamarin.iOS-App für iOS 9 wird möglicherweise ein Fehler im Formular angezeigt:
Objective-C Ausnahme ausgelöst. Name: NSInternalInconsistencyException-Grund: Anwendungsfenster werden voraussichtlich über einen Stammansichtscontroller am Ende des Anwendungsstarts verfügen.
Dieser Fehler wird ausgelöst, da app Windows voraussichtlich einen Root View Controller am Ende des Anwendungsstarts hat und ihre vorhandene App nicht.
Für dieses Problem gibt es mindestens zwei mögliche Problemumgehungen:
- Aktualisieren Sie die App so, dass die Storyboarddatei anstelle von
xib
Dateien verwendet wird, um die Benutzeroberfläche zu definieren. Dies erfordert je nach Größe Ihrer App und kenntnissen der Verwendung des Schnittstellen-Generators von Xcode zum Layout von Storyboards viel Zeit. Weitere Informationen finden Sie in unserer Dokumentation zu Unified Storyboards . RootViewController
Richten Sie die Eigenschaft des App-Fensters in der Klasse einFinishedLaunching
AppDelegate
, um auf einen Ansichtscontroller in der Benutzeroberfläche Ihrer App zu verweisen.
Zeitpunkt der Initialisierung von Ansichten und Ansichtscontrollern
Mit Xamarin.iOS können Ansichten oder Ansichtscontroller innerhalb von Konstruktoren initialisiert werden, die aufgerufen werden, wenn etwas in verwaltetem Code verfügbar gemacht wird, aber das iOS-Design bricht.
Im Allgemeinen sollten Sie nichts initialisieren, das Code aus dem Konstruktor zurückrufen Objective-C kann, da Sie nicht sicher sein können, wann er aufgerufen wird. Dies bedeutet auch, dass es einen besseren Ort (andere .ctor) oder Aufrufe zum Außerkraftsetzen gibt (wie Objective-C es keine Ereignisse gibt), bei denen diese Initialisierung erfolgen sollte.