4

アプリ内支払いを許可する目的で、MasterCard が提供する iOS フレームワーク ライブラリ (zipはこちらから入手可能) 用の Xamarin iOS バインディング プロジェクトを作成しようとしています。現在、iPhoneOS プラットフォーム用に提供されているフレームワーク ( MasterpassKit_v1_32_build_11\iPhoneOS\MasterPassKit.framework) をバインドしようとしていることに注意してください。

「iOS Objective-C ライブラリのバインド」のチュートリアルに従ってみましたが、現在、Objective Sharpie を使用した ApiDefinition ファイルの生成に固執しています。

まず、iOS フレームワークが有効であることを確認するために、2 つのネイティブ iOS テスト アプリケーション (Objective-C + Swift) を作成し、フレームワークを正常に埋め込んで使用することができました。

次に、次のコマンドを使用してObjective Sharpieを実行しようとしました(MasterPassKit.frameworkディレクトリ ieを含むディレクトリにいる間\MasterpassKit_v1_32_build_11\iPhoneOS\):

  1. -framework 引数を使用してみましたが、ファイルが生成されませんでした。

    指示:

    sharpie bind -framework MasterPassKit.framework -sdk iphoneos12.1
    

    出力:

    1 個のヘッダー ファイルを解析しています... /private/var/folders/hq/z29y24gs1_g_5qvp02vr07dh0000gq/T/com.xamarin.ObjectiveSharpie/c3f67365a4014cc0a4618aa6e0caaa87.h:1: からインクルードされたファイル:1: インクルードされたファイルfrom ./MasterPassKit.framework/Headers/MasterPassKit.h:21: ./MasterPassKit.framework/Headers/MPPresentationController.h:13:1: 警告: 'assign'、'retain'、または 'copy' 属性が指定されていません - 「割り当て」が想定されます [-Wobjc-property-no-attribute] @property UIView *dimmingView; ^ ./MasterPassKit.framework/Headers/MPPresentationController.h:13:1: 警告: デフォルトのプロパティ属性 'assign' は非 GC オブジェクトには適していません [-Wobjc-property-no-attribute]

    バインド中... 2 つの警告が生成されました。バインドできる型が解析されませんでした

    終わり。エラー コード 1 で終了します。


  1. 次に、明示的なフレームワーク オプションを使用してみました (スコープはフレームワーク ヘッダー フォルダーに指定されています)。これにより、いくつかのグローバル定数のみが定義された非常に小さな ApiDefinition.cs ファイルが作成され、実際の Objective-C クラスの定義はありませんでした。

    指示:

    sharpie bind -output bindingscoped -sdk iphoneos12.1 -scope MasterPassKit.framework/Headers
    

    MasterPassKit.framework/Headers/MasterPassKit.h -c -F .

    出力:

    1 つのヘッダー ファイルを解析しています... /Users/development/Desktop/iOS/MasterpassKit_v1_32_build_11/iPhoneOS/MasterPassKit.framework/Headers/MasterPassKit.h:21 から含まれるファイル: ./MasterPassKit.framework/Headers/MPPresentationController.h:13: 1: 警告: 'assign'、'retain'、または 'copy' 属性が指定されていません - 'assign' が想定されています [-Wobjc-property-no-attribute] @property UIView *dimmingView; ^ ./MasterPassKit.framework/Headers/MPPresentationController.h:13:1: 警告: デフォルトのプロパティ属性 'assign' は非 GC オブジェクトには適していません [-Wobjc-property-no-attribute]

    バインディング... [書き込み] ApiDefinitions.cs

    バインディング分析: 自動バインディングは完了しましたが、[Verify] 属性でフラグが立てられた API がいくつかあります。API 設計のベスト プラクティスのためにバインディング全体を監査する必要がありますが、次の Verify 属性のヒントを使用して API を詳しく調べてください。

    ConstantsInterfaceAssociation (1 インスタンス): extern 変数宣言がどの Objective-C インターフェイスに関連付けられているかを判断する確実な方法はありません。これらのインスタンスは、部分的なインターフェイスの [Field] プロパティとして近くの具体的なインターフェイスにバインドされ、より直感的な API を生成し、「定数」インターフェイスを完全に排除する可能性があります。

    Verify 属性を検証したら、それをバインディング ソース コードから削除する必要があります。Verify 属性が存在すると、意図的にビルドが失敗します。上記の Verify 属性ヒントの詳細については、「sharpie docs」を実行するか、次の URL にアクセスして、Objective Sharpie ドキュメントを参照してください: http://xmn.io/sharpie-docs

    2 つの警告が生成されました。

    終わり。


  1. 以前と同様の明示的なフレームワーク コマンドを使用してみましたが、-scope 引数を省略しました。これにより、大量の ApiDefinition.cs および StructsAndEnums.cs ファイルが作成され、ほとんどが参照されているフレームワーク定義であると思われるファイルが含まれています (ターゲット フレームワークのヘッダー フォルダーにスコープが設定されていないため)。これには、作業に非常に時間がかかるコア フレームワークの多数の検証ステートメントも含まれています。

    指示:

    sharpie bind -output bindingnoscoped -sdk iphoneos12.1 MasterPassKit.framework/Headers/MasterPassKit.h -c -F .
    

    出力:

    1 つのヘッダー ファイルを解析しています... /Users/development/Desktop/iOS/MasterpassKit_v1_32_build_11/iPhoneOS/MasterPassKit.framework/Headers/MasterPassKit.h:21 から含まれるファイル: ./MasterPassKit.framework/Headers/MPPresentationController.h:13: 1: 警告: 'assign'、'retain'、または 'copy' 属性が指定されていません - 'assign' が想定されています [-Wobjc-property-no-attribute] @property UIView *dimmingView; ^ ./MasterPassKit.framework/Headers/MPPresentationController.h:13:1: 警告: デフォルトのプロパティ属性 'assign' は非 GC オブジェクトには適していません [-Wobjc-property-no-attribute]

    バインディング... [書き込み] ApiDefinitions.cs [書き込み] StructsAndEnums.cs

    バインディング分析: 自動バインディングは完了しましたが、[Verify] 属性でフラグが立てられた API がいくつかあります。API 設計のベスト プラクティスのためにバインディング全体を監査する必要がありますが、次の Verify 属性のヒントを使用して API を詳しく調べてください。

    ConstantsInterfaceAssociation (201 個のインスタンス): extern 変数宣言がどの Objective-C インターフェイスに関連付けられているかを判断する確実な方法はありません。これらのインスタンスは、部分的なインターフェイスの [Field] プロパティとして近くの具体的なインターフェイスにバインドされ、より直感的な API を生成し、「定数」インターフェイスを完全に排除する可能性があります。

    MethodToProperty (192 インスタンス): Objective-C メソッドは、パラメーターをとらず、値を返す (非 void リターン) などの規則により、C# プロパティとしてバインドされました。多くの場合、これらのようなメソッドは、より適切な API を表示するためにプロパティとしてバインドする必要がありますが、誤検知が発生する場合があり、バインディングは実際にはメソッドである必要があります。

    StronglyTypedNSArray (42 インスタンス): ネイティブ NSArray* が NSObject[] としてバインドされました。API ドキュメント (ヘッダー ファイル内のコメントなど) を通じて設定された期待に基づいて、またはテストを通じて配列の内容を調べることによって、バインド内の配列をより厳密に型指定できる場合があります。たとえば、NSNumber* インスタンスのみを含む NSArray* は、NSObject[] ではなく NSNumber[] としてバインドできます。

    PlatformInvoke (3251 インスタンス): 一般に、P/Invoke バインディングは、Objective-C バインディングほど正確でも完全でもありません (少なくとも現在)。ターゲット プラットフォームの C 呼び出し規則に準拠するために、ライブラリ名 (デフォルトは '__Internal') と戻り値/パラメーターの型を手動で修正する必要がある場合があります。バインディングで C API を公開したくない場合もありますが、公開する場合は、定義をより適切なクラスに再配置し、より強力なタイプ セーフ ラッパーを公開することも必要になるでしょう。P/Invoke のガイダンスについては、http://www.mono-project.com/docs/advanced/pinvoke/ を参照してください

    InferredFromMemberPrefix (29 インスタンス): この元々匿名の宣言の名前は、そのメンバーの共通のプレフィックスから取得されました。

    Verify 属性を検証したら、それをバインディング ソース コードから削除する必要があります。Verify 属性が存在すると、意図的にビルドが失敗します。上記の Verify 属性ヒントの詳細については、「sharpie docs」を実行するか、次の URL にアクセスして、Objective Sharpie ドキュメントを参照してください: http://xmn.io/sharpie-docs

    2 つの警告が生成されました。

    終わり。


間違ったことをしている場合はお知らせください。

どんな助けでも大歓迎です!

アップデート

それで、私は最終的にそれを機能させました。最初にアンブレラ ヘッダーのインポート参照をフラット化する必要があり、次に次のコマンドを実行して、有効な ApiDefinition および Struct ファイルを生成しました。

sharpie bind Headers/MasterPassKit.h -output MasterPassBindings -namespace MasterPassBindings -sdk iphoneos12.1 -scope Headers Headers/MasterPassKit.h -c -IHeaders -arch arm64
4

0 に答える 0