it-swarm.com.de

Swift-Modul/-Framework kann nicht in der Objective-C-App eingebettet werden

Alternative Titel (zur Unterstützung der Suche)

  • Das Swift 2.3-Framework, das mit einer Objective-C-App in Xcode 8 verknüpft ist, kann nicht debuggt werden
  • error in auto-import: failed to get module 'XYZ' from AST context Xcode 8
  • Xcode 8 kann das Swift-Framework nicht debuggen
  • warning: Swift error in module <XYZ>
  • Workaround für; Der Xcode-Debugger kann nicht nur in Objective-C geschriebene Apps debuggen, sondern nur gegen Frameworks, die nur in Swift geschrieben wurden. (28312362)

Ich habe eine in Objective-C geschriebene App, die mit einigen in Swift 2.x geschriebenen Modulen (Frameworks) verknüpft ist.

Frage

Alles (Debuggen usw.) funktioniert einwandfrei in xcode7 . Wenn Sie jedoch nach xcode8 wechseln und die Module für die Verwendung von Swift2.3 aktualisieren, konnte ich die Module nicht debuggen.

LLDB hat diese Fehler gemeldet: 

warning: Swift error in module XYZ.
Debug info from this module will be unavailable in the debugger.

error: in auto-import:
failed to get module 'ABC' from AST context

Dies passiert nicht, wenn ich die Module mit einer in Swift 2.3 erstellten App verknüpfe.

26
rjstelling

tl: dr

Fügen Sie unter "Build-Einstellungen" eine benutzerdefinierte Einstellung für Ihr App-Ziel hinzu.

Swift_VERSION = 2.3

 Swift_VERSION = 2.3 — Build Settings

Mehr Info

Ich bin nicht sicher, ob es sich um einen Xcode 8-Fehler handelt oder ob es sich um eine Apple-Richtlinie handelt (um einen Entwickler mit Swift 3.0 zu zwingen). Standardmäßig installiert Xcode 8 die Swift 3.0-Versionen der Swift-Standard-Laufzeitbibliotheken. 

Beim Debuggen mit LLDM können die Swift 2.3-Module nicht geladen werden (in die Swift 3.0-Laufzeit). 

Wenn die App dazu gezwungen wird, Swift 2.3 (oder das ältere Swift, wie Apple es nennt) zu verwenden, wird das Problem behoben.

In Swift-Apps wird diese Einstellung von Xcode angezeigt. Sie müssen sie jedoch manuell für eine Objective-C-App hinzufügen.

Weitere Hinweise

Portieren Sie Ihren Swift 2.3-Code so schnell wie möglich in Swift 3.0. Apple unterstützt 2.x nicht sehr lange. 

6
rjstelling

Für mich war es genauso einfach wie schmerzhaft und zeitraubend: 

import SDWebImage war das PROBLEM , weil eines der Frameworks bereits SDWebImage enthielt (und ich konnte es nicht sehen), und dieses Framework war zufällig Objective-C und die App war Swift. Ich habe auch das SDWebImage zu dem Projekt hinzugefügt, weil ich es in den Klassen, die ich schreibe, verwende und das, was das Chaos verursacht hat, mit dem xCode-Debugger nicht umgehen konnte. Stellen Sie also sicher, dass Sie NICHT ALLES in irgendeiner Weise dupliziert haben. Ich würde nach allgemeinen Dingen wie SDWebImage suchen.

17
Tim Friedland

verwenden Sie fr v statt po zum Debuggen 

Weitere Informationen zum Debuggen https://www.codeproject.com/Articles/1181358/Debugging-with-Xcode

10

Ich habe dieses Problem mit einem Apple-Ingenieur namens Sean auf der WWDC 2017 besprochen.

Mein Team hat wochenlang versucht, das herauszufinden, und es stellte sich als Fehler in Apples Compiler heraus, den wir selbst nie herausgefunden hätten. Es hat auch eine sehr einfache Problemumgehung.

Es gibt einen Fehler in der Art und Weise, wie die kompilierenden Flags aus den Frameworks und dem Projekt aggregiert werden, und das "pure Objective-C" -Projekt "aktiviert" es.

Lösung: Fügen Sie eine einzige leere Swift-Datei ("Whatever.Swift" oder was auch immer) zu Ihrem Objective-C-Projekt hinzu, sodass diese nicht mehr als reine Ziel-C-Datei definiert wird (neue-> Datei-> Swift-Datei, nicht erstellen Überbrückungsheader. Die Datei enthält nur den Import von Foundation).

Und das ist es. Problem gelöst.

9
fredericouimet

Ich bin auf die error in auto-import: failed to get module 'XYZ' from AST context-Nachricht gestoßen, als ich versuchte, in einem 9.3-Simulator zu debuggen. Durch den Wechsel zu einem 10.2-Simulator wurde das Problem behoben.

2
Jason Moore

Ich bin darauf gestoßen, als ich mit Carthage ein Gerüst gebaut habe. Wenn Sie versuchen, ein Debugging durchzuführen, wird der Fehler gedruckt, der auf eine Abhängigkeit des Obj-C-Frameworks verweist.

Ich habe dieses blog post gefunden, in dem vorgeschlagen wurde, die folgenden benutzerdefinierten Build-Einstellungen zu meinem Projekt hinzuzufügen:

Für Debuggen: REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = NO

Zur Veröffentlichung: REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = YES

Dies hat das Problem für mich behoben.

2
Austin

In meinem Fall musste ich Objective-C Bridging header aus der Build-Settings-Datei entfernen. Meine Bridging-Header-Datei hat nichts getan, also war es okay.

2

Versuchen Sie, Xcode neu zu starten. In meinem Fall wurde ein Problem gelöst.

1
saltwat5r

Wie von Tim https://stackoverflow.com/a/41876400/1840269 vorgeschlagen war die Ursache unseres Problems eine Frage von Duplikaten.

Wir hatten eine obj-c-Wrapper-Kategorie für SDWebImage, die sowohl von obj-c als auch von Swift verwendet wurde .. Beim Importieren der Kategorie aus Swift hat sich alles wegen Redefinition/Duplikate-Import explodiert, da der SDWebImage-Pod sich bereits als Swift ausgesetzt hat Modul.

Die Lösung? Wir haben die obj-c-Kategorie als Swift-Erweiterung neu implementiert - und haben sie sowohl von Swift als auch von obj-c verwendet, indem wir @objc vor der Erweiterung hinzugefügt und die #import "product-Swift.h"-Datei von obj-c importiert haben.

Beginnen Sie vielleicht mit der Prüfung: https://developer.Apple.com/library/content/qa/qa1947/_index.html .

0
micmdk

Ich brauchte nur zwei Tage, um die ganze Zeit über Druckbefehle zu lösen und zu debuggen. Nun habe ich die Ausgabe bekommen:

Mein Projekt ist in Swift und ich habe die Objective-C-Bibliothek verwendet, wie sie in den Swaps für Swift importiert wurde (das alte Objective-C-Projekt wurde hier zusammengeführt), und ich verwendete den Import-IQKeyboardManager sowie den Import-Header "IQKeyboardManager.h". Durch diese Konflikte und das Löschen des Headers wurde mein Problem endgültig gelöst. Sie können diese Art von Duplizität in Bibliotheken überprüfen.

0
Taranjeet Kaur

In meinem Fall ist ein Compiler-Fehler im "C" -Code aufgetreten, der in LLDB gemeldet wurde, nachdem der Fehler behoben wurde und die LLDB wieder funktionierte.

0
mbonness