web-dev-qa-db-fra.com

Connectez le framework Objective C à Swift iOS 8 (framework Parse))

J'essaie d'utiliser un cadre Objective C avec le langage de programmation Swift pour le développement iOS 8. Il s'agit d'un cas spécifique d'importation, mais le problème général est le suivant:

Comment importer un framework Objective C dans Swift et obtenir la reconnaissance de l'importation?

J'essaie d'intégrer le framework Parse dans une application Swift utilisant les versions bêta d'iOS 8 et Xcode 6.

Voici la technique d'intégration du framework Parse dans Objective C:

https://www.parse.com/apps/quickstart#social/mobile/ios/native/existing

J'ai téléchargé le framework Parse sous forme d'archive compressée, je l'ai extrait et importé dans Xcode 6 sans aucun problème. Dans mon application, il apparaît sous forme de framework correctement formaté sous le nom Parse.framework.

Mon processus de pensée actuel consiste à modifier le AppDelegate.Swift fichier dans le répertoire racine de mon projet. Voici le fichier actuel sans modifications (généré automatiquement par Xcode lors de Swift)):

https://Gist.github.com/fconcklin/e8ef7d8b056105a04161

J'ai essayé d'importer parse en ajoutant la ligne import Parse sous la ligne import UIKit. Cependant, Xcode avertit qu'aucun module de ce type n'a été trouvé et que la construction échoue.

J'ai aussi essayé de créer un fichier ${PROJ_NAME_HERE}-Bridging-Header.h qui contient l’importation Parse de l’objectif C en utilisant import <Parse/Parse.h>. Cette ligne ne génère pas d'erreur mais semble finalement ne faire aucune différence.

Merci d'avance. Faites-moi savoir si vous avez besoin de plus d'informations.

49
user284244

Une méthode "anti-imbécile" pour ajouter un en-tête de pontage est la suivante:

Si vous avez un projet Swift, ajoutez un nouveau fichier Objective-C à votre projet et Xcode vous le demandera si vous souhaitez configurer votre projet avec un en-tête de pontage. Appuyez sur oui.

Si vous avez un projet Objective-C, ajoutez-y un nouveau fichier Swift et vous obtiendrez le même message. Appuyez sur oui.

Après avoir obtenu l'en-tête de pontage, vous pouvez supprimer le fichier que vous venez d'ajouter si vous le souhaitez.

48
Jack

Après d’autres recherches, j’ai trouvé la solution et réalisé que j’étais confus.

