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

23 浏览
0 Comments

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

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

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

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

通过不同的文章,我计划使用一种常见的架构来将项目的业务逻辑(核心)与为每个系统重新实现的UI分离(iOS的UIKit,AngularJS和Web应用程序的Polymer等)。

这种架构的目标是遵守重要的软件工程原则,如信息隐藏(通过模块分解需求),DRY和SOLID。

- 每个功能将被分解为模块。

- 核心:业务逻辑代码-可在每个平台上重用-将以库的形式表示。

- 视图:视图类将在每个不同的平台上开发,以使用每个平台提供的不同UI元素。例如:Objective-C / Swift中的ViewController的子类用于iOS,或者用于Web应用程序的简单类来操作HTML。这个类中没有逻辑。它只负责:

- 处理用户与业务逻辑的交互。

- 显示来自业务逻辑的内容。

- IView:抽象出操作视图的类的接口。

- Presenter:连接Interactor和View以驱动UI。

- Interactor:模块的逻辑,如算法。

- Data Store:通过与数据库、API或Web服务进行通信来管理数据的持久性和获取。

- Model:以结构表示的数据。

在iOS上(与Android几乎相同),"core"的代码将通过虚拟机执行,正如这篇文章所示。

在AngularJS上,代码如下图所示。

现在你了解了整个架构,这是我的问题。

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

- Dart:

- 问题1:是否有机制允许Objective-C/Swift和Java之间的互操作性?我知道这两个平台都有执行JavaScript代码的虚拟机,并且谷歌提供了将Dart编译为JavaScript代码的dart2js。但它不是纯JavaScript:在这里看到一个例子。所以我不知道是否仍然有合适的互操作性。

- JavaScript ES6:即使它在浏览器中尚未完全实现,但可以使用Traceur编译器开始使用ES6。

- 问题2:由Traceur编译的JavaScript与iOS/Android中的虚拟机之间是否存在互操作性?

- 问题3:使用通过Traceur开发大型项目并生成生产代码的ES6是否“安全”?

谢谢阅读。

0
0 Comments

在跨平台项目中,关于Web语言的互操作性的问题出现的原因是开发人员希望在不同平台上使用相同的代码来开发网站和应用程序。解决这个问题的方法是使用C++或者其他可以编译成不同平台的本地代码的语言,或者使用Dart和JavaScript等可以通过虚拟机进行交互的语言。

开发人员提到了使用C++的例子,Dropbox就是使用C++来开发他们的应用程序的。他们甚至开源了用于生成C++到Java/Objective-C API的工具和用于Android/iOS的样例应用程序。此外,还有一篇关于Dropbox如何使用C++进行跨平台开发的有趣文章。

如果不想使用C++,可以尝试使用Google的Mobile Chrome Apps库,这是Cordova的一个分支,添加了许多新的功能和优势。还有一个Dart的封装库可以使用Chrome的API。使用这些工具,可以使用Dart编写应用程序,并使用Chrome的API进行特定功能的开发,然后将代码编译成JavaScript并部署到不同的平台上。

虽然Dart是一个很好的语言,但是开发人员提到了Dart和Java/Objective-C/Swift之间的交互问题。因为Dart编译器将Dart代码编译成优化的JavaScript而不是普通的JavaScript,所以不确定是否可以进行交互。

对于iOS平台,由于不允许使用虚拟机,这将是最大的问题。唯一的解决方法是使用编译语言,例如C和C++。

开发人员还提到了使用第三方库的问题。他们希望在跨平台开发中不使用第三方库,因为在需要创建特定功能时,使用第三方库会导致问题。他们希望通过虚拟机进行交互来创建跨平台应用程序。

然而,其他开发人员指出,在iOS上不允许使用自己的虚拟机,只能使用iOS自带的虚拟机。如果选择这条路线,那么最好使用类似Cordova/MobileChromeApps这样的工具,它们已经实现了将本地API暴露给JavaScript的功能。

解决Web语言的互操作性问题的方法是使用C++或者其他可以编译成不同平台的本地代码的语言,或者使用支持虚拟机交互的语言,并结合使用类似Cordova/MobileChromeApps这样的工具来实现跨平台开发。

0
0 Comments

在这个话题中,我们学到了在"GWT.Create"会议上,谷歌的开发人员展示了他们如何进行跨平台项目的方法:

首先,你图片中的数据存储和模型部分应该在一个外部服务器上完成,这样它已经是跨平台的了。

UI渲染必须以原生方式分别完成,这是最好的解决方案。

他们使用Java实现了共享逻辑(复杂计算、加密等),对于Android来说它可以直接使用,对于Web他们使用GWT将Java代码转换成Javascript,而对于iOS他们使用J2ObjC,这是谷歌的一个新产品。你可以在这里找到它:

https://github.com/google/j2objc

他们还提到了C/C++的解决方案,这也不是一个坏主意,Java只是一种高级语言,在大多数情况下很容易使用。

感谢你的答复。在方案中的"core"将会被开发成一个静态库,而视图将以原生方式分别完成。Java是一个不错的选择,但我想提醒你的是,我还想创建一个网站,并在网站中也使用"core"。此外,我认为使用一些新的热门语言来开始这个项目可能是一个不错的主意,比如Dart(用于"core"部分)、Swift(iOS视图)、Go(Android视图)以及AngularDart或AngularJS(网站视图)。

0
0 Comments

问题出现的原因是作者想要在iOS/Android/Web平台上创建一个跨平台应用程序,希望能够尽可能地共享代码。作者建议使用以下项目结构:myapp-core, myapp-ios, myapp-android, myapp-web。核心项目将在iOS、Android和Web项目之间共享。作者建议使用Java编写核心项目,并使用GWT将该代码转换为Web项目的JavaScript代码。对于Android项目,无需做任何处理,因为Android使用Java。对于iOS项目,可以使用J2Objc将核心Java代码转译为Objective-C。核心项目应该包括接口、抽象基类和工厂。

解决方法是使用接口、抽象基类和工厂,尽可能多地共享代码。可以使用Dagger2进行核心模块之间的通信,它适用于Android/iOS/GWT平台。还有一个名为realtime-json的跨平台JSON库。对于Android和iOS平台,可以在核心项目中实现HTTP传输。对于GWT/JavaScript平台,需要在客户端实现。

以下是一些示例应用程序,可以帮助读者:

- 使用J2Objc的iOS应用程序:https://github.com/tomball/j2objc-sample-reversi

- 混合应用程序的起始套件:https://github.com/Sfeir/jhybrid

感谢完整的答案!恭喜您获得了奖励!在将您的答案标记为接受的答案之前,我会进行一些测试。

好的,祝您好运。如果有更多问题,请告诉我。

目前,我正在尝试使用类似Java的虚拟机Dart。如果我有可行的方案,我会在这里发布答案。

您有任何进展吗?

目前,我非常忙于学习,但不用担心,我会尽快进行一些测试,并撰写一个关于测试结果的答案。

0