Как настроить таргетинг нескольких клиентов с помощью одного и того же приложения (Xamarin Forms)?

=> Формы Xamarin

=> Использование Xamarin Studio на Mac (но у меня также есть доступ к Visual Studio)


Представьте себе универсальное приложение для входа с изображением (логотип клиента), логином (управление входом), паролем (управление входом) и кнопкой для входа.

Я хочу создать это самое приложение для нескольких клиентов (от 1 до 99). Каждое приложение будет отличаться:

  • Имя (имя приложения и несколько ярлыков в приложении),
  • Логотип (элементы управления изображением в приложении, которые обращаются к адресу изображения в Интернете),
  • Строка подключения (это будет константа в приложении),
  • Основной цвет приложения.

Я подумал об использовании ресурсов (.resx) для этого или, может быть, каких-то директив компиляции. Но я не уверен, как сделать все это правильно.

Заранее спасибо!


person joaoalbertofn    schedule 08.09.2016    source источник
comment
Ни у кого раньше не было этой проблемы?   -  person joaoalbertofn    schedule 13.09.2016


Ответы (2)


Я предполагаю, что вы хотите создать разные apk/ipa для разных клиентов. Если нет, пожалуйста, обновите свой вопрос.

Вы можете настроить конфигурацию сборки для каждого клиента. В каждой конфигурации определите соответствующие символы. Например, конфигурации «DebugClientA» и «ReleaseClientA» могут иметь символ CLIENT_A.

Затем в своем коде сначала объявите свои свойства/поля, включая строковые литералы, пути к изображениям, цветам и т. д. Поместите назначения в другом месте. Я помещаю их в вызов метода, вызываемый конструктором App().

Для задания поместите их в блоки #if и #elif (документ MSDN) . Код должен выглядеть так:

#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. Мой способ действий включает в себя некоторые (ИМО) неприятные хаки. Метод одинаков для обеих платформ, поэтому я напишу только версию для Android.

Отредактируйте свойства проекта Android. Поместите заполнители в поля, которые вы хотите настроить для каждого клиента, например. «AppNameCustomized» и «package.name.customized».

В свойствах проекта добавьте событие предварительной сборки, чтобы изменить Properties/AndroidManifest.xml и сохранить вывод в Properties/AndroidManifest_ClientA.xml (без изменения исходного файла). Вы хотите изменить его так, чтобы «AppNameCustomized» было заменено именем приложения клиента A. То же самое для «package.name.customized» и т.п. На Mac sed следует делать Хитрость. Повторите для других клиентов.

Откройте файл проекта Android .csproj с помощью текстового редактора (не из XS). После последнего PropertyGroup и перед первым ItemGroup добавьте следующие PropertyGroup для каждого клиента:

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

Для имени приложения и имени пакета это в основном сводится к следующему: Создайте настраиваемый AndroidManifest для каждого клиента, который содержит желаемое имя приложения/пакета. Затем используйте правильный AndroidManifest в соответствии с конфигурацией сборки.

И вы сделали! Просто протестируйте с помощью DebugClientA и опубликуйте с помощью ReleaseClientA.

person Link Ng    schedule 14.09.2016
comment
Большое спасибо, что нашли время и ответили! Обязательно попробую! Событие перед сборкой кажется мне сложной частью. Я дам вам знать мой отзыв об этом как можно скорее. - person joaoalbertofn; 15.09.2016

Я не рекомендую этот способ, потому что, когда вам нужно будет подписать свою 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.

У вас может быть много решений от клиентов. Или одно решение для всех клиентов.

Когда вы хотите построить, вам нужно изменить цель проекта. Таким образом, вы сможете поддерживать разные сертификаты подписи для всех ваших клиентов.

person Jean-Pierre Poulin    schedule 08.10.2020