1

=> Xamarin 表单

=> 在 Mac 上使用 Xamarin Studio(但我也可以访问 Visual Studio)


想象一个带有图像(客户徽标)、登录(入口控制)、密码(入口控制)和登录按钮的通用登录应用程序。

我想为多个客户(从 1 到 99)构建这个完全相同的应用程序。每个应用程序将在以下方面有所不同:

  • 名称(应用名称和应用内的多个标签),
  • 徽标(应用程序中用于访问 Web 上的图像地址的图像控件),
  • 连接字符串(这将是应用程序中的一个常量),
  • 应用程序的主要颜色。

我想过使用资源(.resx)来做这件事,或者可能是某种编译指令。但我不确定如何正确地做到这一点。

先感谢您!

4

2 回答 2

5

我假设您想为不同的客户构建不同的 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 发布即可。

于 2016-09-14T14:40:01.157 回答
0

我不推荐这种方式,因为当你需要对你的 iOS 进行签名时,由于 mtouch 编译的限制,它不会工作。

我建议创建一个包含所有资源的通用项目。并且,由客户创建所需的项目。

我认为我们可以有这样的解决方案:

ProjectName.Common.Forms
ProjectName.Common.iOS
ProjectName.Common.Android
ProjectName.Client1.Forms
ProjectName.Client1.iOS
ProjectName.Client1.Android
ProjectName.Client2.Forms
ProjectNAme.Client2.iOS
ProjectName.Client2.Android.

您可以有许多客户的解决方案。或者为所有客户提供一种解决方案。

当您想要构建时,您需要更改项目目标。这样,您将能够为所有客户端支持不同的签名证书。

于 2020-10-08T19:59:47.170 回答