酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Xamarin.iOSでiOSバインディングプロジェクト(Unified API)を作成するとビルドエラーが発生する

XamarinではBeta channelを使用していて、最新バージョンまでアップデートしています。

Xamarin.iOSを使ってアプリを書いているのですが、とある広告SDKを組み込もうと思った時にビルドエラーが発生してしまうことが分かりました。

.aファイルをインポートした際に発生するということではなく、Unified APIのiOSバインディングプロジェクト(iOS Binding Project)を作成した直後の状態で、何もしていないのにビルドエラーが発生してしまいます

以下のようなビルドエラーが発生します。

Error: /Users/ch3cooh/hoge/example.csproj: /Users/ch3cooh/hoge/example.csproj could not import "$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.ObjCBinding.CSharp.targets" (example)

example.csprojファイルを開くと、確かにImportタグにXamarin.iOS.ObjCBinding.CSharp.targetsが指定されており、参照しようとしていることがわかりました。

<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.ObjCBinding.CSharp.targets" />

当然ですが、iOSバインディングプロジェクト(Classic API)の方では、きちんとビルドが通ります。Importタグは下記のようにパスが違っていることがわかりました。

<Import Project="$(MSBuildExtensionsPath)\Xamarin\Xamarin.ObjcBinding.CSharp.targets" />

このことからXamarin Studioで生成されたiOSバインディングプロジェクト(Unified API)のテンプレートの参照先がおかしいということはすぐに分かったのですが、どうやって解決すればよいのかで悩み込んでしまいました。

解決策

Xamarinの公式サイトを見ても何も書かれていない(と思う)ので、試行錯誤しながら解決策を見つけました。とりあえず、これでアプリからiOSのネイティブライブラリを参照できることがわかったので、この修正で問題ないか田淵さんXamarin.iOSに詳しい方に聞いてみたいですね……。

以下、ビルドエラーの解決策です。

まずは、iOSバインディングプロジェクトのxxxx.csprojをエディタで開きます。TargetFrameworkIdentifierタグを追加します。

  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>

    〜〜〜〜省略〜〜〜〜〜

    <TargetFrameworkIdentifier>Xamarin.iOS</TargetFrameworkIdentifier>
  </PropertyGroup>

元々存在しているImportタグのパスをClassic APIのと同じにします。

  <Import Project="$(MSBuildExtensionsPath)\Xamarin\Xamarin.ObjcBinding.CSharp.targets" />

関連記事

Xamarin.iOSを使ってアプリ開発する際に逆引きとしてお使いください。