【问题标题】:Multiplatform app development with individual guis使用个人 gui 的多平台应用程序开发
【发布时间】:2016-06-27 19:22:18
【问题描述】:

我目前正在计划开发一个多平台应用程序,但我不确定哪种方式最符合我的要求,因为我能想到的所有可能性都未能满足我的要求。

首先我想写一个安卓应用,感觉应该是一个普通的典型安卓应用。所以我想在我的其他 gui 元素中使用标准的 actionbar 和 android 设计的外观和感觉。完成 android 应用程序后,我计划开发一个 ios 应用程序,它应该有不同的设计,所以无论如何我都会为此重新开发 gui。

但我不想重写代表应用程序智能的其他代码,独立于 gui。我想出了以下几种可能性:

1。 Java GUI 与本机库

在这里,我将我的应用程序的所有代码抽象到一个 C++ 库中(据我所知,ios 也支持使用 c++ 库)并通常在 java 中开发 gui android。该库将拥有一个启动函数,并通过回调函数通知 gui 每次更改。

专业版

  • 我可以重用在两个平台上相同的所有代码。我只是单独实现 gui
  • android gui 的设计很简单,正如我所希望的那样。它看起来像典型的 android,因为它是典型的 android。

缺点

  • 我非常不喜欢 JNI 的使用。尤其是回调函数的签名和名称(从 c++ 调用 java 函数)在编译时不检查,需要大量的手动工作。如果我重命名一个函数并忘记返工本机部分,我只会在运行时注意到这个错误。

2。在原生端构建 GUI

在这里我很难找出什么是可能的,尤其是对于 2.2

2.1 使用Qt

总的来说,我对 Qt 的初步体验只有一些,但据我了解,我会有以下优点和缺点:

专业版

为 ios 和 Android 重用大部分代码。我宁愿为每个平台重新设计 gui,让它们感觉自然。我无法评估 qt 甚至可以帮助我做到这一点

缺点

我必须使用其他 qt 小部件来复制 android gui。这是更多的努力,我不知道是否可以复制 android gui 元素(如操作栏),以便用户不会注意到它。

2.2 从原生端使用android框架

我根本不知道这是否可能,我无法找到此信息。我可以使用“NativeActivity”类并使用 android 框架来构建 gui 并使用例如操作栏?如果这是可能的,它将具有 1. 的优点,也许不会有缺点?


您对我的想法或者甚至是我没有想到的新方法有任何反馈吗? WhatsApp 等其他多平台应用程序如何解决此问题?他们是否有针对每个平台的冗余代码?

谢谢你, 托比

【问题讨论】:

  • 将每个平台的 UI 原生地写入其平台。然后,您的应用程序逻辑可能是用于每个平台的依赖项。否则,您可以使用抽象框架,也许是 PhoneGap

标签: android qt user-interface mobile multiplatform


【解决方案1】:

我想说这在很大程度上取决于您的应用程序要求。在我看来,更好的解决方案是使用针对该平台推荐的 SDK 为每个平台开发一个单独的应用程序,并仅在本机 C++ 中实现耗时的数据处理算法。

移动平台上的应用程序运行时并不像在桌面平台上那么简单。您应该考虑后台和前台处理、特定应用程序生命周期、访问系统资源(如网络、文件系统等)。所有这些问题在 iOS 和 Android 上确实有所不同。

关于您列出的可能性。

  1. Qt/QML 只有在满足两个要求的情况下才可以:

    1.1 你的应用是前台应用,没有任何后台操作。

    1.2 您购买了商业 Qt 许可证,因为只有商业 Qt 可以提交到 Apple iTunes 应用商店(甚至 GPL 应用都在 问题)。

  2. 在具有跨平台 C/C++ 后端的 Android 上使用 NDK 原生活动。 Android NDK API 提供的 API 比 Android Java SDK 少得多,所以很多东西你必须手动实现或包装。这是一条艰难的道路。

  3. 使用 JNI 混合 Java 代码和 C/C++ 可为您提供更多 Android SDK API。但您应该记住,Android Activity 的生命周期与您在 C/C++ 上开发时所习惯的有所不同。

我们正在使用的方法

我们一直在开发一个具有大量跨平台功能的应用程序,它应该可以在 Windows/Linux/Mac OSx/Android/iOS 上运行。我们使用的方法如下。

  1. 跨平台内核是用纯 C++ 编写的。
  2. 我们为每个平台提供了 GUI 界面的适配器。
  3. 在桌面上,我们使用 Qt,因为它适用于所有桌面平台,只需要对每个平台进行微调。
  4. 在 iOS 上,GUI 是使用带有 Objective-C 的 iOS SDK 构建的,并且 C++ 核心作为框架链接。尽管如此,我们还是必须以某种方式修补我们的核心,以满足 iOS 后台要求等。
  5. 在 Android 上,我们将 C++ 核心封装在后台进程中,并仅使用 Android Java SDK 构建所有 GUI。前台 GUI 活动通过本地套接字与内核交互,因此我们无需为 C++ 内核中的活动生命周期而烦恼。但是适配器有点复杂。

尽管如此,这两个移动平台通常都需要在 C++ 核心中进行变通和调整,从而在每个平台的代码中添加许多#ifdef'ed 分支。

【讨论】:

    猜你喜欢
    • 2013-02-11
    • 1970-01-01
    • 2014-04-11
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多