Xamarin.iOS
Reliure des bibliothèques rapides
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
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.
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.
- Une classe swift doit hériter de NSObject pour être liée.
- 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.
- 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;
- 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 *
Construire pour version pour Device and Simulator. *
- 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)
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.
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.
Remplacez le contenu de votre projet de liaison ApiDefinition.cs par celui nouvellement créé.
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.
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.
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
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.
Cliquez sur "Sign and Distribute" et enregistrez sur le disque
Créez le nouvel IPA en utilisant le script mentionné précédemment
Si vous décompressez le fichier, il contiendra le dossier SwiftSupport.
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.