Xamarin 日本語情報

Xamarin(ザマリン) の代理店だったエクセルソフト田淵のブログです。主に Xamarin に関するエントリーをアップしていきます。(なるべく正しい有益な情報を掲載していきたいと考えていますが、このブログのエントリーは所属組織の公式見解ではありませんのでご注意ください)

Xamarin バッドノウハウの解説

こんにちは。エクセルソフトの田淵です。

の解説です。

はじめに

盛大に Xamarin を dis っていますが、私は Xamarin が大好きです。確かに不安定ですしバグも多いですが、そのバグを潰してくださるアーリーアダプターの方がいなければ、安定したプロダクトにはなりません。今、既に、そしてこれから Xamarin を触ってくださる方に最大級の感謝を送りつつ、各バッドノウハウの詳細を解説していきます。

また、バッドノウハウということで脅しに掛かっていますが、Xamarin を使っている方々は凄い方ばかりなので、触ってみて困ったら Twitter で #JXUG と #Xamarin のタグを付けてツイートしていただくと誰かが拾って回答してくれます。また、facebook のグループ に投げてもらうのもよいですし、teratail も良いでしょう。みんなで助け合ってより良いものにしていきましょう(^^)

Xamarin の理解・心がけ編

インストールは大変なのですが、以下のエントリーも併せてご覧ください。

www.nuits.jp

ytabuchi.hatenablog.com

blogs.msdn.microsoft.com

Xamarin って C#er であれば誰でも簡単にスマホ アプリが作れる魔法のツールなんでしょ?

どのクロスプラットフォーム開発ツールも銀の弾丸ではありません。が、Xamarin は iOS/Android ネイティブの API を活用する「薄いラッパー」を提供するという点で iOS/Android ネイティブに近い、良い位置にいると考えます。

Xamarin の開発をする上で大事なことって何だと思う?

現時点でバグが多いのは、リリースされて3年ほどの Xamarin.Forms です。これは、Microsoft によりどんどん洗練されていくと思われます。Xamarin ネイティブ(Xamarin.iOS, Xamarin.Android の事で UI を別々に作る手法)は 5,6年経っており、かつ、iOS/AndroidAPI をそのまま C# に移植しているだけですので非常に安定しています。

Xamarin.Forms ってどうなの?

前述したように、現時点ではバギーな点も多いです。困ったら GitHub のソース を見てやれ!という方の方が向いています。

日本語ドキュメントが少なくて辛いんだけど?*

英語のドキュメント はものすごく充実しています。英語でも読んでやろうという気概のある方の方が向いています。

プロジェクト設定・ビルド編

インストール大変じゃない?

Windows の方は Windows で Xamarin 開発をしたい方はインストールする前に読んでほしい - Xamarin 日本語情報 を。Mac の方は Mac で Xamarin 使ってみた!インストール〜実行まで【完全無料】[Getting Started Xamarin on Mac] – ちょ窓帳 をご覧ください。

Androidデバッグには何を使えばいいの?

実機が一番良いです。センサーもすべて使えるし。実機がない方は、Android 標準の x86 エミュレーターを使いましょう。こちらも便利です。(間違っても ARM のエミュレーターは使ってはいけません)

どのテンプレートで何が出来るのか良く分からん

