Ich versuche, ein Objective C-Framework mit der Programmiersprache Swift= für iOS 8 zu verwenden. Dies ist ein spezieller Fall eines Imports, aber das allgemeine Problem ist:
Wie importieren Sie ein Objective C-Framework in Swift und lassen den Import erkennen?
Ich versuche, das Parse-Framework mit den Betas für iOS 8 und Xcode 6 in eine Swift) -Anwendung zu integrieren.
Hier ist die Technik für die Parse-Framework-Integration in Objective C:
https://www.parse.com/apps/quickstart#social/mobile/ios/native/existing
Ich habe das Parse-Framework als komprimiertes Archiv heruntergeladen, es extrahiert und problemlos in Xcode 6 importiert. In meiner Anwendung wird es als ordnungsgemäß formatiertes Framework unter dem Namen Parse.framework angezeigt.
Mein aktueller Denkprozess besteht darin, die Datei AppDelegate.Swift
Im Stammverzeichnis meines Projekts zu ändern. Hier ist die aktuelle Datei ohne Änderungen (automatisch von Xcode bei der Swift Projekterstellung) generiert):
https://Gist.github.com/fconcklin/e8ef7d8b056105a04161
Ich habe versucht, eine Analyse zu importieren, indem ich die Zeile import Parse
Unter der Zeile import UIKit
Einfügte. Xcode gibt jedoch eine Warnung aus, dass kein solches Modul gefunden wurde und die Erstellung fehlschlägt.
Ich habe auch versucht, eine Datei ${PROJ_NAME_HERE}-Bridging-Header.h
Zu erstellen, die den Objective C-Import von Parse mit import <Parse/Parse.h>
Enthält. Diese Zeile wirft keinen Fehler, scheint aber letztendlich keinen Unterschied zu machen.
Danke im Voraus. Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.
Ein "narrensicherer" Weg zum Hinzufügen eines Überbrückungs-Headers ist wie folgt:
Wenn Sie ein Swift -Projekt haben, fügen Sie Ihrem Projekt ein neues Objective-C-Datei hinzu, und Xcode fordert Sie auf, Ihr Projekt mit einem Überbrückungsheader zu konfigurieren. Drücken Sie auf Ja.
Wenn Sie ein Objective-C -Projekt haben, fügen Sie ein neues Swift File hinzu, und Sie erhalten dieselbe Eingabeaufforderung. Drücken Sie auf Ja.
Nachdem Sie den Überbrückungsheader erhalten haben, können Sie die soeben hinzugefügte Datei löschen, wenn Sie möchten.
Nach weiteren Recherchen fand ich die Lösung und stellte fest, dass ich nur verwirrt war.
Der richtige Ansatz lautet wie folgt:
Importieren Sie Ihr Objective C-Framework, indem Sie das Framework in ein Xcode 6 Swift - Projekt ziehen und dort ablegen.
Erstellen Sie eine neue Objective C-Datei in Ihrem Projekt (Datei-> Neu-> Datei [Objective C für iOS]).
Akzeptieren Sie die Aufforderung (zustimmen), um eine Überbrückungsheaderdatei zwischen Objective C und Swift zu erstellen.
Löschen Sie Ihre neu erstellte Objective C-Datei, behalten Sie jedoch die Bridging-Header-Datei ${YOURPROJ}-Bridging-Header.h
.
Importieren Sie in der Bridging-Header-Datei Ihr Framework mit der Standard-Importsyntax Objective C (z. B. #import <Parse/Parse.h>
).
Dadurch entfällt die Notwendigkeit, eine import Parse
Aussage in Ihrem AppDelegate.Swift
Datei. Sie können jetzt Code schreiben, der jedes Framework verwendet, solange er mit dem Bridging-Header importiert wird. Es ist in allen Swift - Dateien Ihres Projekts verfügbar.
Wenn Sie nun die Parse-Integration in Ihr Projekt testen möchten, können Sie Parse.
und verwenden Sie die Codevervollständigung, um das Framework zu durchsuchen und festzustellen, ob die Codevervollständigung auf einen erfolgreichen Import hinweist.
Es gibt jedoch eine weitere Einschränkung, die bei Verwendung einer Bridging-Header-Datei behoben werden muss. Alle Abhängigkeiten des Frameworks müssen ebenfalls in der Bridging Header-Datei angegeben werden. Wenn Sie das Parse-Framework in eine Swift) -Anwendung integrieren, sieht Ihre Bridging-Header-Datei folgendermaßen aus:
#import <Foundation/Foundation.h>
// Parse Dependencies
#import <AudioToolbox/AudioToolbox.h>
#import <CFNetwork/CFNetwork.h>
#import <CoreGraphics/CoreGraphics.h>
#import <CoreLocation/CoreLocation.h>
#import <MobileCoreServices/MobileCoreServices.h>
#import <QuartzCore/QuartzCore.h>
#import <Security/Security.h>
#import <StoreKit/StoreKit.h>
#import <SystemConfiguration/SystemConfiguration.h>
// Import parse framework
#import <Parse/Parse.h>
Hoffe das hilft.
So fügen Sie dem Swift - Projekt das Parse - Framework hinzu: Fügen Sie diese Bibliotheken dem Swift - Projekt hinzu.
Fügen Sie diese Frameworks von ParseSDK in Ihr Projekt ein:
Fügen Sie einen ProjectName-Bridging-Header.h ( https://developer.Apple.com/library/ios/documentation/Swift/conceptual/buildingcocoaapps/MixandMatch.html ) ( https://stackoverflow.com/a/24272431/1847511 ) Datei mit diesem Inhalt.
Pfad zum Binden des Bridging-Headers hinzufügen:
Fügen Sie den TestCode hinzu:
Führen Sie die App aus.
Die Antwort für mein Problem war anders. Ich hatte die Framework-Suchpfade in den Build-Einstellungen meines Projekts auf rekursiv gesetzt , als sie hätten sein sollen nicht rekursiv .
In meinem Fall sind für mein Ziel die Framework-Suchpfade auf $ (geerbt) festgelegt, was bedeutet, dass die Einstellung von meinem Projekt geerbt wird.
Die Framework-Suchpfade meines Projekts hatten nur einen Pfad: $ PROJECT_DIR /../ External/** (Die beiden Sternchen bedeuten "Diesen Ordner rekursiv durchsuchen". My Parse.framework = Datei befand sich in der Basisebene des externen Ordners.
Ändern des Pfads von rekursiven zu nicht rekursiven festen Dingen für mich. Sehr eigenartig...
Die neue Parse-Framework-Version muss aktualisiert werden.
Zum Beispiel sollten Sie libsqlite3.0.dylib in Library Binary With Libraries einfügen und die Header-Datei mit #import und #import aktualisieren
Verwenden von Objective-C-Klassen in Swift
Wenn Sie Code innerhalb eines App-Ziels importieren (Mischen von Swift und Objective-C in einem Projekt), sollten Sie die Datei bridging header
Verwenden, um Objective-C-Code für Swift Code verfügbar zu machen. [Mischen von Swift - und Objective-C-Code in einem Projekt]
In diesem Beitrag werde ich beschreiben, wie Objective-C-Framework in Swift Code importiert wird
Xcode Version 10.2.1
Erstellen Sie ein Framework-Projekt oder ein Framework-Ziel
File -> New -> Project... -> Cocoa Touch Framework
//or
Project editor -> Add a Target -> Cocoa Touch Framework
Es werden zwei Dateien generiert:
Info.plist
- Build Settings -> Info.plist File
<product_name>.h
- Build Phases -> Headers
. Es ist Umbrella-Header-Datei [Über]Fügen Sie alle .h
- Dateien zu der Umbrella-Datei hinzu, die für den Verbraucher geöffnet wird
#import "header_1.h"
#import "header_2.h"
Implementierungsdateien hinzufügen .m
Select `.m` file -> Select File Inspectors Tab -> Target Membership -> Select the target
//or
Project editor -> select a target -> Build Phases -> Compile Sources -> add files
Fügen Sie Header-Dateien .h
Hinzu, die in <product_name>.h
(header_1.h
, header_2.h
) [kann es nicht tun][öffentliche Zielmitgliedschaft]
Select `.h` file -> Select File Inspectors Tab -> Target Membership -> Select the target and make it **public**
//or
Project editor -> select a target -> Build Phases -> Headers -> add files to the **public** zone
Bauen Sie das Framework - ⌘ Command + B oder Product -> Build
Anmerkung: Stellen Sie sicher, dass Sie das Framework für dieselbe Prozessarchitektur wie den Clientcode erstellen.
Find generated output [Standort erstellen]
Products group -> <product_name>.framework -> Show in Finder
Das Framework beinhaltet
Info.plist
Modules
Ordner mit: module.modulemap
[Über][Benutzerdefinierte Modulkarte] Diese Datei wurde automatisch generiert, weil Build Settings -> Defines Module -> YES
Headers
Ordner mit: Headers
. Es gibt öffentliche Schnittstellen/DefinitionenDrag and drop
Die Binärdatei in das Xcode-Projekt [Über]
Embed binaries
[Bibliothek nicht geladen][Link vs Embed]
Project editor -> select a target -> General -> Embedded Binaries -> path to `<product_name>.framework` file
Ich werde das Framework automatisch hinzufügen zu:
Project editor -> select a target -> General -> Linked Frameworks and Libraries
Project editor -> select a target -> Build Phases -> Embed Frameworks
Project editor -> select a target -> Build Phases -> Link Binary With Libraries
Addiere Framework Search paths
[Modul nicht gefunden][Rekursiver Pfad]
Project editor -> select a target -> Build Settings -> Search Paths -> Framework Search paths -> add path to the parent of `<product_name>.framework` file
Modul in den Swift Client Code importieren [Modulname]
import module_name