一个使用Xamarin进行开发的项目。以下是选择Xamarin的原因:
不要听信那些贬低Xamarin Forms的声音。一开始,团队遵循了那些认为Xamarin Forms只适合用于设置页面的谣言,从MvvmCross和Interface Builder故事板开始。但随着构建的Xamarin Forms页面越来越多,越来越喜欢它。最终回去,将每一个特定平台的UI页面都替换为了跨平台的Xamarin Forms版本,它能够渲染完全原生的控件。双向数据绑定、对MVVM设计模式的原生支持,以及对来说易于理解的XAML,都是锦上添花。虽然它并不完美,偶尔会遇到一些控件无法提供想要的UI定制的问题。但一旦掌握了自定义渲染器,几乎可以完成任何UI上的事情。动画、完全自定义的页面和动态渲染的控件,一旦掌握了这些,都是相当可行的。有了Xamarin Forms,应用程序获得了完全原生的外观和感觉,同时实现了76.3%的代码重用率(其中大部分是重要的代码),加上一个如果抽象失败的简单出路。太棒了。
不是所想的那样。在iOS和Android之间共享代码是显而易见的。使用了可移植类库在iOS和Android以及服务器端Web应用程序之间共享代码。首先,共享模型是巨大的。这使得强类型json序列化/反序列化变得轻而易举。但随着进入状态,开始共享枚举值、Entity Framework ORM和服务器端数据库、跨平台模型、SQLite数据库和移动代码。然后开始共享实用程序方法、验证,甚至像密码学这样的杂项代码。是的,Xamarin那些疯狂的聪明人甚至将.NET框架的密码学库移植到了iOS和Android上,从而允许在任何地方使用完全相同的逻辑进行加密/解密,这有多酷!虽然使用了TypeScript作为Web前端,但想一个人可以通过使用Script Sharp将代码共享扩展到绝对任何地方。那将是相当疯狂的。
C#是一个梦想。可能有偏见,但对来说,这门语言是绝对美丽的。有表达式树,这是在任何其他语言中都没见过的特性。还有LINQ是惊人的。但async/await是最好吃的蛋糕。这是见过的释放移动或桌面应用程序UI线程或释放Web服务器线程以处理其他请求的最漂亮的技术,同时保持代码可读性。Async/await可以说是值得Xamarin入门费的。C# var animation1 = AnimateLayout(CategoryAttributes); var animation2 = AnimateLayout(TemplateAttributes); await Task.WhenAll(animation1, animation2); // UI线程是免费的。免费的!免费的!!! DoStuffAfterAnimations(); // <- *UI线程*在这里捡起来,所有的^ & // 当它完成其他UIish的东西! "await Task.WhenAll()"?让心跳静止。有些相关的是使用Visual Studio加上ReSharper来构建iOS和Android应用程序。唯一的犹豫是,从在PC上按下F5到在Mac模拟器或iOS设备上调试(注意,有断点和东西)的时间大约是10秒。对来说,这个伟大的IDE设置的优点超过了这些缺点,但无疑许多人会更喜欢Xamarin Studio(或者显然一个基于Cordova/PhoneGap的解决方案,它的超快速开发反馈周期)。但这里最大的胜利是,团队有大量的C#经验,最小的JavaScript经验,没有Objective-C经验。Xamarin对情况来说是一记扣篮。
互操作对Xamarin来说并不完全容易,但它是可行的,对于一个跨平台解决方案来说,这是一个区别。正如将描述的,知道它是可能的也很重要,这样如果(当)Xamarin的抽象失败了,可以停止诅咒框架,继续生活。最初需要互操作的主要原因是对一个昂贵的物理RFID阅读器硬件设备的要求(这是一个技术术语),它有自己的专有蓝牙协议和一组库。如果它是一个C库,可以使用正常的P/Invoke语义来调用。然而,由于它是一个Objective-C API,需要一个iOS绑定项目。基本上,定义了一堆带有属性的C#接口,这些属性告诉Xamarin如何映射到Objective C API。在编译时,Xamarin代码生成了一个实现来调用API。虽然Xamarin的Objective Sharpie通过构建所需的许多接口节省了一些时间,但它仍然是一个相当手动的过程。基本上Objective-C协议映射到C#接口很差,需要一些调整。只需要一次互操作,因为Xamarin失败了。需要一个动态的音调生成器,尽管有音频播放能力(甚至MIDI库),无法获得需要的最低级别的音频API(知道,那些当需要访问正弦和余弦之类的东西时)。幸运的是,如果足够绝望,互操作可以解决任何问题。好消息是,只需要一次,而且是一个非常不常见的案例。否则,Xamarin对.NET框架的映射工作得很好,给了所需要的一切。