Как я могу использовать набор переменных среды в Xamarin.Forms из App Center

У меня есть приложение Xamarin Forms, которое создается с помощью App Center. Приложение содержит некоторый код, который выглядит так:

var secret= "secretvaluegoeshere";

Затем я использую секрет для связи с API. Теперь я хочу извлечь этот секрет из кода, чтобы он не попал в систему контроля версий, и внедрить его при сборке в App Center. Кажется, что переменные среды должны решить именно эту проблему, но примеры в документах не упоминают, как они могут попасть в код (только конфигурация nuget и gradle). Есть ли способ сделать то, что я хочу, с переменными среды, или я должен делать это по-другому?


person Adam Cooper    schedule 31.07.2018    source источник


Ответы (2)


Итак, оказывается, это на удивление легко, выполнив следующие шаги:

Установите пакет NuGet Mobile.BuildTools в своем проекте.

Добавьте файл secrets.json в корень вашего проекта (его следует исключить из системы контроля версий с помощью .gitignore).

Добавьте свой секрет в файл secrets.json, поэтому в моем случае я собираюсь добавить SearchApiKey, очевидно, вы можете добавить столько секретов, сколько хотите:

{
  "SearchApiKey": "SUPERSECRETGOESHERE"
}

Создайте свой проект, и он сгенерирует статический класс с именем Secrets со свойством SearchApiKey, вы можете найти его в папке obj, если хотите взглянуть на него.

Теперь вы можете получить доступ к этому классу и его свойствам в своем коде, поэтому я просто делаю:

var secret = Secrets.SearchApiKey;

Наконец, чтобы передать секрет в вашу сборку в AppCenter, вам нужно добавить переменную среды, которая соответствует имени свойства, начинающемуся с Secret_, поэтому в моем случае это имя — Secret_SearchApiKey, и установите его значение.

Дополнительную информацию можно найти в Mobile.BuildTools репозитории GitHub.

person Adam Cooper    schedule 20.09.2018
comment
Я также написал об этом в коротком сообщении в блоге с некоторыми дополнительными подробностями sequence7.net/2018/09/21/ - person Adam Cooper; 22.09.2018
comment
Привет, Адам, но нам нужно добавить этот файл в наше решение, или он будет добавлен по умолчанию? - person soydachi; 27.11.2018
comment
Какой файл вы имеете в виду @soydachi? Файл Secrets.cs создается автоматически, вам нужно будет создать файл secrets.json. - person Adam Cooper; 07.12.2018
comment
Привет, Адам, возможно, я задаю здесь очевидный вопрос, но можно ли получить эту секретную информацию, скажем, путем декомпиляции конечных двоичных файлов? - person Ishyc; 25.02.2019
comment
@Ishyc Вы всегда можете получить информацию с помощью декомпиляции. Такие инструменты, как Proguard, усложняют задачу, но, в конце концов, мобильным приложениям нельзя доверять. - person torchhound; 12.04.2019
comment
так чем же это отличается от простого создания статического класса с ключами и исключения его в .gitignore? - person ihorbond; 21.11.2019
comment
работа по вставке секретов, указанных в AppCenter, сделана за вас - person Yehor Hromadskyi; 10.01.2020

Вы можете внедрить его через сценарий предварительной сборки в свой проект (замените какой-либо заполнитель непосредственно в коде, создайте какой-нибудь файл ресурсов или что-то в этом роде), а затем прочитайте его оттуда во время выполнения.

person Ivan    schedule 08.08.2018
comment
Можете ли вы дать более конкретные сведения о том, как это сделать с помощью Xamarin и App Center Ivan? - person Adam Cooper; 09.08.2018
comment
Я имею в виду, что нет конкретного способа сделать это для Xamarin. Больше этой переменной будет доступно только во время сборки, но не во время выполнения. Итак, если вы хотите получить к нему доступ во время выполнения, вы должны сохранить его (с помощью шага предварительной сборки в сценарии bash) в место, доступное во время выполнения. Самый простой способ - написать это прямо в коде (какой-то *.cs файл), а затем скомпилировать его в свое приложение. Вы можете сделать это, например, с помощью регулярного выражения. Оставьте некоторый заполнитель в этой константе, чтобы упростить поиск. - person Ivan; 13.08.2018