=> Xamarin表格
=>在Mac上使用Xamarin Studio(但我也可以访问visual studio)
想象一下具有图像(客户标识),登录(输入控制),密码(输入控制)和登录按钮的通用登录应用程序。
我想为多个客户构建这个相同的应用程序(从1到99)。 每个应用程序将有所不同:
我想过使用Resources(.resx)来做这件事,或者某种编译指令。但我不确定如何做到这一点。
提前谢谢!
答案 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.
您可以为客户提供许多解决方案。或为所有客户提供一种解决方案。
要构建时,需要更改项目目标。这样,您将能够为所有客户支持不同的签名证书。