如何使用不同的应用名称、图标、设置从一个项目构建多个应用,

Posted

技术标签:

【中文标题】如何使用不同的应用名称、图标、设置从一个项目构建多个应用,【英文标题】:How to build multiple apps from one project with different app name, icon, settings, 【发布时间】:2018-04-26 05:41:18 【问题描述】:

只用一个项目构建 iosandroid 应用程序非常棒。但是是否也可以使用不同的名称、图标等构建多个应用程序。

如果您构建具有相同布局且可能 95% 的函数/代码/算法相同的应用程序,这将非常有用:

不同的目标群体(健身食谱应用、素食主义者、素食主义者、生态...) 不同的运动(足球、篮球、网球等新闻...) 不同的客户(客户 A、B 和 C 的业务应用) ...

每个应用可能会有所不同:

应用名称 应用图标 闪屏 设计 设置(API URL,...) 一些代码(默认功能/组件可能会被基于应用的自定义文件覆盖)

如果您有一个目录flavors,您可以在其中放置您想要用来覆盖默认代码库的所有文件,这可能是一个完美的解决方案。

这里有人发布了类似的东西或任何想法如何解决这个问题?

【问题讨论】:

developer.android.com/studio/build/… 如何用 Android 风格覆盖 iOS 功能? ..... 您应该提出不同的问题,因为 IOS 和 Android 极不可能有相同的解决方案。我的评论显然只与 Android 有关。 对于应用名称、图标等,iOS 和 Android 可能有不同的解决方案,但我认为代码部分并没有什么不同。我们正在谈论 RN。我说的代码不是原生的.. 请看这个帖子:***.com/questions/22875948/… 【参考方案1】:

这是我最近几天在项目中一直在解决的问题。而且我认为到目前为止我有一些好的(不完美的)解决方案。

想法。我们没有任何内置函数来帮助我们处理这种情况,因此我们可以使用一些外部操作来完成这项工作。我们需要的只是多个 Android 和 iOS 项目以及单个 JS 代码库。

实施。我来到了这个项目结构:

ios 机器人 经理 源代码

iosandroid 文件夹是您所熟知的,它们是本机项目文件夹。

src是一个带有JS代码的文件夹,你可以随意整理

manager 是最有趣的一个。这里我们可以存储多个原生项目文件。我们可以在其中有多个本机项目文件夹,例如app1-androidapp1-iosapp2-androidapp2-ios。当我们想要处理app1 时,我们只需将app1-iosapp1-android 复制到我们的根目录iosandroid 文件夹中,所以实际项目是app1。当我们完成app1 后,我们可以将androidios 文件夹保存到我们的manager,然后将app2-iosapp2-android 复制到根iosandroid。我们都很乐意开发我们的app2

我们可以手动完成。但我们是开发人员,我们可以让它变得更容易。我编写了一个 php 脚本,可以像 php save.php -a app1php set.php -a app1 一样轻松地从 manager 复制到根目录并向后复制。此外,它注意不复制一些不重要的人员(ios 中的 pods 文件夹,android 中的构建等)并运行 pod install 以确保我们在实际项目中拥有所有 pod。

我坚持使用一个 package.json 文件将所有 npm 模块安装一次,因此我不必在每次项目切换后运行 npm install

毕竟,我们可以在一个 repo 中拥有任意数量的项目,我们可以独立定制每个项目。

PS如果你想让我分享我的脚本,我会尽快完成(需要一些时间为 github 准备它并写一些更详细的说明),请让我知道。

【讨论】:

我没有尝试过,但是开箱即用的不同想法......会尝试一下。谢谢。 嘿@Roman,你能分享一下脚本吗? 是的,你能分享你的脚本吗?【参考方案2】:

我为每个平台(iOS/Android)大约 100 个不同的原生应用程序做了这个,共享相同的代码库。我管理这个设置大约 2 年了,我仍然对它感到满意。

这是 iOS 部分:

我使用具有不同 plist/pch 文件的目标。

将每个应用程序不同的文件保存在单独的目录中,以应用程序名称命名。如果将文件添加到项目中,请检查相应的目标:

通过使用相同的文件名,您可以为不同的目标“覆盖”该文件。

Android 部分:

我将一个 gradle 模块用于公共部分,每个应用程序使用一个模块用于自定义。我还将 gradle 变量用于常见值定义(minSdkVersioncompileSdkVersion 等)。每个应用程序只有以下设置不同:applicationIdversionCodeversionName。这是自定义应用程序的示例文件:

apply plugin: 'com.android.application'

android 
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig 
        applicationId "..."
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 28
        versionName "1.0"
    
    signingConfigs rootProject.ext.signingConfigs

    buildTypes 
        release 
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        
    



dependencies 
    compile project(':apps:common')

您可以覆盖应用模块对应res文件夹中的资源(应用图标、图像、字符串等)(对同一资源使用相同的文件名)。

不要忘记在settings.gradle 中包含所有模块。

【讨论】:

【参考方案3】:

您可以使用多个目标。

您可以通过以下步骤创建目标:

转到项目导航器->右键单击目标下的应用名称->选择复制->从弹出窗口中选择Duplicate only

你会发现重复的目标。现在,您可以在资产中添加另一个或额外的 app iconlaunch image,您可以针对该目标进行设置。

请参阅下面的屏幕截图以更好地理解!

因此,选择新创建的目标并通过从general 选项卡中选择它来进行更改。

你可以参考this great tutorial by Appcoda!

【讨论】:

【参考方案4】:

