【问题标题】:How to target multiple customers with the same app (Xamarin Forms)?如何使用同一个应用程序(Xamarin Forms)定位多个客户?
【发布时间】:2016-09-08 12:46:01
【问题描述】:

=> Xamarin 表单

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


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

我想为多个客户(从 1 到 99)构建同样的应用。 每个应用的不同之处在于:

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

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

提前谢谢你!

【问题讨论】:

  • 以前没有人遇到过这个问题吗?

标签: compilation xamarin.forms targets dynamic-compilation


【解决方案1】:

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

【讨论】:

  • 非常感谢您抽出宝贵时间回答问题!我一定会试一试的! “预构建事件”对我来说似乎是棘手的部分。我会尽快告诉你我对此的反馈。
【解决方案2】:

我不推荐这种方式,因为当你需要对你的 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-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 2015-11-05
    相关资源
    最近更新 更多