Xamarin:让C#登陆Mac App Store

流行平台MonoTouch和Mono for Android的制造商Xamarin,已经凭借其Xamarin.Mac进入了Mac App Store市场。

这并不是第一次人们尝试在OS X上绑定C#,以前的Cocoa Sharp、Monobjc和NObjective都做过这方面的工作。Xamarin.Mac的不同之处在于,它是一个商业产品,其背后的Xamarin是一家股份公司,所以该绑定不会半途而废。

你可能会注意到上面的列表中没有MonoMac。这是因为Xamarin.Mac是MonoMac的一个扩展。除了取消LGPL许可限制之外,Xamarin.Mac还提供了一些优于MonoMac的特性。

最重要的是,它能创建完全自包含的(self-contained)应用程序。用户不需要单独安装Mono,这一方面是Mac App Store的要求,一方面也是出于用户使用方便的考虑。

Xamarin.Mac还支持MonoMac所忽略的一些框架。

  • CoreBluetooth
  • GameKit
  • New MountainLoin AppKit APIs
  • SceneKit
  • StoreKit

Xamarin.Mac目前面向Mac OS X Lion和Mountain Lion。Xamarin还建议开发者使用最新版本的Xcode 4.5.2。

尽管Xamarin.Mac允许开发者在不同的平台之间共享业务逻辑,但与UI相关的所有代码都需要为Mac重写。Xamarin不提供跨平台的工具包,而是鼓励开发者使用原生绑定,以确保应用程序在各个设备上显示正确。

很多开发者对此进行了长期地争论,他们希望能有一门基于XAML的UI语言(可以基于Silverlight或Moonlight),提供“一次编写,到处运行”的体验。而对于XAML本身,尽管它不能在不同平台复用,但由于其对样式和动画提供了丰富的支持,有些人也在考虑尝试它。

当被问及代码复用时,Data Dashboard的adamkemp这样说道:

我是Data Dashboard for iPad的主程之一,这个应用是(Xamarin.Mac)发布声明中的第一个学习案例。我们有相当多的代码复用了为WPF/Silverlight编写的C#代码。UI部分可能完全不同,但大型应用中非UI代码还是很多的。

他还说,

我们还在学习如何以最佳的方式跨WPF和iOS这两个平台应用MVVM(该代码库目前不支持Android)。Data Dashboard本身只支持iPad,所以我们的UI代码只针对iPad。对于该应用,我们只是使用了苹果的MVC模式,每一个视图都有一个视图控制器,视图控制器背后的模型是可以跨平台的。

我们现在正在开发一些跨平台的应用,对于这些应用,我们目前的计划是将WPF的MVVM模式集成到iOS代码中来。我们计划让视图模型继承自UIViewController(在可以这样操作的地方),然后使用分部类将平台特定的代码隔离到不同的文件中。

也就是说,我们并没有正确地实现MVVM。我们的视图模型包含对视图的引用,这在MVVM中是不正确的。如果能从头开始,我希望以正确的方式实现MVVM,来更好地隔离平台特定的代码和平台无关的代码。这意味着视图模型可以是平台无关的,而视图是平台特定的。视图与视图模型是绑定的。

我们在Data Dashboard中使用了命令,而且我们会在以后的应用中更多地使用它。但是,为了让命令系统的工作方式与在WPF上的一致,我们实际上是在MonoTouch上做了另一套实现。苹果实现命令的方式是通过ObjectiveC选择器和响应链。有的时候我试着桥接这两种方式,但MonoTouch里面的一些限制使这很难实现。

还有人在帖子里提到了Eto,一个“针对桌面和移动应用程序的.NET跨平台GUI框架”。对此,adamkemp回应道:

谢谢,但我们不想使用跨平台的GUI API。在设计UI时,我们希望专门为特定的平台使用原生的UI元素,这样的UI看上去会有平台原生的感觉。跨平台API只是用所有平台所共有的那小部分特性来生成UI,因此总是感觉不太好。触摸屏与鼠标和键盘是不同的,因此触摸屏的UI应该以触摸的思想来设计,不应该从为键鼠设计的UI上移植。

查看英文原文:Xamarin is Bringing C# to the Mac App Store

感谢杨赛对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至[email protected]。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

你可能感兴趣的:(Xamarin:让C#登陆Mac App Store)