問題タブ [objective-sharpie]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - パブリッシュ/サブスクライブ メソッドを呼び出すと、NearbyMessages Objective-C から C# へのバインディングが NSInvalidArgumentException をスローするのはなぜですか?
Objective Sharpie を使用して、NearbyMessages cocoapod の libGNSMessages.a バイナリとヘッダーから、Google の Nearby Messages API用の半機能 iOS C# バインディングを生成しました。そのバインド ライブラリを Xamarin.iOS プロジェクトに追加すると、GMSMessage オブジェクトと GMSMessageManager オブジェクトを作成してアクセスできるようになります。ただし、GMSMessageManager.publishWithMessage() を使用しようとすると、正しい引数の型を使用しているにもかかわらず、次の例外が発生します。
AppDelegate.cs の FinishedLaunching メソッド内から使用しているテスト コードを次に示します (チェックしたところ、マネージャーとメッセージは両方ともその型の有効なインスタンスです)。
参照している Visual Studio バインディング プロジェクトの ApiDefinitions.cs からのバインディングを次に示します (コメントは、元の Objective-C ヘッダー ファイルのメソッド シグネチャです)。
そして、例外が発生している GNSMessageManager.g.cs (そのビジュアルスタジオプロジェクトによって生成された) のコードは次のとおりです。
デバッグ モードでは、これらの 3 つの引数すべてが少なくとも非 null であることが示されます。
これは同じ例外です: 'NSConcreteMutableAttributedString initWithString:: nil value' when using Google Nearby Messages . ただし、そのバグは修正されたとされており、Sharpie バインディングの基礎として使用した最新の CocoaPods は、XCode でテスト用の迅速なプロジェクトをビルドすると問題なく動作するため、おそらく私のバインディングが原因です。NearbyMonkeyに含まれている古いバイナリ C# NearbyMessages ライブラリも使用してみましたが、現在の iOS バージョンではクラッシュします。
ここまで読んでいただきありがとうございます。あなたが提供できる助けや提案は、非常に高く評価されます。
objective-c - ネイティブ Obj-C ライブラリを Xamarin.iOS プロジェクトにバインドする際の問題
XCode で作成したネイティブの Obj-C 静的ライブラリを Xamarin.iOS プロジェクトにバインドしようとすると、問題が発生します。Fat Binary を作成するために必要な手順を実行しました。x86 と ARM の両方のアーキテクチャを作成しましたが、ラッパー クラス内にネイティブの Obj-C クラスが見つからないというエラーがスローされます。次のコマンド「nm -arch」を使用して腕のシンボル テーブルを確認すると、シンボル テーブルが空でした。
objective-c - Objective Sharpie を使用した MasterCard iOS フレームワークのバインド
アプリ内支払いを許可する目的で、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\
):
-framework 引数を使用してみましたが、ファイルが生成されませんでした。
指示:
出力:
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 で終了します。
次に、明示的なフレームワーク オプションを使用してみました (スコープはフレームワーク ヘッダー フォルダーに指定されています)。これにより、いくつかのグローバル定数のみが定義された非常に小さな ApiDefinition.cs ファイルが作成され、実際の Objective-C クラスの定義はありませんでした。
指示:
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 つの警告が生成されました。
終わり。
以前と同様の明示的なフレームワーク コマンドを使用してみましたが、-scope 引数を省略しました。これにより、大量の ApiDefinition.cs および StructsAndEnums.cs ファイルが作成され、ほとんどが参照されているフレームワーク定義であると思われるファイルが含まれています (ターゲット フレームワークのヘッダー フォルダーにスコープが設定されていないため)。これには、作業に非常に時間がかかるコア フレームワークの多数の検証ステートメントも含まれています。
指示:
出力:
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 ファイルを生成しました。