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

joa*_*ofn 1 compilation dynamic-compilation targets xamarin.forms

=> Xamarin形式

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


想象一个具有图像(客户徽标),登录名(条目控件),密码(条目控件)和一个登录按钮的通用登录应用程序。

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

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

我想到要使用Resources(.resx)或某种编译指令。但我不确定如何正确执行任何操作。

先感谢您!

小智 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
Run Code Online (Sandbox Code Playgroud)

现在,您的应用程序应该为每个客户端具有特定的文字,图像和颜色。

自定义应用程序名称是棘手的部分:自定义的Android AndroidManifest.xml和iOS Info.plist。我的做法涉及一些(IMO)讨厌的骇客。两种平台的方法都相同,因此我只写Android版本。

编辑Android项目的属性。将占位符放入要为每个客户端自定义的字段,例如“ AppNameCustomized”和“ package.name.customized”。

仍在项目属性中,添加一个预构建事件以修改Properties/AndroidManifest.xml并将输出保存到Properties/AndroidManifest_ClientA.xml(不更改原始文件)。您想要对其进行修改,以便用客户端A的应用名称替换“ AppNameCustomized”。“ package.name.customized”等类似。在Mac上sed应该可以解决问题。对其他客户端重复此操作。

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

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

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

大功告成!只需使用DebugClientA进行测试,然后使用ReleaseClientA进行发布即可。