我计划在iOS,Android和AngularJS网站上创建一个应用程序。
但是,由于不必在每个应用程序上重写业务代码,我希望尽可能多地重用代码。
为了能够在任何平台上执行项目的核心,我必须使用网络语言。
通过不同的文章,我计划了一个共同的架构,将项目的业务逻辑 - 核心 - 与将为每个系统重新实现的UI(UIKit for iOS,AngularJS和Polymer for webapp等)分开。
此架构的目标是尊重重要的软件工程原则,例如information hiding by decomposing requirements in modules,DRY和SOLID
适用于iOS(Android几乎相同):
"核心"的代码将通过虚拟机执行,如本文向我们展示的那样:http://www.skyscanner.net/blogs/developing-mobile-cross-platform-library-part-3-javascript
这里是AngularJS:
现在您已了解架构的所有内容,以下是我的问题。
我没有足够的经验和对网络语言的反馈,无法做出明智的选择。经过一些研究,我发现有各种选择:
达特:
Javascript ES6:如果事件尚未在浏览器中完全实现,则可以开始在Traceur编译器中使用ES6。
感谢您的阅读。
答案 0 :(得分:2)
我知道这不是您列出的选项之一,但不会自动排除C ++。这就是Dropbox使用的例子,他们甚至为此开放了他们的工具:
C ++到Java / Objective-C API生成器:
https://github.com/dropbox/djinni
针对Android / iOS的“原生”应用示例:
有关该主题的有趣文章有更多链接:
http://oleb.net/blog/2014/05/how-dropbox-uses-cplusplus-cross-platform-development/
更新答案:
如果你真的不想使用C ++,并且你可以从非本机获得膨胀,那么你可以尝试以下方法:
https://github.com/MobileChromeApps/mobile-chrome-apps
该项目是Google的Cordova分支,增加了许多新功能和优势。
Chrome API上有一个Dart包装器:
https://github.com/dart-gde/chrome.dart
基本上,您可以使用纯HTML5技术在Dart中编写应用程序,然后在某些情况下使用Chrome API(设备状态等)。然后你可以部署:
答案 1 :(得分:1)
这是一个有趣的话题。以下是我从“GWT.Create”会议中学到的内容,谷歌人员展示了他们如何进行跨平台项目:
首先,图片中的DataStore和Model部分应该在外部服务器上完成,因此它已经跨越了平台。
UI渲染必须以原生方式单独完成,这是最好的解决方案。
他们使用Java实现了共享逻辑(复杂的计算,加密等),对于Android,它可以开箱即用,对于Web,他们使用GWT将Java转换为Javascript,而对于iOS,他们使用J2ObjC,一种新的Google产品。你可以在这里找到它:
https://github.com/google/j2objc
他们还提到了C / Cpp解决方案,这根本不是一个坏主意,Java只是一种高级语言,在大多数情况下都很容易使用。
答案 2 :(得分:1)
如果您想创建跨平台应用程序(iOS / Android / Web),您可以做的最好的事情是在这些平台之间共享尽可能多的代码。你可以使用类似PhoneGap/Cordova之类的东西,但这并不总是让人觉得很原生。事件最好的PhoneGap应用程序感觉不是原生的,因为它不使用本机UI。而是将浏览器嵌入到本机UI容器中。
我建议使用如下项目结构:
核心项目在ios,android和web项目之间共享。您可以使用Java编写核心项目,并使用GWT将此代码转换为Web项目的JavaScript。对于android项目,没有什么可做的,因为Android使用Java。对于您的ios项目,您可以使用J2Objc将核心Java代码转换为Objective-C。
核心项目的内容是什么?
尽可能多地使用接口和抽象基类以及工厂。
对话,提醒和联系人它还处理网络管理和离线同步这一困难的任务,即离线使用应用程序,发送提醒以及发送电子邮件。应用程序可以存储所有这些内容,并在时机成熟时将其发送到Internet。 Source
当然,共享的收件箱有很多元素 跨三个平台:管理网络通信的代码, 缓存对象,本地持久存储,管理用户编辑 本地和远程,并在离线时支持所有。这个逻辑 必须忠实,正确地实施并保持最新状态 三个客户。用三种不同的方式重写三次 语言会吸收大量的工程资源而且速度慢 我们对收件箱的改进速度有多快。
对于iOS,我们开发了现在开源的J2ObjC交叉编译器,将我们的Java数据模型转换为Objective-C,我们再次获得了一个自然的API来构建我们的原生iOS收件箱应用程序(完整的 - [提醒贪睡]) 。精明的读者可能想知道我们如何处理从垃圾收集语言(Java)转换为引用计数(Objective-C)时的阻抗不匹配。通常,J2ObjC依赖于Objective-C自动释放池,因此通常垃圾收集的对象会在池耗尽时释放。这种方法的一个问题是参考周期;在我们的Java数据模型中存在循环的地方,我们使用Java注释来标识@WeakReference。在进行转换时,Objective-C中的相应属性将具有__weak修饰符,从而打破了保留周期。在实践中,我们发现这是一个相对较小的问题,我们进行了自动化测试,标记了新的循环进入对象模型的罕见情况。 Source
核心模块之间的通信可以通过在Android / iOS / GWT上运行的Dagger2来完成。还有一个名为realtime-json的跨平台JSON库。 HTTP传输可以在核心中实现,至少对于Android和iOS。表格GWT / JavaScript你必须在客户端进行。
以下是一些可以帮助您的示例应用: