表題の通り、毎回忘れてやってつまづいているのでメモ。

何はともあれ、ネイティブのライブラリを作成します。

XcodeでFrameworkプロジェクトを作成、Swift Fileを追加して以下のようなコードを書きます。

import UIKit

@objc(ClassName)
public class ClassName : NSObject {
  @objc
  public func DoSomething() -> Int {
    return 1
  }
}

ここでの注意としてはNSObjectがベースのクラスでないとXamarin.Formsの方からアクセスできないこと。以前にSwiftUIのコンポーネントをXamarin.Formsから使えないか試したけど、だめでした。 あと公開するメソッドをpublicにして@objcで修飾しておきます。

これをビルドしたら、次はVisual StudioでiOSのバインディングライブラリを作成します。

そしてObjective Sharpie(目標マジックペン?)を使って、C#のコードを作成します。 コマンドは以下の形式。

sharpie bind --output=OutputDir --namespace=csharp_name_space --sdk=iphoneos15.2 -framework ./created.framework

--sdk=のところに何が使えるのかを確認するには以下コマンド。

sharpie xcode -sdks

コマンドを実行して上手くいってるとと --output で指定したディレクトリ以下に ApiDefinitions.cs が出力されているはず。場合によっては Structs.cs みたいなのもある。

出力された .cs ファイルには [Verify] と修飾されているものがあるので、内容を確認して問題なければ [Verify] 属性を削除する。

バインディングライブラリに ApiDefinitions.cs を追加して、ファイルのビルドアクションを ObjcBindingApiDefinition に変更する。( Structs.cs の場合は ObjcBindingCoreSource にする)

あとはビルドが通るように多少修正が必要かもしれない。なんか対応してないコードが吐かれたりすることがあるみたい。


今までに思い出せなくてつまづいたところは

  • sharpieの引数で、framework用のやつとstatic library用のやつを混同してた
  • ファイルのビルドアクションを変更し忘れてた
  • Swiftのコードで @objc つけ忘れてた

というのをやらかしている・・・。