Использование переменных сборки / компилятора для передачи IP во время сборки, без создания артефактов сборки - PullRequest
0 голосов
/ 07 февраля 2019

Это не повторяющийся вопрос.Текущие «ответы» на эту проблему используют Objective-C, который допускает более расширенные операторы #Define. Существующие предлагаемые решения приводят к IP-адресу , непосредственно изменяющему в файле;артефакт сборки, которого я пытался избежать.

В настоящее время я создаю несколько тестов для мобильного приложения, встроенного в Xcode с помощью swift.Это приложение использует облачный сервис для получения статуса элементов и сохранения / получения информации для входа в систему.

----------      ---------
| Server | ---> | Cloud | 
----------      ---------

Однако при тестировании я использую фиктивный сервер, работающий на nodeJS, для предоставления ожидаемых ответов, поэтому я нене нужно, скажем, регистрировать учетную запись каждый раз, когда я хочу, чтобы мои тесты пользовательского интерфейса проверяли процесс регистрации.

----------      ---------
| Server | ---X | Cloud | 
----------      ---------
     |         ----------
      -------> | nodeJS |
               ----------

Для того, чтобы это хорошо работало и на симуляторе iOSкак и на внешнем устройстве, мне нужно указать IP-адрес сервера nodeJS.Я делал это вручную, но я хотел, чтобы это делалось автоматически.

Вот загвоздка: Я хочу сделать это в время выполнения или, по крайней мере, во время сборки без артефактов .

Решения, которые я пытался:

  1. Переменные PList
    Я создал переменную в info.plist, которая называется TestServerIP.Затем я использую сценарий bash во время сборки, чтобы изменить значение переменной на мой en0 адрес:

    #!/bin/bash
    localUrl=$(ipconfig getifaddr en0)
    plutil -replace TestServerIP -string \"$localUrl\" $SRCROOT/gdocntl/Info.plist
    

    Проблема в том, что теперь у меня есть IP-адрес, жестко запрограммированный в моем файле .plist.

  2. Новый plist файл
    Я хотел просто создать новый plist файл только с IP var с bash, но вы не можете создавать файлы вне xcode и добавлять ихв связке легко.Я начал изучать это, но быстро обнаружил, что пытаюсь выполнить поиск / замену XML ... , и мы все знаем, насколько хорошо , что работает .

  3. Swift-скрипт
    Затем я попытался использовать модифицированный swift-скрипт для извлечения IP-адреса во время выполнения, начиная с https://stackoverflow.com/a/25627545/9952260. Проблема здесь в том, что при работе на физическом устройстве iOS это захватывает IP-адрес iDeviceа не машина.

Я пытался реализовать вариант (1), где вместо этого я определяю TestServerIP как что-то вроде ${NODE_JS_IP}, но я не уверен, какЯ могу определить это с помощью Xcode.Я пробил несколько кроличьих норов:

TL; DR: как определить значение пользовательского флага swiftили переменная компилятора, что-то, что я могу присвоить переменной в plist, во время сборки с помощью bash-скрипта?

...