6

我正在开发一种产品,该产品将部署到许多不同的组织(理想场景,几十个)。系统的每次部署(由 iOS 和 Android 的原生应用程序组成)将涉及以下内容:

  • 特定于组织的品牌(即新皮肤)
  • 与组织的身份验证系统和用户数据库集成
  • 一些自定义功能取决于组织的需求

换句话说,核心功能在所有部署中都将保持不变,但每个实例看起来会有所不同,会连接到不同的身份验证系统,并启用/禁用某些功能。

我的问题:管理我们的 2 个移动代码库(iOS 和 Android)以最大限度地减少重复并简化部署过程的最佳策略是什么?

我们正在讨论的三个解决方案是:

  1. 创建一个跨所有实例共享的核心库(作为子项目/库项目或 git 子模块),并在顶部添加一个带有品牌和任何配置细节的薄层。

  2. 维护一个具有核心功能的 Git 分支,并为每个包含附加代码的部署创建一个新分支。

  3. 做一些完全不同的事情,stackoverflow 上一些更聪明的人建议。

你觉得哪个听起来最好?提前感谢您的任何反馈!!

4

3 回答 3

3

我会考虑的一种方法是依赖注入

在 Android 上,如果您使用诸如 Square 的Dagger之类的依赖注入工具,您可以简单地创建一个@Module类来提供组件并将其注入到您的应用程序中。这样,您可以将每个白标签客户端的逻辑维护为单独的组件,并且在编译时,将通过@Module类中的引用选择特定组件。

这也是测试应用程序的好方法,它可以避免大量样板代码。

Square 还提供了以下会谈中的重要信息:

Dagger:适用于 Android 和 Java 的快速依赖注入器

工程优雅:Square Stack 的秘密

iOS 也有类似的框架,一个是Objection

框外选项:

是否要求移动客户端必须直接与白标服务器对话?如果没有,您可能需要考虑使用自己的服务器作为白标服务器的代理。这会将所有业务逻辑移到您的服务器上,支持您的所有客户端。

我对此没有任何经验,但一个看似有希望的选择是Google 正在开发的J2ObjC

J2ObjC is an open-source command-line tool from Google that translates
Java code to Objective-C for the iOS (iPhone/iPad) platform. This tool
enables Java code to be part of an iOS application's build, as no editing
of the generated files is necessary. The goal is to write an app's non-UI
code (such as data access, or application logic) in Java, which is then
shared by web apps (using GWT), Android apps, and iOS apps.
于 2013-02-12T00:55:37.283 回答
0

我们处于类似的情况(我们有一个带有 Android 和 iOS 代码库的白标应用程序平台),我们将把我们的原生代码库转移到 C# 实现。我们将使用MonoTouch / Mono for Android。实际上,我从上周开始就开始研究这个(我一直在问一些关于 SO 的问题以弄清楚一些 Mono 基础知识)。

这实际上是您的选项 1,但每个平台都将基于 C# 代码构建(如果需要,可以选择与“本机”代码库进行交互)。

Mono 应该使我们能够在平台之间共享 30-50% 的代码(目前是 iOS 和 Android,未来可能是 Windows Phone)。从我的一点经验来看,性能似乎不错(记住:很多人也使用MonoGame来创建高性能游戏,我认为 Unity 也将 Mono 用于 3D 游戏)。对我个人而言,这也是附加值。我仍然希望有朝一日能够制作游戏,并且对“严肃”应用程序的 Mono 框架的一些基本经验将降低将 MonoGame 框架用于游戏应用程序的障碍。

这种设置的好处是您可以将所有代码(Android、iOS、Windows Phone)保存在一个解决方案中。创建一个核心“库”项目(模型、服务调用等)并为每个平台创建另一个项目。每个特定平台项目都将具有适当的 UI,并具有真正的原生体验。

有关如何使用 Mono 创建多平台应用程序的印象,请阅读此处的简短介绍

于 2013-02-12T04:04:01.017 回答
0

如果您不依赖本机 GUI 使用 Unity3d,请制作具有所有主要功能的自己的 Unity 包(并将其开发为适用于所有平台的单个应用程序),对于任何部署应用程序,您都必须制作新的 Unity 项目并将此包导入其中,自定义它(可能是通过替换资源和编辑配置)。(如果您需要升级核心功能,您需要再次简单地导入新版本的核心包到交付的项目)。

或使用您的选项 1:

  1. C++ 核心库
  2. 可以为所有应用程序单独的资源包(可能是自动化和模块配置也在这里)
  3. Android-Java、iOs-Objective-C全平台原生UI实现
于 2013-02-14T16:15:28.447 回答