我们会做一些与您想做的事情类似的事情,但范围要有限得多。我们有各种版本的应用,每个版本都有名称、徽标、设计、API URL...

它只是为android构建的,所以它本质上是上面cmet中提到的一些flavors。 (不知道iOS对应的系统是什么)

但我们也使用https://github.com/luggit/react-native-config,它提供了一种在本机(android 和 iOS)和 javascript 代码之间共享这些特定变量/设置的方法。您只需要设置一个 .env.myversion 文件,其中包含您需要的设置,例如:

API_URL=https://my.server.com/ LOGO_FILE=/path/to/the/right/logo COLORSET=shades_of_blue

在构建时会提取正确的文件,因此您的应用具有每个设置的正确版本,然后您可以从代码中调用这些变量,并根据您使用的版本进行分支。好处是它无处不在。这样做的缺点是,如果您将所有这些都放在 JS 层中,而不是在构建系统中使用风味定义它,那么您可能会在您的应用程序中运送一些额外的东西。我想这是您需要根据用例决定的便利性和性能/效率之间的权衡。

【讨论】:

【参考方案5】:

在 Xcode 中,您可以简单地复制目标并使用新 plist 创建一个新目标,这意味着您可以根据需要更改应用名称、图标、启动包和其他设置。

【讨论】:

【参考方案6】:

在 XCode 中,您可以为单个项目中的不同应用程序(意味着 Dev、alpha、beta、Prod、Debug、Release)进行不同的构建配置,借助此解决方案,您可以更改 AppName、AppIcon、BundleId ,URLs,SplashScreen 等用于不同的构建。

【讨论】:

【参考方案7】:

我创建了一个网站,用户可以在其中指定他们的内容、图标、名称和包名,以及许多其他选项,例如在应用程序中包含广告 SDK。小额付款后,用户可以通过证书获得创建的 APK 或手动签署应用程序。生成 apk 需要几秒钟。 APK 已准备好上传到 PlayStore。这是一个价格高昂的项目,但我的客户很高兴。

它是怎么做到的?

    为代码创建一些模板。您可以在某些网站上购买。 在单独的文件中拆分可选代码 如果您无法将代码拆分到单独的文件中(例如,对于 AndroidManifest.xml),您可以包含带有一些键的注释(后处理说明) 从用户内容/指定图标生成图标。 根据用户要求,只需将所有选定的文件复制到同一目录中,使用简单的文本处理器删除不必要的代码(使用步骤 3 中的 cmets),编译它,将 APK 发送给用户。

【讨论】:

【参考方案8】:

基本上有两种不同的选择:

选项 1:操作系统构建/android 风格:

使用 iOS Builds 和/或 android flavors 在 react-native 项目中有一些缺点:

    React-native 链接仅链接 Xcode 上的第一个目标。您必须手动链接库以获取更多目标。但是在 react-native 0.60+ 中有自动链接,这可以通过 little tweak 到 podfile 来修复 如果应用 ID 与包 ID 不同,React-native run-android 可能无法启动应用。 维护一个包含所有不同构建/风格以及包含在单个项目中的所有资产和资源的单个原生项目可能会很复杂。 需要一些额外的 xcode 和 android studio/gradel 知识。

选项 2:Natives 方法(我个人更喜欢)

根据Roman Osypov 的回答,我想出了这个方法和一个实现。

目前每个react-native项目都有两个native文件夹,iosandroid,每个文件夹代表平台的native项目。

假设我们有两个不同的包/应用程序,它们具有相同的代码库但不同的资源/资产等。

CabAppTaxiApp

主要思想是交换根 ios 和 android 文件夹,但保持同步,并与它们的“本地”源保持同步。

    在项目的根目录下创建一个文件夹natives 将当前主项目的ios和android文件夹复制到 natives 文件夹,假设它是 CabApp,然后重命名这些文件夹 进入以下:CabApp-iosCabApp-android 对 TaxiApp 做同样的事情,但记得更改 bundleId, 原生项目的标识符、资产等 删除项目根目录下的iosandroid主文件夹 并将它们添加到.gitignore 安装以下开发依赖yarn add -D rimraf sync-directory ttab 现在第一次拉取项目时,您需要设置“应用程序” 例如,如果你想在TaxiApp 上工作,你可以执行 以下:yarn ios-TaxApp,您可以在脚本中定义 package.json
yarn rimraf ios && yarn rimraf android && yarn syncdir natives/TaxiApp-ios ios -c && yarn syncdir natives/TaxiApp-android android -c && cd ios && pod install && yarn

基本上此命令会删除根文件夹ios + android 并将文件夹从natives 文件夹同步到根文件夹。

    最后一步是同步观察从“temp”ios和android文件夹返回natives各自的应用平台。 例如,现在在您的 ios 启动脚本中,您可以添加以下脚本 yarn ios-TaxiApp 可以定义为:
yarn ttab 'yarn syncdir ios natives/TaxiApp-ios -w -c' & yarn ttab 'yarn syncdir android natives/TaxiApp-android -w -c' & yarn ttab 'yarn react-native run-ios --simulator=\"iPhone 11\"'

【讨论】:

以上是关于如何使用不同的应用名称、图标、设置从一个项目构建多个应用,的主要内容,如果未能解决你的问题,请参考以下文章

如何使用多个目标使用具有相同名称的不同资产

有条件地构建具有不同资产目录的应用程序

有条件地构建具有不同资产目录的应用程序

如何确保我的 Xcode UITest 目标仅构建目标应用程序?

如何在 electron-vue js 中设置应用程序图标

OSX:如何本地化鼠标飞过扩展坞中的应用程序图标时出现的名称?