La bonne approche est la suivante:

  • Importez votre infrastructure Objective C en la faisant glisser dans un projet Xcode 6 Swift.

  • Créez un nouveau fichier Objective C dans votre projet (Fichier-> Nouveau-> Fichier [Objective C pour iOS]).

  • Acceptez l'invite (d'accord) pour créer un fichier d'en-tête de pontage entre Objective C et Swift.

  • Supprimez le fichier Objective C que vous venez de créer mais conservez le fichier d’en-tête de pontage ${YOURPROJ}-Bridging-Header.h.

  • Dans le fichier d’entête Bridging, importez votre infrastructure à l’aide de la syntaxe standard Objective C import (par exemple, #import <Parse/Parse.h>).

  • Cela évite d'avoir à effectuer un import Parse déclaration dans votre AppDelegate.Swift fichier. Vous pouvez maintenant écrire du code utilisant n'importe quel framework, à condition qu'il soit importé à l'aide de l'en-tête de pontage. Il est disponible dans tous les fichiers Swift de votre projet).

Maintenant, si vous souhaitez tester l’intégration de Parse dans votre projet, vous pouvez taper Parse. et utilisez la complétion de code pour parcourir le cadre et voir que la complétion de code indique une importation réussie.

Cependant, une autre mise en garde ici doit être prise en compte lors de l'utilisation d'un fichier d'en-tête de pontage. Toutes les dépendances de la structure doivent également être spécifiées dans le fichier d’en-tête de pontage. Dans le cas de l'intégration du cadre Parse dans une application Swift, votre fichier d'en-tête de pontage ressemblera à ceci:

 #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>

J'espère que cela t'aides.

72
user284244

Pour ajouter la structure Parse au projet Swift: ajoutez ces bibliothèques au projet Swift.

enter image description here

Collez ces frameworks de ParseSDK dans votre projet:

enter image description here

Ajoutez un ProjectName-Bridging-Header.h ( https://developer.Apple.com/library/ios/documentation/Swift/conceptual/buildingcocoaapps/MixandMatch.html ) ( https: //stackoverflow.com/a/24272431/1847511 ) fichier avec un tel contenu.

enter image description here

Ajouter un chemin pour lier l’en-tête de pontage:

enter image description here

Ajoutez le TestCode:

enter image description here

Lancer l'application.

9
Naloiko Eugene

La réponse à mon problème était différente. J'avais les chemins de recherche dans les paramètres de construction de mon projet définis sur récursifs alors qu'ils auraient dû être non récursif .

Dans mon cas, les cibles de recherche de structure de ma cible sont définies sur $ (hérité), ce qui signifie qu’il doit hériter du paramètre de mon projet.

Les chemins de recherche dans le cadre de mon projet ne comportaient qu'un seul chemin, $ PROJECT_DIR /../ External/** (avec les deux astérisques signifiant "rechercher ce dossier de manière récursive". Mon Parse.framework = le fichier était situé au niveau de base du dossier External.

Changer le chemin de récursif à non récursif a corrigé les choses pour moi. Très étrange...

2
aleclarson

La nouvelle version du framework Parse nécessite une mise à jour.

Tels que vous devez insérer libsqlite3.0.dylib dans Library Binary With Libraries et mettre à jour le fichier d'en-tête avec #import et #import

1
Durul Dalkanat

Utilisation des classes Objective-C dans Swift

Si vous envisagez d'importer du code dans une cible d'application (Mélange Swift et Objective-C dans un projet)), vous devez utiliser bridging header fichier pour exposer le code Objective-C à Swift. [Mélanger Swift et Objective-C dans un projet]]

Dans ce post, je décrirai comment importer le framework Objective-C dans Swift code

Swift Consumer -> Cadre dynamique Objective-C

Xcode version 10.2.1

Créer un framework Objective-C

Créer un projet-cadre ou créer une cible-cadre

File -> New -> Project... -> Cocoa Touch Framework
//or
Project editor -> Add a Target -> Cocoa Touch Framework

Deux fichiers seront générés:

  1. Info.plist - Build Settings -> Info.plist File
  2. <product_name>.h - Build Phases -> Headers. C'est un fichier d'en-tête de parapluie [Sur]

Tout ajouter .h fichiers dans un fichier parapluie qui sera ouvert au consommateur

#import "header_1.h"
#import "header_2.h"

Ajouter des fichiers d'implémentation .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

Ajouter des fichiers d'en-tête .h qui figuraient dans <product_name>.h (header_1.h, header_2.h) [ne peut pas le faire][adhésion cible publique]

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

Construire le cadre - ⌘ Command + B ou Product -> Build

Remarque: assurez-vous de créer la structure pour la même architecture de processus que le code client.

Trouver la sortie générée [Lieu de construction]

Products group -> <product_name>.framework -> Show in Finder

Le cadre comprend

  • Info.plist
  • Modules dossier avec:
  • Headers dossier avec:
    • fichiers de la section Headers. Il y a des interfaces/définitions publiques

Utiliser le framework Objective-C

Drag and drop le binaire dans le projet Xcode [Sur]

Embed binaries[Bibliothèque non chargée][Lien vs Intégrer]

Project editor -> select a target -> General -> Embedded Binaries -> path to `<product_name>.framework` file

J'ajouterai automatiquement le cadre à:

  1. Project editor -> select a target -> General -> Linked Frameworks and Libraries
  2. Project editor -> select a target -> Build Phases -> Embed Frameworks
  3. Project editor -> select a target -> Build Phases -> Link Binary With Libraries

Ajouter Framework Search paths[Module non trouvé][Chemin récursif]

Project editor -> select a target -> Build Settings -> Search Paths -> Framework Search paths -> add path to the parent of `<product_name>.framework` file

Module d'importation vers le Swift du client [nom_module]

import module_name

Plus d'exemples ici

0
yoAlex5