我正在开发一款可在Android和iOS上运行的应用,我们的团队已决定使用共享库来减少代码和工作重复。
大部分内容非常简单:我们用某种语言编写一个可以跨平台的库(带有本机接口的C ++,带有Mono的C#等),然后提供特定于平台的绑定。然而,问题在于,由于我们的库必须实现复杂的应用程序逻辑,因此它必须与系统本身进行大量交互(将数据存储在文件和数据库中,查询API,如位置,通知等)。尽我们所知,这需要另一层 - 位于我们的库下方和系统上方 - 使用特定于平台的语言编写,并提供我们的库可以调用的绑定。
问题在于,不同的平台具有根本不同的设计范例,可用于执行不同的任务。例如,存储应用程序数据涉及在两个平台上触摸根本不同的系统组件(数据库与文件,不同分区或具有不同文件路径的文件)。我们希望这个特定于平台的逻辑不在库中,但是弄清楚如何将它放在转换层中是不明显的。我们不能简单地提供API方法 - 如果一个平台需要在不同的时间或不同的顺序执行给定的操作,会发生什么?如何监听系统操作,在某些平台上,可能需要生成不同的线程?
问题是:有没有关于如何干净地解决这些问题的智慧?我们知道它之前已经完成 - 例如,Dropbox有一个用C ++编写的公共库(libdropbox)支持他们的Android,iOS和桌面客户端。
谢谢!
编辑:我们知道像Xamarin这样的单代码库选项可用,但我们很想知道是否还有其他选项。
答案 0 :(得分:1)
首先,可能有一些地方已经解决了这些问题 - 例如,对于C#,请查看 Mono / Xamarin Studio 。 但是,如果您对一般方法更感兴趣(我将使用保存数据作为示例的用例):
从共享库的角度来看 - 您希望从共享库调用哪些函数调用特定于平台的代码。这定义了从共享库到特定于平台的代码的接口。 E.g。
Save(data)
一旦你解决了问题,那就是实现特定于平台的代码来实现这些功能。由于每个平台对于任何给定任务都有不同的机制,因此您可能需要某种协调层来理解在该特定平台上实现所需结果所需的操作顺序。 E.g
平台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)
答案 1 :(得分:0)