我假设您想为不同的客户构建不同的 apk/ipa。如果没有,请更新您的问题。
您可以为每个客户端设置构建配置。在每个配置中,定义适当的符号。例如配置“DebugClientA”和“ReleaseClientA”可能有符号CLIENT_A
。
然后在您的代码中,首先声明您的属性/字段,包括字符串文字、图像路径、颜色等。将分配放在其他地方。我将它们放在构造函数调用的方法调用中App()
。
对于作业,将它们放入#if
和#elif
块中(MSDN doc)。代码应如下所示:
#if CLIENT_A
MyString = "ClientA";
// Following is for ImageSource.FromResource()
MyPathToImage = "MyAssembly.images.clienta.image.png";
MyColor = Color.FromHex("012345");
#elif CLIENT_B
MyString = "ClientB";
MyPathToImage = "MyAssembly.images.clientb.image.png";
MyColor = Color.FromHex("6789AB");
// repeat as needed
#endif
您的应用现在应该为每个客户端提供特定的文字、图像和颜色。
自定义应用名称是棘手的部分:自定义 Android AndroidManifest.xml 和 iOS Info.plist。我的做法涉及一些(IMO)讨厌的黑客行为。两个平台的方法都是一样的,所以我只写Android版本。
编辑 Android 项目的属性。将占位符放入要为每个客户端自定义的字段中,例如“AppNameCustomized”和“package.name.customized”。
仍然在项目属性中,添加预构建事件以修改Properties/AndroidManifest.xml
并将输出保存到Properties/AndroidManifest_ClientA.xml
(不更改原始文件)。您要对其进行修改,以便将“AppNameCustomized”替换为客户端 A 的应用名称。“package.name.customized”等类似。在 Mac 上sed
应该可以解决问题。对其他客户重复。
.csproj
使用文本编辑器(不是从 XS)打开 Android 项目文件。在最后一个之后PropertyGroup
和第一个之前,为每个客户端ItemGroup
添加以下内容:PropertyGroup
<PropertyGroup Condition=" '$(Configuration)' == 'DebugClientA' Or '$(Configuration)' == 'ReleaseClientA' ">
<AndroidManifest>Properties/AndroidManifest_ClientA.xml</AndroidManifest>
</PropertyGroup>
对于应用名称和包名称,这基本上可以归结为:为每个客户端生成一个定制的 AndroidManifest,其中包含所需的应用/包名称。然后根据构建配置使用正确的 AndroidManifest。
你完成了!只需使用 DebugClientA 进行测试并使用 ReleaseClientA 发布即可。