如何使用相同的应用程序(Xamarin Forms)定位多个客户?

时间:2016-09-08 12:46:02

标签: compilation xamarin.forms targets dynamic-compilation

=> Xamarin表格

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

想象一下具有图像(客户标识),登录(输入控制),密码(输入控制)和登录按钮的通用登录应用程序。

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

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

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

提前谢谢!

2 个答案:

答案 0 :(得分:4)

我假设你想为不同的客户建立不同的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应该可以解决问题。对其他客户重复。

使用文本编辑器(不是来自XS)打开Android项目.csproj文件。在最后PropertyGroup之后和第一个ItemGroup之前,为每个客户添加以下PropertyGroup

<PropertyGroup Condition=" '$(Configuration)' == 'DebugClientA' Or '$(Configuration)' == 'ReleaseClientA' ">
    <AndroidManifest>Properties/AndroidManifest_ClientA.xml</AndroidManifest>
</PropertyGroup>

对于应用程序名称和程序包名称,这基本归结为:为每个客户端生成一个自定义的AndroidManifest,其中包含所需的应用程序/程序包名称。然后根据构建配置使用正确的AndroidManifest。

你已经完成了!只需使用DebugClientA进行测试,然后使用ReleaseClientA进行发布。

答案 1 :(得分: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.

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

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