关于跨平台项目中的Web语言互操作性的问题

时间:2015-01-29 19:43:54

标签: android ios architecture cross-platform frontend

我计划在iOS,Android和AngularJS网站上创建一个应用程序。

但是,由于不必在每个应用程序上重写业务代码,我希望尽可能多地重用代码。

为了能够在任何平台上执行项目的核心,我必须使用网络语言。

通过不同的文章,我计划了一个共同的架构,将项目的业务逻辑 - 核心 - 与将为每个系统重新实现的UI(UIKit for iOS,AngularJS和Polymer for webapp等)分开。

此架构的目标是尊重重要的软件工程原则,例如information hiding by decomposing requirements in modulesDRYSOLID

  • 每个功能都将在模块中分解。
  • 核心:业务逻辑代码 - 可在每个平台上重复使用 - 将以库的形式表示。
  • 查看:将在每个不同平台上开发视图类,以使用每个平台上提出的不同UI元素。例如:用于iOS的Objective-C / Swift中的ViewController的子类或用于操作web-app的HTML的简单类。 此课程中没有逻辑。它只对以下内容负责:
    • 处理用户与业务逻辑的交互。
    • 显示业务逻辑中的内容
  • IView :抽象操纵视图的类的接口。
  • 演示者:在交互者和视图之间建立链接以驱动用户界面。
  • 交互者:模块的逻辑,例如算法。
  • 数据存储:通过与数据库或API或网络服务进行通信来管理数据的持久性和提取。
  • 模型:数据以结构形式表示。

适用于iOS(Android几乎相同):

enter image description here

"核心"的代码将通过虚拟机执行,如本文向我们展示的那样:http://www.skyscanner.net/blogs/developing-mobile-cross-platform-library-part-3-javascript

这里是AngularJS:

https://docs.google.com/drawings/d/1NtdDfsr1yiuGOm_lfOY6Qab_kHb4I5b4sx7zeTAqwrE/pub?w=915&h=377


现在您已了解架构的所有内容,以下是我的问题。

我没有足够的经验和对网络语言的反馈,无法做出明智的选择。经过一些研究,我发现有各种选择:

  • 达特

    • 问题1:是否存在允许Objective-C / Swift与Java通过VM实现互操作的机制?我知道两个平台都有VM来执行Javascript代码,而Google提供dart2js来编译Dart到Javascript代码。但它不是简单的Javascript:查看示例here。所以我不知道是否还有正确的互操作性。
  • Javascript ES6:如果事件尚未在浏览器中完全实现,则可以开始在Traceur编译器中使用ES6。

    • 问题2: Traceur和iOS / Android中的VM编译的Javascript是否具有互操作性?
    • 问题3:是否安全"通过Traceur使用ES6开发大型项目并拥有生产代码?

感谢您的阅读。

3 个答案:

答案 0 :(得分:2)

我知道这不是您列出的选项之一,但不会自动排除C ++。这就是Dropbox使用的例子,他们甚至为此开放了他们的工具:

C ++到Java / Objective-C API生成器:

https://github.com/dropbox/djinni

针对Android / iOS的“原生”应用示例:

https://github.com/libmx3/mx3

有关该主题的有趣文章有更多链接:

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(设备状态等)。然后你可以部署:

  • Web:在没有Chrome API功能的情况下编译为JavaScript。
  • Chrome操作系统:使用Chrome API功能编译为JavaScript。
  • Android:编译为JavaScript,然后使用MobileChromeApps创建Android应用。
  • iOS:编译为JavaScript,然后使用MobileChromeApps创建iOS应用程序。

答案 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容器中。

我建议使用如下项目结构:

  • MyApp的核
  • MyApp的-IOS
  • MyApp的-机器人
  • MyApp的幅

核心项目在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你必须在客户端进行。

以下是一些可以帮助您的示例应用: