Recherche…


Introduction

Un guide facile à suivre qui vous guidera à travers le processus de liaison des fichiers .framework Swift pour une utilisation dans un projet Xamarin.

Remarques

  1. Lors de la construction d'une bibliothèque dans Xcode, il est possible d'inclure les bibliothèques rapides. Ne pas! Ils seront inclus dans votre application finale sous NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib, mais ils doivent être inclus sous NAME.app/Frameworks/libswift*.dylib.

  2. Vous pouvez trouver cette information ailleurs, mais cela vaut la peine de le mentionner: N'incluez pas le Bitcode dans la bibliothèque. À l'heure actuelle, Xamarin n'inclut pas Bitcode pour iOS et Apple exige que toutes les bibliothèques prennent en charge les mêmes architectures.

Relier une bibliothèque Swift à Xamarin.iOS

Reliure une bibliothèque Swift à Xamarin.iOS suit le même processus pour Objective-C comme le montre https://developer.xamarin.com/guides/ios/advanced_topics/binding_objective-c/ , mais avec quelques mises en garde.

  1. Une classe swift doit hériter de NSObject pour être liée.
  2. Compilateur Swift se traduira par des noms de classe et protocole en quelque chose d' autre à moins que vous utilisez l' @objc annotation (par exemple @objc (MyClass)) dans vos classes rapides pour spécifier le nom objectif explicite c.
  3. Pendant l'exécution, votre application doit inclure des bibliothèques de base rapides parallèlement à votre infrastructure liée dans un dossier appelé Frameworks;
  4. Lorsque l'application est transmise à AppStore, elle doit inclure un dossier SwiftSupport avec votre dossier Payload. Ceux-ci sont dans le fichier IPA.

Ici vous pouvez trouver un lien simple: https://github.com/Flash3001/Xamarin.BindingSwiftLibrarySample

Et un exemple de liaison complète: https://github.com/Flash3001/iOSCharts.Xamarin

Veuillez trouver les étapes ci-dessous:

1.1 Préparez les classes Swift que vous souhaitez exporter

Pour toute classe Swift que vous souhaitez utiliser, vous devez soit hériter de NSObject et rendre le nom Objective-C explicite à l'aide de l'annotation objc. Sinon, le compilateur Swift générera des noms différents. Vous trouverez ci-dessous un exemple de code de la façon dont une classe Swift pourrait ressembler. Notez que la classe dont elle hérite n'a pas d'importance tant que la classe racine hérite de NSObject.

//Add this to specify explicit objective c name
@objc(MyClass)
open class MyClass: NSObject {
    open func getValue() -> String
    {
        return "Value came from MyClass.swift!";
    }
}

1.2 Construire le cadre

Désactiver le code binaire *

Désactiver le bitcode

Construire pour version pour Device and Simulator. * Définissez-le comme version dans les schémas Xcode Construire pour périphérique

Construire pour simulateur

Rechercher des cadres

Cadres

  • Non lié uniquement à la liaison Swift.

2. Créez une bibliothèque de graisse

