サーチ…


前書き

Xamarinプロジェクトで使用するためのSwift .frameworkファイルをバインドするプロセスを順を追って導くガイドに従います。

備考

  1. Xcodeでライブラリを構築する際には、迅速なライブラリを含めることができます。しないでください!それらはNAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylibとして最終アプリに含まれますが、それらはNAME.app/Frameworks/libswift*.dylibとして含める必要があります

  2. この情報は他の場所にもありますが、言及する価値があります。ライブラリにビットコードを含めないでください。現時点では、XamarinにはiOS用のBitcodeは含まれておらず、Appleはすべてのライブラリに同じアーキテクチャをサポートする必要があります。

Xamarin.iOSでSwiftライブラリをバインドする

Xamarin.iOSでSwiftライブラリをバインドするのは、 https://developer.xamarin.com/guides/ios/advanced_topics/binding_objective-c/に示すObjective-Cと同じプロセスですが、いくつかの注意点があります。

  1. スウィフトクラスはバインドするNSObjectから継承する必要があります。
  2. Swiftコンパイラは、明示的な目的のCの名前を指定するためにあなたの素早いクラスで@objcアノテーション(例えば@objc(MyClass))を使用しない限り、クラスとプロトコルの名前を何かに変換します。
  3. 実行時に、あなたのAPPは、あなたのバインドされたフレームワークと一緒にいくつかの迅速なコアライブラリをFrameworksというフォルダに含めなければなりません。
  4. アプリケーションが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のリリース用にビルドします。 * Xcodeスキームでリリースとして設定する デバイス用にビルドする

シミュレータのビルド

フレームワークを見つける

フレームワーク

  • スウィフトバインディングにのみ関連しません。

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のサポート。 [ネイティブ参照]を右クリックし、[ネイティブ参照を追加]をクリックします。新しく作成された太いフレームワークを見つけて追加します。

ネイティブ参照を追加する

.frameworkを選択

参照

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パッケージはコンシューマアプリケーションに含まれており、バインディング自体には含まれていません。バインディングに含めると、コンパイルエラーが発生します。

あなたが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をプッシュしようとします。

出版のためのアーカイブ

[署名と配布]をクリックし、ディスクに保存します署名と配布

.IPAを解凍する解凍する

前述のスクリプトを使用して新しいIPAを作成する新しいAPI

ファイルを解凍すると、SwiftSupportフォルダが含まれます。 ここに画像の説明を入力

備考

Xcodeでライブラリを構築する際には、迅速なライブラリを含めることができます。しないでください!それらはNAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylibとして最終アプリに含まれますが、それらはNAME.app/Frameworks/libswift*.dylibとして含める必要があります

この情報は他の場所にもありますが、言及する価値があります。ライブラリにビットコードを含めないでください。現時点では、XamarinにはiOS用のBitcodeは含まれておらず、Appleはすべてのライブラリに同じアーキテクチャをサポートする必要があります。

免責事項

このガイドはもともとLucas Teixeiraによって作成されています。すべてのクレジットは彼に属します。ありがとう、ルーカス。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow