Posted at
XamarinDay 7

新しくなったObjective SharpieでCocoaPodsのバインディングライブラリを作る

More than 3 years have passed since last update.

Xamarin.iOS で Cocoa バインディングライブラリを作る際、Objective Sharpieというツールを使いますが、このツールは対象となるライブラリのヘッダファイルを自分で読み込ませた上で、Xcodeを使って.aをビルドして…等、各種ツールを使った手間がありました。

Objective Sharpieを使いたいパターンというのは、多くの場合は CocoaPods を使うときでしょう。CocoaPods には様々なライブラリが揃っており、特に UI 周りのライブラリは Xamarin を使った開発でも Xcode を使った開発同様にとても有用です。

11月にリリースされた、Objective Sharpie 3.0 には CocoaPods のネイティブバインディングを簡単に生成する機能が追加されました。これを使ってバインディングライブラリを作成する方法を紹介します。

Objective Sharpie のダウンロード

Objective Sharpie は Xamarin のドキュメントページ からダウンロードできます。

ただし、すでに Objective Sharpie をダウンロードしたことのある方は、sharpie updateを実行するだけで更新することができます。

Objective Sharpie を使った CocoaPods バインディング

まず、CocoaPodsCocoaControlsで使いたいライブラリの名前を探しましょう。今回は MBProgressHUD をバインディングしてみます。


$ mkdir MBProgressHUD

$ cd MBProgressHUD

使用できるSDK を確認します。だいたいの場合は最新の iphoneos を使えば良いでしょう。

$ sharpie xcode -sdks

sdk: appletvos9.0 arch: arm64
sdk: iphoneos9.1 arch: arm64 armv7
sdk: iphoneos9.0 arch: arm64 armv7
sdk: iphoneos8.4 arch: arm64 armv7
sdk: macosx10.11 arch: x86_64 i386
sdk: macosx10.10 arch: x86_64 i386
sdk: watchos2.0 arch: armv7

では、ライブラリのプロジェクトを生成します。sharpie pod initを使います。最初は CocoaPods のマスターリポジトリを取得するため時間がかかります。

$ sharpie pod init iphoneos9.1 MBProgressHUD

** Setting up CocoaPods master repo ...
(this may take a while the first time)
Setting up CocoaPods master repo
-- このあたりに Master repo の取得状態が出る --
Setup completed
** Searching for requested CocoaPods ...
** Working directory:
** - Writing Podfile ...
** - Installing CocoaPods ...
** (running `pod install --no-integrate --no-repo-update`)
Analyzing dependencies
Downloading dependencies
Installing MBProgressHUD (0.9.1)
Generating Pods project
Sending stats
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
** 🍻 Success! You can now use other `sharpie pod` commands.

Podfile と Pods ディレクトリができます。

もし、Deployment Target を下げたライブラリが必要であれば、ここで、Pods/Pods.xcodeproj を開き、Deployment Target を下げておきます。

Deployment Targets を下げるなど、ビルドの準備ができたらsharpie pod bindコマンドを実行します。

$ sharpie pod bind

User defaults from command line:
IDEDerivedDataPathOverride = /Users/ito/Working/MBProgressHUD/Pods/sharpie-build


-- 長々と xcodebuild のログが出ます --


Starting project evaluation for target: 'Pods', configuration: 'Release'
Computing dependencies
Target MBProgressHUD (FE2F1D7B9D9FCEA148517E4657B243F4):
Phase PBXSourcesBuildPhase
Phase PBXFrameworksBuildPhase
Phase PBXHeadersBuildPhase
Target Pods (CA6B6247C232863826EA479E552E6B28):
Phase PBXSourcesBuildPhase
Phase PBXFrameworksBuildPhase
Parsing 1 header files...

[write] ApiDefinitions.cs
[write] StructsAndEnums.cs

Binding Analysis:
Automated binding is complete, but there are a few APIs which have been flagged with [Verify] attributes. While the entire binding should be audited for best API design practices, look more closely at APIs with the following Verify attribute

StronglyTypedNSArray (1 instance):
A native NSArray* was bound as NSObject[]. It might be possible to more strongly type the array in the binding based on expectations set through API documentation (e.g. comments in the header file) or by examining the array contents through
testing. For example, an NSArray* containing only NSNumber* instances can be bound as NSNumber[] instead of NSObject[].

Once you have verified a Verify attribute, you should remove it from the binding source code. The presence of Verify attributes intentionally cause build failures.

For more information about the Verify attribute hints above, consult the Objective Sharpie documentation by running 'sharpie docs' or visiting the following URL:

Submitting usage data to Xamarin...
Submitted - thank you for helping to improve Objective Sharpie!


ビルドした結果、build/Release-iphoneos/lib*.a に必要なファイルが作られます。また、Objective Sharpieの定義変換結果もあわせて出力されます。あとはこれらのファイルを使ってバインディングライブラリプロジェクトを用意すれば OK です。

ここまでやってくれるんだったら、csprojの生成までやってくれたらよかったのに!としか思えないのですが、これだけでもバインディングの手間がかなり省けると思います。Xamarin.iOS 開発のお供にぜひ活用してみてください。