Xamarin.iOS
バインディングスウィフトライブラリ
サーチ…
前書き
Xamarinプロジェクトで使用するためのSwift .frameworkファイルをバインドするプロセスを順を追って導くガイドに従います。
備考
Xcodeでライブラリを構築する際には、迅速なライブラリを含めることができます。しないでください!それらはNAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylibとして最終アプリに含まれますが、それらはNAME.app/Frameworks/libswift*.dylibとして含める必要があります
この情報は他の場所にもありますが、言及する価値があります。ライブラリにビットコードを含めないでください。現時点では、XamarinにはiOS用のBitcodeは含まれておらず、Appleはすべてのライブラリに同じアーキテクチャをサポートする必要があります。
Xamarin.iOSでSwiftライブラリをバインドする
Xamarin.iOSでSwiftライブラリをバインドするのは、 https://developer.xamarin.com/guides/ios/advanced_topics/binding_objective-c/に示すObjective-Cと同じプロセスですが、いくつかの注意点があります。
- スウィフトクラスはバインドするNSObjectから継承する必要があります。
- Swiftコンパイラは、明示的な目的のCの名前を指定するためにあなたの素早いクラスで@objcアノテーション(例えば@objc(MyClass))を使用しない限り、クラスとプロトコルの名前を何かに変換します。
- 実行時に、あなたのAPPは、あなたのバインドされたフレームワークと一緒にいくつかの迅速なコアライブラリをFrameworksというフォルダに含めなければなりません。
- アプリケーションがAppStoreにプッシュされると、Payloadフォルダの横にSwiftSupportフォルダが含まれている必要があります。それらはIPAファイルの中にあります。
ここでは簡単なサンプルバインディングを見つけることができます: https : //github.com/Flash3001/Xamarin.BindingSwiftLibrarySample
完全な拘束力のあるサンプル: https : //github.com/Flash3001/iOSCharts.Xamarin
以下の手順をご覧ください:
1.1エクスポートしたいSwiftクラスを準備する
どのSwiftクラスでも、NSObjectから継承し、objcアノテーションを使用してObjective-C名を明示的に指定する必要があります。それ以外の場合、Swiftコンパイラは異なる名前を生成します。以下は、Swiftクラスの外観のコード例です。 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フレームワークを構築する
ビットコードを無効にする。 *
Device and Simulatorのリリース用にビルドします。 *
- スウィフトバインディングにのみ関連しません。
2.太ったライブラリを作成する
フレームワークにはいくつかのファイルがあり、少し食べる必要があるのはNAME.framework / NAME(拡張子なし)です。
- リリース - iphoneos / NAME.frameworkをNAME.frameworkにコピーする
- 以下を使用してFATライブラリを作成します。
- lipo-release - iphonesimulator / NAME.framework / NAMEリリース - iphoneos / NAME.framework / NAME - 出力NAME.framework / NAMEを作成します。
- Release-iphonesimulator / NAME.framework / Modules / NAME.swiftmoduleのファイルをNAME.framework / Modules / NAME.swiftmoduleにコピーしてください(これまではiphoneosのファイルのみが含まれていました)
3.ライブラリをインポートする
私はあなたがすでにFile - > New - > iOS - > Binding LibraryのBindingプロジェクトを作成したと仮定します。
.frameworksをインポートするXamarinのサポート。 [ネイティブ参照]を右クリックし、[ネイティブ参照を追加]をクリックします。新しく作成された太いフレームワークを見つけて追加します。
4.ヘッダー内のLIBRARY-Swift.hファイルに基づいてApiDefinitionを作成します。
手動で行うこともできますが、うまくいかないでしょう。 Objetive Sharpieを使うことができます。 Xamarinが独自のライブラリをバインドするために使用するツール。
https://developer.xamarin.com/guides/cross-platform/macios/binding/objective-sharpie/でその使い方
基本的なコマンドは次のようになります: sharpie bind -sdk iphoneos9.3 NAME-Swift.h
System.Reflection.TargetInvocationException
が発生した場合は、SDKのバージョンが異なるためです。次のコマンドを実行して、インストールしたiPhone OS SDKで確認します。
sharpie xcode -sdks
ファイルNAME-Swift.hは、 NAME.framework / Headers / NAME-Swift.hにあります。
注意:swiftクラスは "NSObject"から継承しなければなりません。さもなければNAME-Swift.hはクラスをインポートせず、Objetive Sharpieは何も変換しません。
バインドプロジェクトApiDefinition.csの内容を新しく作成したものに置き換えます。
5. Objective-Cランタイムにクラス名を含めるように[Protocol]と[BaseType]をすべて変更します。
元のSwiftクラスまたはプロトコルに、ステップ1.1で指定された@ objc(MyClass)注釈が含まれていない場合は、Objective-C内部の名前が変更されるため、正しいものにマップする必要があります。
すべての名前は、NAME-Swift.hファイルで次の形式で使用できます。
SWIFT_CLASS("_TtC11SwiftSample7MyClass")
@interface MyClass : NSObject
そして
SWIFT_PROTOCOL("_TtP6Charts17ChartDataProvider_")
@protocol ChartDataProvider
名前を設定するには、クラスとProcotolAttribute.Name https://の BaseTypeAttribute.Name https://developer.xamarin.com/guides/cross-platform/macios/binding/binding-types-reference/#BaseType.Nameプロパティを使用します。プロトコルの場合はdeveloper.xamarin.com/api/property/MonoTouch.Foundation.ProtocolAttribute.Name/
[BaseType(typeof(NSObject), Name = "_TtC11SwiftSample7MyClass")]
interface MyClass
手動で行うのはクールではありません。このツールを使用して、 https://github.com/Flash3001/SwiftClassifyを使用してすべての名前を挿入できます。 (それは進行中の作業ですが、それはどのように動作するかを理解するコードを見るだけで非常に簡単です)。
6.1すべてのSwift依存関係を実行するようにします。
アプリケーションでライブラリを使用しようとして、今すぐ実行しようとするとクラッシュします。このエラーはlibswiftCore.dylibの不足によるものです
このようなもの:
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は、Swiftライブラリのバインディングを正式にサポートしていません。したがって、FrameworksとSwiftSupportフォルダにswiftコアライブラリを手動で組み込む必要があります。 SimulatorとDeviceでは、Frameworksフォルダのファイルが異なります。それらは/Applications/Xcode.app/Contents/Developer//XcodeDefault.xctoolchain/usr/lib/swift.Toolchainsにあります。
Frameworkフォルダ内のファイルを手動でコピーする代わりに、このライブラリhttps://github.com/Flash3001/Xamarin.Swift3.Supportを使用することができます 。これには、単一のNuGetパッケージに含まれるSwift 3.1の各依存関係がすべて含まれています。
ご覧のとおり、Nugetパッケージはコンシューマアプリケーションに含まれており、バインディング自体には含まれていません。バインディングに含めると、コンパイルエラーが発生します。
あなたがNuget Packageを構築しているなら、Nugetにそれを依存関係として含めるよう指示することができます。
6.2。どのスウィフト依存性が含まれているかを知る。
重要なことは、プロジェクトに含める必要がある各パッケージを把握することです。単純なバインディングには、通常、次のものが必要です。
libswiftCore.dylib
libswiftCoreGraphics.dylib
libswiftCoreImage.dylib
libswiftDarwin.dylib
libswiftDispatch.dylib
libswiftFoundation.dylib
libswiftObjectiveC.dylib
libswiftQuartzCore.dylib
libswiftUIKit.dylib
各依存関係を一覧表示するには、LibraryName.framework内で次のコマンドを実行します。
otool -l -arch armv7 LibraryName | grep libswift
Swift3用のNuGetで利用できるすべてのパッケージは、あなたのアプリのサイズを大きくする可能性があるため、含まれないでください。
7. SwiftSupportを含めてAppStoreにAppをプッシュします。
Appleは、Payloadフォルダの横にSwiftSupportフォルダを添付してアプリケーションを送信する必要があります。どちらもあなたのIPAパッケージの中にあります。
このスクリプトをhttps://github.com/bq/ipa-packagerで使用すると、この作業を行うことができます。
このプロセスは、図書館の消費者が手動で行う必要がある唯一のプロセスです。毎回、彼はAppStoreにAppをプッシュしようとします。
ファイルを解凍すると、SwiftSupportフォルダが含まれます。
備考
Xcodeでライブラリを構築する際には、迅速なライブラリを含めることができます。しないでください!それらはNAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylibとして最終アプリに含まれますが、それらはNAME.app/Frameworks/libswift*.dylibとして含める必要があります
この情報は他の場所にもありますが、言及する価値があります。ライブラリにビットコードを含めないでください。現時点では、XamarinにはiOS用のBitcodeは含まれておらず、Appleはすべてのライブラリに同じアーキテクチャをサポートする必要があります。
免責事項
このガイドはもともとLucas Teixeiraによって作成されています。すべてのクレジットは彼に属します。ありがとう、ルーカス。