人気のあるMonoTouchおよびMono for Androidプラットフォームのメーカー、XamarinがXamarin.MacでMac App Storeマーケットに参入した。
XamarinはOS X向けのC#バインディングを作ろうと試みた最初のメーカーではない。これまでにも、Cocoa Sharp、Monobjc、NObjectiveといった試みがなされてきた。今回がこれまでと違うのは、これは商用製品であって、サポートが廃止されないようXamarinが出資しているところだ。
あなたは先ほどのリストにMonoMacがないことに気づいたかもしれない。これはXamarin.MacがMonoMacに対する拡張であるためだ。LGPLのライセンス制約を取り除いたことに加え、Xamarin.MacはMonoMacを超えるメリットをいくつか提供する。
特に重要なのは、完全に自己完結なアプリケーションが作れることだ。ユーザは別途Monoをインストールする必要がない。これはMac App Storeの要件であり、他のみんなにとって便利だ。
Xamarin.MacはMonoMacで見落とされていたフレームワークもサポートしている。
- CoreBluetooth
- GameKit
- New MountainLion AppKit APIs
- SceneKit
- StoreKit
Xamarin.Macは現在、MacOS X LionおよびMoutain Lionをターゲットにしている。また、開発者にはXcodeの最新バージョン(現在4.5.2)を使うよう推奨している。
Xamarin.Macは開発者がさまざまなプラットフォームでビジネスロジックを共有できるようにするが、UIに関わるようなものはMac用に書き直す必要がある。Xamarinは、クロスプラットフォームのツールキットを提供するのではなく、ネイティブバインディングを使ってアプリケーションをデバイスにふさわしい見栄えにするよう、開発者を促している。
多くの開発者にとって、これはずっと論点になっていた。“write-once, run-anywhere” 体験を提供する、XAMLベースのUI言語、おそらくSilverlight/Moonlightをベースとするものを好む開発者も多かった。スタイリングとアニメーションが豊富にサポートされているので、たとえプラットフォーム横断で再利用できないとしても、XAMLに関心を持っている人もいる。
Data Dashboardのadamkempは、コードの再利用についてこう語っている。
私はData Dashboard for iPadのリードデベロッパーです。これはアナウンスで言及された最初のケーススタディアプリになります。私たちはこのアプリで、WPF/Silverlight用に書かれたC#コードをかなり再利用しました。UI部分は完全に違うのですが、大きなアプリにはUI以外のコードもたくさんあります。
彼はこう続ける。
WPSとiOSでMVVMを適用するにはどうするのが一番いいのか、私たちはまだ学んでいるところです。(現在のところ、このコードベースではAndroidをサポートしていません)。Data Dashboard自体はiPadしかサポートしていないため、UIコードはすべてiPad固有でした。そのため、このアプリではそれぞれのビューのためにビューコントローラがあるというAppleのMVCパターンをそのまま使いました。このビューコントローラの裏にはクロスプラットフォーム可能なモデルがあります。
私たちはクロスプラットフォームのアプリに取り組み始めているところで、現在の計画では、WPFのMVVMパターンをiOSコードに統合する予定です。ビューモデルクラスはUIViewController(少なくとも理にかなっているところ)から継承する予定で、部分クラスを使ってプラットフォーム固有コードを別のファイルに分離します。
これはつまり、実際には、そもそも正しくMVVMをするわけではないということです。私たちのビューモデルはビューへのリファンレンスを持っており、これは正式なMVVMにはふさわしくありません。もしスクラッチから始められていれば、MVVMをその意図通りに実装することで、プラットフォーム固有コードとプラットフォームにとらわれないコードを、さらに分離しようとしていたでしょう。つまり、ビューモデルはプラットフォームにとらわれなくなり、ビューはプラットフォーム固有になり、ビューがビユーモデルに結合するというように。
私たちはData Dashboardでコマンディングを使いました。今後のアプリでもさらにこれを使うつもりです。しかしながら、WPFと同じように機能させるためには、MonoTouchに独自のコマンディングシステムを実装する必要がありました。Appleがやっているコマンディングは、Objective Cのセレクタとレスポンダチェーンによるものです。私はいくつかのケースでこれら2つのアプローチにあるギャップを埋めようとしましたが、MonoTouchにはそれを困難にする制限がいくつかあります。
「.NETのデスクトップおよびモバイルアプリケーション向けクロスプラットフォームGUIフレームワーク」Etoについて、彼はこう答えた。
ありがとう、でも私たちはクロスプラットフォームGUI APIを使いたくはありません。私たちはネイティブのUI要素を使って各プラットフォーム専用に設計されたUIを作ることで、UIがそのプラットフォームにとって完全にネイティブに見えることを望んでいます。クロスプラットフォームAPIは結局のところ、すべてのプラットフォームに共通な最低限の要素を使ったUIになり、どうやってもしっくりこないと思います。タッチスクリーンはマウスとキーボードとは違います。ですから、タッチ向けのUIはタッチされることを念頭に設計されるべきで、マウスとキーボード向けに設計されたUIを移植すべきではありません。