共享 Android/iOS 开发的最佳实践
Posted
技术标签:
【中文标题】共享 Android/iOS 开发的最佳实践【英文标题】:Best Practices for Shared Android/iOS Development 【发布时间】:2013-12-29 18:01:59 【问题描述】:我正在开发一款可在 android 和 ios 上运行的应用,我们的团队决定使用共享库来减少代码和重复工作。
其中大部分内容都非常简单:我们用某种可以跨平台的语言编写库(C++ 带有本机接口,C# 带有 Mono 等),然后提供特定于平台的绑定。然而,问题在于,由于我们的库必须实现复杂的应用程序逻辑,它必须与系统本身进行大量交互(将数据存储在文件和数据库中,查询位置、通知等 API)。据我们所知,这需要另一层——位于我们的库之下和系统之上——它是用特定于平台的语言编写的,并提供我们的库可以调用的绑定。
这样做的问题是,不同的平台具有根本不同的设计范例来执行不同的任务。例如,存储应用程序数据涉及在两个平台上接触根本不同的系统组件(数据库与文件、不同的分区或具有不同文件路径的文件)。我们希望这个特定于平台的逻辑远离库,但弄清楚如何将它放在转换层中并不明显。我们不能简单地提供 API 方法——如果一个平台需要在不同的时间或以不同的顺序执行给定的操作会发生什么?如果在某些平台上可能需要生成不同的线程,那么监听系统操作呢?
问题是:关于如何干净地解决这些问题有什么智慧吗?我们知道以前已经这样做过——例如,Dropbox 有一个用 C++ 编写的通用库 (libdropbox),支持他们的 Android、iOS 和桌面客户端。
谢谢!
编辑:我们知道像 Xamarin 这样的单一代码库选项是可用的,但我们很想知道是否还有其他选项。
【问题讨论】:
【参考方案1】:首先,可能有一些地方已经解决了这类问题 - 例如对于 C#,请查看 Mono/Xamarin Studio。 但如果您对通用方法更感兴趣(我将使用保存数据作为示例):
从您的共享库的角度来看 - 您希望从共享库到特定于平台的代码中进行什么样的函数调用。这定义了从共享库到特定平台代码的接口。例如
Save(data)
一旦解决了这个问题,接下来就是实现特定于平台的代码来实现这些功能。由于每个平台对任何给定任务都有不同的机制,因此您可能需要某种协调层来了解在该特定平台上制定所需结果所需的操作顺序。例如
平台 A(检查权限 + 文件)
int Save(byte[] data)
var isAllowed = CheckPermissions();
if(isAllowed)
var dataFile = GetDataFile();
return SaveToFile(dataFile, data);
return -1;
平台 B(数据库)
int Save(byte[] data)
var database = GetDatabase();
var targetTable = GetTable(database, "temp");
return AppendToTable(database, targetTable, data);
协调层可以依次调用较低级别的库来执行各个操作 - 这可能有意义,也可能没有意义,具体取决于协调中是否存在将在各种功能之间共享的较低级别功能等级。例如。共享使用的候选者可能是(从上面)
平台 A
CheckPermissions()
GetDataFile()
SaveToFile(File file, byte[] data)
平台 B
GetDataBase()
GetTable(Database database, string tableName)
AppendToTable(Database database, Table table, byte[] data)
【讨论】:
这是有道理的。更复杂的事情呢,比如获取位置?例如,Android 位置 API 提供了在用户移动时唤醒应用程序的能力。在不同的线程上注册监听器怎么样?我认为这些事情有很大的不同,以至于很难为这些事情实施一个通用的协调层。 这真的归结为,在某种程度上,你是否可以设想一个共同的抽象——如果不能,那么你将无法避免将特定于平台的东西一直流到你的应用程序中.如果您可以设想一个通用抽象,那么您需要查看该通用抽象的特定于平台的实现,并确定在实现级别是否存在共性,并据此决定放在哪里什么。【参考方案2】:最好的方法是使用混合 (html5/JS) 平台,例如 Apache Cordova OR Xamarin: "With Xamarin, you write your apps entirely in C#, sharing the same code on iOS, Android, Windows and Mac."
【讨论】:
Cordova 是否仍然存在必须处理两组不同的设计范式的问题? 可以,但是会大大减少碎片化。如果可以使用广告,我强烈推荐 Xamarin。稍微注意一下碎片问题,非常棒!以上是关于共享 Android/iOS 开发的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章