仅使用一个项目构建iOS和Android应用程序非常棒。但是,是否也可以构建具有不同名称,图标等的多个应用程序。
如果您使用相同的布局构建应用程序并且可能与功能/代码/算法的95%相同,这可能会非常有用:
每个应用可能会有所不同的事情:
如果你有一个目录 flavors ,你可以把所有你想用的文件覆盖在默认的代码库中,这可能是一个完美的解决方案。
有人在这里发布了类似或任何想法如何解决这个问题?
答案 0 :(得分:4)
这是我过去几天在项目中解决的问题。到目前为止,我认为我有一些好的(不完美的)解决方案。
想法。我们没有任何内置函数来帮助我们处理这种情况,因此我们可以使用一些可以完成工作的外部操作。我们需要的只是多个Android和iOS项目以及单个JS代码库。
实施。我来到这个项目结构:
ios
和android
文件夹是众所周知的,它们是本机项目文件夹。
src
是一个包含JS代码的文件夹,您可以随意组织它
manager
是最有趣的一个。这里我们可以存储多个本机项目文件。我们可以在其中包含多个本机项目文件夹,例如app1-android
app1-ios
app2-android
app2-ios
。当我们想要处理app1
时,我们只需将app1-ios
和app1-android
复制到我们的根ios
和android
文件夹,因此实际项目为{{1} }}。完成app1
后,我们可以将app1
和android
个文件夹保存到ios
,然后将manager
和app2-ios
复制到root { {1}}和app2-android
。我们都很善于发展我们的ios
。
我们可以手动完成。但我们是开发人员,我们可以让它变得更容易。我编写了一个PHP脚本,使android
和app2
从php save.php -a app1
复制到root并向后复制。此外,它负责不复制一些不重要的工作人员(在ios中的pods文件夹,在android等中构建)并运行php set.php -a app1
以确保我们在实际项目中拥有所有pod。
我坚持使用一个manager
文件来安装所有npm模块,因此我不必在每次项目切换后运行pod install
。
毕竟,我们可以在一个回购中拥有我们希望的项目,我们可以独立定制每个项目。
PS 如果你想让我分享我的脚本,我会尽可能快地完成它(需要一些时间为github做准备并写一些更详细的说明),让我吧知道。
答案 1 :(得分:1)
您可以使用多个目标。
您可以通过以下步骤创建目标:
转到项目导航器 - >右键点击目标下的应用名称 - >选择复制 - >从弹出窗口选择Duplicate only
。
你会发现重复的目标。现在,您可以在资产中使用另一个或多个app icon
和launch image
,并为该目标设置它。
请参阅下面的屏幕截图以便更好地理解!
因此,选择新归结的目标并通过从general
标签中选择来进行更改。
答案 2 :(得分:1)
我为每个平台(iOS / Android)提供了大约100种不同的原生应用程序,共享相同的代码库。我现在管理这个设置大约2年了,我仍然很满意。
以下是iOS部分:
我使用具有不同plist
/ pch
个文件的目标。
将每个应用程序不同的文件保存在一个单独的目录中,由应用程序名称命名。如果将文件添加到项目中,请检查相应的目标:
通过使用相同的文件名,您可以"覆盖"不同目标的文件。
Android部分:
我使用一个gradle模块作为公共部件,每个app使用一个模块进行自定义。我还使用gradle变量进行常见值定义(minSdkVersion
,compileSdkVersion
等)。每个应用只有以下设置不同:applicationId
,versionCode
,versionName
。以下是自定义应用的示例文件:
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 :(得分:0)
我写了关于this table的文章,它应该会带你走近你的目标。
TLDR;是它为您提供了一种设置项目样板的方法,以便您重用所有npm和本机依赖项(本机依赖项会自动链接到您)。这绝对可以帮助你......
我认为它不会帮助你...
基本上,它可以帮助您复制项目根目录(./
)和app(./app
)文件夹中的任何内容,但./ios
或{{1}中没有任何内容文件夹,除非它们作为依赖项包含在内。可能有一种方法可以将App Icons和Splash Screens作为依赖项,但我不确定。如果你搞清楚了,请告诉我。
答案 4 :(得分:0)
我们会做一些类似于你想做的事情,但是在一个更有限的范围内。我们有各种版本的应用程序,每个版本都有名称,徽标,设计,API URL ......
它仅适用于Android,因此它基本上是上面评论中提到的一些风格。 (我不知道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层中拥有所有这些内容而不是在带有flavor的构建系统中定义它,那么你可能会在应用程序中添加一些额外的东西。我想这是根据您的用例需要决定的便利性和性能/效率之间的权衡。
答案 5 :(得分:0)
在Xcode中,您可以简单地复制目标并使用新的plist创建一个新目标,这意味着您可以根据需要更改应用程序名称,图标,初始包和其他设置。
答案 6 :(得分:0)
在XCode中,您可以在单个项目中为不同的应用程序制作不同的构建配置(意味着Dev,alpha,beta,Prod,Debug,Release),借助此解决方案,您可以更改AppName,AppIcon,BundleId ,URL,SplashScreen等适用于不同版本。
答案 7 :(得分:0)
我创建了一个网站,用户可以在其中指定其内容,图标,名称和包名称,以及许多其他选项,例如在应用中包含广告SDK。小额付款后,用户可以手动创建带证书或签名应用的APK。生成apk需要几秒钟。 APK已准备好上传到PlayStore。这个项目价格很高,但我的客户很高兴。
怎么做?
答案 8 :(得分:0)
基本上有两种不同的选择:
在响应本机项目中,使用iOS 内部版本和/或android 风味有一些缺点:
基于Roman Osypov的答案,我想出了一种实现方法。
当前,每个本机项目都有两个本机文件夹ios
和android
,每个文件夹代表平台的本机项目。
让我们假设我们有两个具有相同代码库但资源/资产等不同的包/应用。
CabApp
TaxiApp
主要思想是交换根ios和android文件夹,并将其与“本地”源保持同步。
natives
的文件夹natives
文件夹,假设它是CabApp
,然后重命名这些文件夹
分为以下几类:CabApp-ios
CabApp-android
ios
和android
主文件夹
并为其添加.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
文件夹同步到根文件夹。
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\"'