问题:
a)如果我想开发这样的应用程序,哪些东西可以/应该在平台之间共享?(欢迎提供具有可能的类的结构设计)
b)是使用计时器还是AlarmManager更好?
c)什么类型的项目应该为Shared Core Project创建(Portable Class Library / Platform Specific Library / Plain C# Project)?
谢谢提前。
我最近几周一直在专注于如何在Android和iOS之间最好地共享代码,以下是基于我的经验提出的建议:
a) 一般来说,您可以在平台之间共享任何不属于特定平台的内容。
我倾向于使用持有对由接口定义的视图引用的Presenter或Mediator。例如,如果我有一个Login View,我会让我的iOS UIViewController和Android Activity都实现ILoginView接口,该接口将定义以下内容:
Presenter/Mediator将负责侦听提交的登录请求,获取用户名/密码,并将这些内容传递给服务调用或命令。每当Mediator收到命令/服务的结果时,它就要负责调用ShowLoginFailed或GoNextScreen。
我还使用了接口来定义我的SQLite Manager (https://github.com/praeclarum/sqlite-net/tree/master/src) 或者一个代理,它负责进行实际的Web API服务调用。我发现我必须这样做,因为SQLite Manager和RestSharp需要进行某些平台特定的编译。
长话短说,接口是您的朋友,特别是当与某种依赖注入系统结合使用时。
b) 如果您希望在设备处于睡眠模式或者用户在另一个应用中时,通过提醒用户来实现某些功能,则应在Android上使用AlarmManager,在iOS上使用LocalNotification。
c) 您可以在Xamarin.Android和Xamarin.iOS中使用PCLs。问题在于PCLs尚未完全支持。不过,您可以进行一些调整以满足需求:
在 Xamarin Studio 中切换到 Beta 或 Alpha 频道: "Xamarin Studio" -> "Check for Updates" -> 更改弹出对话框左上角下拉列表中的频道 -> 选择 "Restart and Install Updates." 这将使您的 Android 和 iOS 项目能够链接到同一解决方案中相同 PCL。
更新 XS 后,关闭 XS 并按照此帖子中的说明修改您的 Mono 安装,以便 PCL 正确编译:MonoDevelop: is it possible to switch PCL's compiler?
要使代码提示在 PCL 项目内更加流畅,您需要从 Mono 安装中获取 mscorlib.dll,并将其放置在项目目录中的 DLLs 文件夹中,并在 PCL 项目中添加对其的引用。您可以在此处找到 dll:/Library/Frameworks/Mono.framework/Versions/3.0.10/lib/mono/4.0
完成所有这些步骤后,您的 PCL 应该可以正常工作了。我发现这样做是值得额外努力的,因为我现在可以创建一个 Unit Test 项目在 XS 中将其链接到 PCL 并从 IDE 中运行测试。此外,我还可以使用像 Moq 这样的库来模拟我的视图并进行集成测试。
Xamarin 承诺全面的 PCL 支持即将到来,我们将不必再使用这些 hack。
我知道这是一篇旧文章,但现在想要做到这一点的任何人都应该看一下今年早些时候推出的Xamarin.Forms,它是一组真正跨平台的控件,因此您只需创建一个UI即可。
请查看来自 Xamarin 团队的指南以开始: http://docs.xamarin.com/guides/cross-platform/application_fundamentals/building_cross_platform_applications
这是第四部分,解答了您在第 C 部分中提出的问题。 http://docs.xamarin.com/guides/cross-platform/application_fundamentals/building_cross_platform_applications/part_4_-_platform_divergence_abstraction_divergent_implementation
此外,Xamarin Studio 仪表板/主屏幕(?)右侧有两个应用程序可供下载,完全适用于 2-3 个平台,因此您可以查看他们在项目之间共享代码时如何构建应用程序。
他们的网站上还有很多指南和教程,阅读和练习不需要太多时间。