在iOS和Android之间共享代码的最佳方式

Adz*_*Adz 8 c++ android cross-platform azure ios

我为iOS和Android开发了一个应用程序,我正在寻找在这两个平台之间共享代码的最佳方式.

我想要做的是在本机中创建所有View(UI部分),但共享逻辑代码(控制器+模型).

在我发现的所有内容中,有3件事似乎相当不错:

1)C++ - >构建库文件使用c ++对于逻辑,我将能够在2个平台中使用.dll文件

2)Azure移动应用程序服务.是否有可能成为网络服务中的所有逻辑?问题是,如果我没有访问互联网,我的应用程序将无法使用,对吧?

3)我听说过很多关于Facebook使用的React本机,但它似乎用于创建UI,但我更喜欢用原生的方式创建它.我可以只对逻辑做出反应吗?

mic*_*rus 14

看起来你有三个选择:

1. C++


你不仅可以拥有一个已编译的.dll,并期望它适用于iOS和Android.它们都必须在不同的体系结构中编译,并且必须是iOS上的静态库.

Dropbox就是这样做的,他们已经提供了很多笔记和示例代码,以及你可以使用的代码,所以你可以看看.

优点

•设置完成后非常简单
•没有额外的依赖关系,错误等(例如Xamarin/React Native)

缺点

•设置和使用它需要大量的额外工作:您需要设置其他编译步骤并为两个平台编写包装器.
•在尝试为两种不同的体系结构编译相同的代码时,您肯定会遇到的其他一些挑战

这是一篇关于如何详细介绍的SO帖子......

Xamarin


在这种情况下,此选项似乎极端.您被迫使用C#并引入另一层依赖项和错误.你说你不想为UI使用其他语言,所以我不推荐它.

3.反应原生


现在这是一个可行的选择.您可以在JS中编写脚本,并在Android和iOS中使用本机代码.

这是一篇关于如何与代码示例共享代码的文章......

不幸的是,它使用React Native for UI,但您可以从本机代码轻松调用React Native函数.

使用它有很多不足之处,包括调用是异步的,因为它们是在另一个线程上执行的,所以你必须为返回某些东西的函数实现某种回调系统.

优点

•似乎易于设置和编写

缺点

•您必须为每个返回某些内容的函数实现本机回调
•使用它有很多文档描述的缺陷:

•由于事件可以从任何地方发送,因此可以在项目中引入意大利面风格的依赖项.

•事件共享命名空间,这意味着您可能会遇到一些名称冲突.不会静态检测到冲突,这使得它们难以调试.

•如果您使用相同React Native组件的多个实例,并且希望将它们与事件的视角区分开来,则可能需要引入某种标识符并将它们与事件一起传递(您可以使用本机视图的reactTag)作为标识符).

结论


我想我会选择C++,主要是因为一家大公司(Dropbox)尝试过并成功实际使用它.你可以试试React Native作为一个实验,它会成为一个很好的研究案例!

  • Dropbox 不再使用 C++,也不再在 Android 和 iOS 之间共享代码 https://blogs.dropbox.com/tech/2019/08/the-not-so-hidden-cost-of-sharing-code- Between-ios -和-android/ (2认同)

Eik*_*iko 3

我想说,将“核心”逻辑放入单独的库中是一种明智的方法。

您不是第一个想要这样做的人,我强烈建议您查看Djinni。它是实现这一目标的工具。您可以定义通用接口和数据类型并填写本机部分。沟通可以通过两种方式进行。

这并不像一次在本地编写整个内容那么容易,但它支持简洁的设计,无论如何您都可以从中受益。