Compilation 如何使用同一应用程序(Xamarin表单)瞄准多个客户?

Compilation 如何使用同一应用程序(Xamarin表单)瞄准多个客户?,compilation,xamarin.forms,targets,dynamic-compilation,Compilation,Xamarin.forms,Targets,Dynamic Compilation,=>Xamarin形式 =>在Mac上使用Xamarin Studio(但我也可以访问visual Studio) 想象一下一个普通的登录应用程序,带有图像(客户徽标)、登录(入口控制)、密码(入口控制)和登录按钮 我想建立这个非常相同的应用程序,以多个客户(从1到99)。 每个应用程序将在以下方面有所不同: 名称(应用程序名称和应用程序中的多个标签) 徽标(应用程序中访问web上图像地址的图像控件) 连接字符串(这将是应用程序中的常量) 应用程序的主颜色 我考虑使用资源(.resx)来完

=>Xamarin形式

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


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

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

  • 名称(应用程序名称和应用程序中的多个标签)
  • 徽标(应用程序中访问web上图像地址的图像控件)
  • 连接字符串(这将是应用程序中的常量)
  • 应用程序的主颜色
我考虑使用资源(.resx)来完成这项工作,或者使用某种编译指令。但我不确定如何正确地完成这些工作


提前谢谢你

我假设您希望为不同的客户构建不同的apk/ipa。如果没有,请更新您的问题

您可以为每个客户端设置生成配置。在每个配置中,定义适当的符号。例如,配置“DebugClientA”和“ReleaseClientA”可能有符号
CLIENT\u A

然后在代码中,首先声明属性/字段,包括字符串文字、图像路径、颜色等。将赋值放在其他位置。我将它们放在
App()
constructor调用的方法调用中

对于作业,将它们放入
#if
#elif
块()。代码应该如下所示:

#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
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.
您的应用程序现在应该为每个客户端提供特定的文字、图像和颜色

定制应用程序名称是一个棘手的部分:定制的Android AndroidManifest.xml和iOS Info.plist。我的做法涉及一些(依我看)讨厌的黑客。这两种平台的方法都是相同的,所以我将只编写Android版本

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

仍然在项目属性中,添加预构建事件以修改
properties/AndroidManifest.xml
,并将输出保存到
properties/AndroidManifest\u ClientA.xml
(不更改原始文件)。您希望对其进行修改,以便将“AppNameCustomized”替换为客户端A的应用程序名称。与“package.name.customized”等相同。在Mac上就应该做到这一点。对其他客户重复上述步骤

使用文本编辑器(不是从XS)打开Android project
.csproj
文件。在最后一个
属性组
之后和第一个
项目组
之前,为每个客户端添加以下
属性组


属性/AndroidManifest\u ClientA.xml
对于应用程序名和包名,这基本上归结为:为每个客户端生成一个定制的AndroidManifest,其中包含所需的应用程序/包名。然后根据构建配置使用正确的AndroidManifest


你完了!只需使用DebugClientA进行测试,并使用ReleaseClientA发布即可。

我假设您希望为不同的客户端构建不同的apk/ipa。如果没有,请更新您的问题

您可以为每个客户端设置生成配置。在每个配置中,定义适当的符号。例如,配置“DebugClientA”和“ReleaseClientA”可能有符号
CLIENT\u A

然后在代码中,首先声明属性/字段,包括字符串文字、图像路径、颜色等。将赋值放在其他位置。我将它们放在
App()
constructor调用的方法调用中

对于作业,将它们放入
#if
#elif
块()。代码应该如下所示:

#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
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.
您的应用程序现在应该为每个客户端提供特定的文字、图像和颜色

定制应用程序名称是一个棘手的部分:定制的Android AndroidManifest.xml和iOS Info.plist。我的做法涉及一些(依我看)讨厌的黑客。这两种平台的方法都是相同的,所以我将只编写Android版本

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

仍然在项目属性中,添加预构建事件以修改
properties/AndroidManifest.xml
,并将输出保存到
properties/AndroidManifest\u ClientA.xml
(不更改原始文件)。您希望对其进行修改,以便将“AppNameCustomized”替换为客户端A的应用程序名称。与“package.name.customized”等相同。在Mac上就应该做到这一点。对其他客户重复上述步骤

使用文本编辑器(不是从XS)打开Android project
.csproj
文件。在最后一个
属性组
之后和第一个
项目组
之前,为每个客户端添加以下
属性组


属性/AndroidManifest\u ClientA.xml
对于应用程序名和包名,这基本上归结为:为每个客户端生成一个定制的AndroidManifest,其中包含所需的应用程序/包名。然后根据构建配置使用正确的AndroidManifest


你完了!只需使用DebugClientA进行测试,并使用ReleaseClientA发布即可。

我不建议使用这种方法,因为当您需要签署iOS时,由于mtouch编译的限制,它将无法工作

我建议使用所有资源创建一个公共项目。并且,由客户创建所需的项目

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

#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
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.
您可以通过客户端获得许多解决方案。或者为所有客户提供一个解决方案


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

我不建议使用这种方式,因为当您需要对iOS进行签名时,由于mtouch compile的限制,它将无法工作