[Visual C#>Cross-Platform]の[Blank App (Native Portable)]が Xamarin ネイティブのプロジェクト、[Blank App (Xamarin.Forms Portable)]が Xamarin.Forms のプロジェクトです。

f:id:ytabuchi:20160911224407p:plain:w450

Xamarin.Forms のプロジェクト作るの凄い時間が かかるんだけど?

作成時に、NuGet から Xamarin.Forms のライブラリや Xamarin.Android.Support.v4 などのライブラリをダウンロードするためにどうしても時間が掛かります。1分くらいです。

これ何?
f:id:ytabuchi:20160911224910p:plain:w450

Xamarin.Forms は標準で iOS/Android/UWP/Windows Store 8.1/Windows Phone 8.1 のプロジェクトを作成しますが、UWP のプロジェクトは、Android のように最低サポートバージョン(Minimum Version)とターゲットサポートバージョン(Target Version)を指定する必要があります。現時点で Windows 10 Anniversary Update SDK (10.0.14393) は未対応のようなので、Target を 10586 にしておくのが良いでしょう。 Anniversary Update (10.0.14393) にも対応したようです!

Xamarin.Forms まだワーニングが出るんだけど?
f:id:ytabuchi:20160911225456p:plain:w450

新規作成時に NuGet からライブラリを取得するため、ビルドするまでライブラリを参照できません。そのため、ワーニングが出ますが、ビルドすれば消えますのでご安心ください。

Xamarin.Forms のバージョンが古くね?
f:id:ytabuchi:20160911225734p:plain:w450

Xamarin.Forms のテンプレートは Xamarin のバージョンアップと共に修正されるため、Xamarin とは別にバージョンアップしていく Xamarin.Forms の最新版は使われません。最新版を使いたい場合は、Visual Studio のソリューションを右クリックして、[ソリューションの NuGet パッケージの管理]から最新にするか、私が用意した カスタムテンプレート を使用してください。

Xamarin.Forms に付属している Android のサポートライブラリーはバージョンアップすべき?

Xamarin.Forms の NuGet サイト の Dependencies の画面写真ですが、依存しているバージョンが固定されていますので、個別にはバージョンアップしないようにしてください。Xamarin.Forms のライブラリをバージョンアップしたり特定のバージョンをインストールしたりすると、その Xamarin.Forms にあったサポートライブラリがインストールされます。
f:id:ytabuchi:20160911230145p:plain:w450

Xamarin.Forms プロジェクトのターゲットって何?

Xamarin.Forms は iOS/Android から参照できる PCL (Portable Class Library) のライブラリです。PCL は Target OS によりプロファイルが決まっています。PCL については Xamarinと、ポータブル・クラス・ライブラリ(PCL) - Build Insider を。どれを使えばいいのか?については Xamarin.Forms の PCL ではどの Profile を選択すべきか? - Xamarin 日本語情報 をご覧ください。

Profile 変えようとしたら何コレ?
f:id:ytabuchi:20160911230509p:plain:w450

PCL プロジェクトを右クリックして[プロパティ]を選択すると、PCL の Target OS を変更できますが、Xamarin.Forms ライブラリが参照されていると変更できません。これは、NuGet ライブラリに各プロファイル用の dll が含まれており、一度参照された dll を削除=ライブラリをプロジェクトから削除 しないと別のプロファイル用の dll をインポートできないためです。今後、.NET Standard に対応したライブラリが増えればこの設定は不要になるはずです。
f:id:ytabuchi:20160911230608p:plain:w450

Xamarin.Forms の Android プロジェクトのビルド に凄い時間がかかるんだけど?

Xamarin.Forms に限らず、Android のサポートライブラリを使用したプロジェクトをビルドすると、Android Java 用のライブラリの実体をキャッシュフォルダ %LOCALAPPDATA%\Xamarin にダウンロードします。Android のレポジトリがそれほど高速ではないため、ダウンロードが終了するまでお待ちください。キャッシュフォルダをエクスプローラーで開いておくと、少しずつダウンロードされていくのが分かります。
f:id:ytabuchi:20160911231107p:plain:w450

No resource found that matches the given name というエラーが出た

Xamarin.Android では、Android Java でも使用する Android SDKC# でラップして使用します。Xamarin.Forms では、Support Library v4 の Material Design 機能など様々な機能を使用するため、Android SDK の 6.0, 5.1, 5.0, 4.4, 4.1, 4.0 はインストールしておくことを強くお勧めします。

Resource.Designer.cs に No resource found っ てエラーが鬼のように出た

Resource.Designer.csVisual Studio が自動生成する Android の Resource を管理するファイルなのですが、Android の Target SDK を変更すると、その SDK で使用する Resource が自動的に登録されます。その後、例えば Android の Target SDK を下げると、本来は Resource.Desinger.cs からそれらの Resource が削除されるはずなのですが、削除されずに残ってしまうことがあります。この場合は、手動で Resource.Desinger.csのエラーになっている Resource を削除するか、プロジェクトを作り直すしかありません。(過去4回位発生しましたが、ライブラリをあまり入れ替えたりしなくなったので現在は見てません。直ってる可能性大です。)

Android プロジェクトをビルドするとめっちゃ文字 化けするんだけど!
f:id:ytabuchi:20160911232003p:plain:w450

Xamarin の開発では、Android SDK は最新版を使用することを推奨します。が、Xamarin が対応するまでは、Android SDK Build Tools を最新にしてしまうと対応していないためエラーが出ます。Xamarin が Stable で対応したら、最新の Build Tools をインストールするようにしてください。

Android アプリで配置エラーが出たよ…

様々な原因で発生するエラーですが、原因として多いのはエミュレーターが起動するのに時間が掛かっていて、配置プロセスがタイムアウトになるケースです。エミュレーターが起動した後で、再度デバッグビルドまたは配置を行ってみてください。

ビルドに失敗するようになったらどうすれば良い? Unzipping failed ってなに?

Xamarin.Android の初回ビルドを途中で終了してしまった場合は、%LOCALAPPDATA%\Xamarin の zips が中途半端な状態になり、再ビルドで zip が壊れているため展開できず、エラーが出ることがあります。まずはすべてのプロジェクトの bin obj を消すことを試していただき、それでも直らない場合は %LOCALAPPDATA%¥Xamarin のライブラリフォルダと zips フォルダを削除して再ビルドをお試しください。

Surface Pro 4Visual Studio Emulator for Android に配置できない><

Intel のコードネーム「Skylake」の CPU を搭載したマシンで Hyper-V を使用した Visual Studio Emulator for Android に配置できないエラーが報告されています。画像の部分のチェックを付けることで解決します。
f:id:ytabuchi:20160911232722p:plain:w450

デバッグビルドが途中で終わるんだけど…

これは私の Nexus 5 で発生していたのですが、デバッグビルドするとなぜか SD カードにインストールされて、デバッグできないことがありました。Android のアプリ一覧のメニューでビルドしたアプリが SD カードのアイコンになっていたらアンインストールして再度デバッグビルドすると解決することが多いです。
f:id:ytabuchi:20160911232902p:plain:w300

Android の Layout.axml が開けないんだけど?

Layout の axml を開くと、「Android SDK 23 is required」のようなエラーが出ることがあります。素直に指示にしたがい、SDK をインストールしてください。

UWP ビルド出来ない…><
f:id:ytabuchi:20160911233146p:plain:w450

Xamarin.Forms のソリューションでは、初期のプラットフォームが「Any CPU」になっていますが、UWP アプリは Any CPU に対応していません。x86 にするか チェックを付けると良いでしょう。
f:id:ytabuchi:20160911233129p:plain:w450

Material Design を設定したのにステータスバーが黒いんだけど?

Xamarin は Android 5.0 でサポートされた Material Design に対応しています。Android Java の開発と同じく values-v21styles.xml を用意して「colorPrimary」「colorPrimaryDark」「colorAccent」などを指定します。ただ、この設定が適用されるのは、Android プロジェクトのプロパティ(AndroidManifest.xml と同義)で、Target Android Version を 5.0 以上に設定した時だけです。
f:id:ytabuchi:20160911233541p:plain:w450

Mac Remote Agent がすぐ切れるよ…

Visual StudioiOS 開発をするには Mac を別に用意して、MacSSH で接続する機能、Mac Remote Agent を使用します。この Agent は、Mac 側の省電力機能がオンになり、ネットワークを切断すると当然切れて、再接続が必要になり、ちょっとストレスです。Mac 側はワイヤレスではなく、有線でネットワークに接続し、ディスプレイをオンのままにすると、接続が切れにくいそうです。

Storyboard が開けないんだけど…

Visual Studio で Storyboard を編集するには、Mac と接続している必要があります。Remote Agent が切断されていないか?Mac にインストールした Xamarin.iOS のバージョンと、Visual Studio にインストールした Xamarin.iOS のバージョンが同じか?Xcode は最新になっているか?などを確認してください。

iOS Simulator を Mac で確認するの面倒なんだけど?

Visual StudioiOS アプリをビルドすると、Mac の画面で Simulator が立ち上がり、デバッグができます。が、Mac が手元にあれば良いですが、少し遠かった場合、毎回 iOS Simulator の画面や Mac に接続した実機の画面を見に行くのは手間ですよね。iOS Simulator for Windows という便利なツールがあるので活用しましょう。

iOS アプリのビルド時間、長くない?

iOS アプリは、最初に Visual Studio で exe/app をビルドし、その後 MacXcode に転送してプロビジョニングプロファイルで署名して ipa を作成するため、それなりに時間が掛かります。

開発編

Visual Studio と Xamarin Studio で相互運用すると .csproj がゴリっと書き換わったりすることがあるみたいよ。

ライブラリを追加したり、プロジェクトの設定を変更するのは VS、XS のどちらかに統一しましょう。

Xamarin.Forms の Slider は Max を先に指定し ないと落ちるみたい…

すみません!私のスライドに書いてたの逆でした。Max が先。が正しいです。 @kurosawa0626スライド をご覧ください。

以下は @omanuke さんからの情報です。原文は こちら をご覧ください。解説エントリーも書いてくださいました!こちら

  • Xamarin.Forms で PushModalAsync 表示をし たときに、Navigation.ModalStack.Count の値が iOSAndroidで違うんだって。
  • Xamarin.Forms の Device.BeginInvokeOnMainThread は、 Android ではそのまま実行されるけど iOS はポストされてから実行されるので挙動が変わるんだって。
  • Xamarin.Forms の TapGestureRecognizer の 判定範囲が Android 側で広すぎて、スワイプとかぶっておかしくなるらしいよ。
  • Xamarin.Forms の PanGestureRecognizer は iOSAndroid でイベントが発火したり発火しな かったりするんだって。
  • Xamarin.Forms で InputTransparent=false にし ても iOSAndroid で下のコントロールにイベントを透過できないことがあるらしいよ。
  • Xamarin.Forms の Picker は Bindable じゃないんですよね。
  • Android の View は Mono 側で GC してもしば らく Java 側から握られてたりしてメモリから消えるまでに時間が掛かるんだって。メモリリークじゃないらしいよ。
  • iOSデバッグできる端末と launch failed でデ バッグできない端末が未だにあるんだって。

基本的に凝ったことをやろうとして壁に当たった時は、Custom Renderer で iOS/Android ネイティブのコントロールを独自に参照することになります。

ListView については @qwerty2501 さんからの情報です。原文とワークアラウンドこちら です。

  • Xamarin.Forms の ListView はメモリリークするん だって…
  • Xamarin.Forms の UWP 版 ListView だと仮想化が有効にならないんだって。

StackLayout は手軽なのですが、XXXandExpand が表示されてからそれぞれの大きさを計算するので、描画コストが高めです。Grid を使うのが良いです。

Xamarin 気になった方は

是非 ダウンロード して触ってみてください。Visual Studio 2015 をご利用の方は Update 3 にアップデートする際にカスタムインストールで Xamarin を追加しましょう。 学習用リソースJXUG リンクページ に参考資料を纏めてますので併せてどうぞ。

Xamarin の導入支援サービスを始めました。ベースは基本的なアプリを一緒に作ることで Xamarin を使えるようになって頂く内容ですが、ご要望に応じて講習内容のカスタマイズも可能です。詳しくは田淵までお問い合わせください(^^)

ytabuchi.hatenablog.com

Xamarin の情報が欲しい方はこのブログも購読いただいたり、私のTwitterアカウントをフォローいただいたりすると嬉しいです。

私が所属している エクセルソフト の宣伝を少しさせてください。弊社は開発者向けの様々なソフトウェアを扱っています。おなじみの ReSharper (JetBrains)、 や Atlassian の JIRA, Confluence、Office/PDF ファイルを .NET/Java で操作するライブラリ Aspose(アスポーズ)Windows アプリ、Web ページ、iOS/Android アプリの UI テストができる TestComplete などお勧めです(^^) また、Visual Studio Professional/Enterprise with MSDN も販売してますし、日本で売っていない海外のソフトウェア、開発ツールなどを弊社経由で日本円で購入頂くことも可能です。ご興味あれば 弊社ページ を覗いてみてください。

以上です。

エクセルソフト | ダウンロード | 学習用リソース | JXUG リンクページ | ブログ購読