Un framework contient plusieurs fichiers, celui qui doit manger un peu est NAME.framework / NAME (sans extension).

  • Copier Release-iphoneos / NAME.framework sur NAME.framework
  • Créez la bibliothèque FAT en utilisant:
    • lipo -create Release-iphonesimulator / NAME.framework / NAME Version-iphoneos / NAME.framework / NAME -output NAME.framework / NAME
  • Copiez les fichiers dans la version-iphonesimulator / NAME.framework / modules / NAME.swiftmodule à NAME.framework / modules / NAME.swiftmodule (jusqu'à présent, il ne contient que les fichiers des iphoneos)

Créer une grosse bibliothèque

Copier les fichiers en attente

Fichiers copiés

3. Importer la bibliothèque

Je suppose que vous avez déjà créé le projet Binding dans File -> New -> iOS -> Binding Library.

Xamarin prend en charge l'importation de .frameworks. Cliquez avec le bouton droit sur "Native References" et cliquez sur "Ajouter une référence native". Trouvez le nouveau cadre de travail créé et ajoutez-le.

Ajouter une référence native

Sélectionnez .framework

Référence

4. Créez le fichier ApiDefinition basé sur le fichier LIBRARY-Swift.h dans les en-têtes.

Vous pouvez le faire manuellement, mais ce ne sera pas agréable. Vous pouvez utiliser l’objectif Sharpie. L'outil que Xamarin utilise pour lier ses propres bibliothèques.

Comment l'utiliser sur https://developer.xamarin.com/guides/cross-platform/macios/binding/objective-sharpie/

La commande de base sera quelque chose comme: sharpie bind -sdk iphoneos9.3 NAME-Swift.h

Si vous obtenez une System.Reflection.TargetInvocationException c'est probablement parce que vous avez installé une autre version du SDK. Exécutez la commande suivante pour vérifier avec iPhone OS SDK que vous avez installé:

sharpie xcode -sdks

Le fichier NAME-Swift.h se trouve dans NAME.framework / Headers / NAME-Swift.h

Note: Les classes swift doivent hériter de "NSObject", sinon NAME-Swift.h n'importera pas vos classes et Objetive Sharpie ne convertira rien.

Sharpie

Remplacez le contenu de votre projet de liaison ApiDefinition.cs par celui nouvellement créé. Remplacer le contenu du fichier

5. Modifiez tous les protocoles [Protocol] et [BaseType] pour inclure le nom de la classe dans le runtime Objective-C.

Dans le cas où la classe Swift d'origine ou le protocole ne comprend pas l'annotation @objc (MyClass) comme spécifié à l'étape 1.1, ils auront les noms Objective-C internes ont changé, vous devez mapper à la bonne.

Tous les noms sont disponibles dans le fichier NAME-Swift.h au format suivant:

SWIFT_CLASS("_TtC11SwiftSample7MyClass")
@interface MyClass : NSObject

Et

SWIFT_PROTOCOL("_TtP6Charts17ChartDataProvider_")
@protocol ChartDataProvider

Pour définir le nom que vous utilisez BaseTypeAttribute.Name https://developer.xamarin.com/guides/cross-platform/macios/binding/binding-types-reference/#BaseType.Name propriété pour les classes et ProcotolAttribute.Name https: // developer.xamarin.com/api/property/MonoTouch.Foundation.ProtocolAttribute.Name/ pour les protocoles.

[BaseType(typeof(NSObject), Name = "_TtC11SwiftSample7MyClass")]
interface MyClass

Le faire manuellement n'est pas cool. Vous pouvez utiliser cet outil https://github.com/Flash3001/SwiftClassify pour insérer tous les noms. (C'est du travail en cours. Mais c'est assez simple, simplement en regardant le code, vous obtiendrez comment cela fonctionne).

6.1 Inclure toutes les dépendances Swift à exécuter.

Si vous essayez de consommer la bibliothèque dans une application et que vous essayez de l'exécuter immédiatement, elle se bloquera. L'erreur est due à l'absence de libswiftCore.dylib

Quelque chose comme ça:

Dyld Error Message:
  Library not loaded: @rpath/libswiftCore.dylib
  Referenced from: /Users/USER/Library/Developer/CoreSimulator/Devices/AC440891-C819-4050-8CAB-CE15AB4B3830/data/Containers/Bundle/Application/27D2EC87-5042-4FA7-9B80-A24A8971FB48/SampleUsing.app/Frameworks/SwiftSample.framework/SwiftSample
  Reason: image not found

Xamarin.iOS ne fournit pas de support officiel pour lier une bibliothèque Swift. Vous devez donc inclure manuellement les bibliothèques de base swift dans les dossiers Frameworks et SwiftSupport. Les fichiers du dossier Frameworks sont différents pour Simulator et Device. Ils peuvent être trouvés dans /Applications/Xcode.app/Contents/Developer//XcodeDefault.xctoolchain/usr/lib/swift.Toolchains

Au lieu de copier manuellement les fichiers dans le dossier Framework, vous pouvez utiliser cette bibliothèque https://github.com/Flash3001/Xamarin.Swift3.Support . Il inclut toutes les dépendances dont Swift 3.1 a besoin, chacune dans un seul package NuGet.

Ajouter un package NuGet

Comme vous pouvez le voir, le package Nuget est inclus dans l'application grand public, pas dans la liaison elle-même. Si vous essayez de l'inclure dans la liaison, vous obtiendrez des erreurs de compilation.

Si vous créez un package Nuget, vous pouvez demander à Nuget de l'inclure en tant que dépendance.

Application en cours d'exécution

6.2. Identifier les dépendances Swift à inclure.

Une chose importante à faire est de déterminer chaque paquet que vous devez inclure dans votre projet. Une liaison simple nécessitera généralement:

     libswiftCore.dylib
     libswiftCoreGraphics.dylib
     libswiftCoreImage.dylib
     libswiftDarwin.dylib
     libswiftDispatch.dylib
     libswiftFoundation.dylib
     libswiftObjectiveC.dylib
     libswiftQuartzCore.dylib
     libswiftUIKit.dylib   

Pour répertorier chaque dépendance, vous pouvez exécuter la commande suivante dans votre LibraryName.framework

otool -l -arch armv7 LibraryName | grep libswift

Liste des dépendances

N'incluez pas tous les packages disponibles dans NuGet for Swift3, car ils pourraient augmenter la taille de votre application.

7. Incluez SwiftSupport pour pousser l'application vers AppStore.

Apple exige que votre application soit envoyée avec un dossier SwiftSupport à côté de votre dossier Payload. Les deux sont dans votre paquet IPA.

Vous pouvez utiliser ce script https://github.com/bq/ipa-packager pour faire ce travail pour vous.

Ce processus est le seul que le consommateur de bibliothèque devra effectuer manuellement. Chaque fois qu'il / elle essaie de pousser l'application sur AppStore.

Archive pour la publication

Cliquez sur "Sign and Distribute" et enregistrez sur le disque Signer et distribuer

Décompressez votre .IPA Décompresser

Créez le nouvel IPA en utilisant le script mentionné précédemment Nouvelle API

Si vous décompressez le fichier, il contiendra le dossier SwiftSupport. entrer la description de l'image ici

Remarques

Lors de la construction d'une bibliothèque dans Xcode, il est possible d'inclure les bibliothèques rapides. Ne pas! Ils seront inclus dans votre application finale sous NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib, mais ils doivent être inclus sous NAME.app/Frameworks/libswift*.dylib.

Vous pouvez trouver cette information ailleurs, mais cela vaut la peine de le mentionner: N'incluez pas le Bitcode dans la bibliothèque. À l'heure actuelle, Xamarin n'inclut pas Bitcode pour iOS et Apple exige que toutes les bibliothèques prennent en charge les mêmes architectures.

Avertissement

Ce guide est à l'origine créé par Lucas Teixeira . Tous les crédits lui appartiennent. Merci Lucas.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow