Как "создать и запустить" в нескольких местах назначения сразу в Xcode?

Как можно запустить проект в нескольких местах назначения (скажем, iPhone, iPad и iSimulator) сразу? Xcode Product optionsXcode multiple destinations


Есть два связанных вопроса:

Вопрос 1ˢᵗ (предположительно) имеет ответ, но я не могу понять , как именно вы должны использовать цель Aggregate (если это вообще правильное направление) и, по-видимому, ни Джош Кахане, ни ФП; "ответ" по-прежнему получил/остался принят.

Вопрос 2 was был закрыт как "дубликат", как если бы один из них предоставил (работоспособный) ответ.


Добавлена ​​щедрость: (как) можно использовать цель Aggregate для одновременного, несколько Build & Run? Возможно, можно добиться одновременного, множественного Build & Run с помощью .sh script с помощью xcodebuild? Любое другое возможное решение?

Ответы

Ответ 1

Я столкнулся с той же проблемой, поэтому я написал плагин Xcode, чтобы помочь в этом. Я нашел его более надежным и более простым для вызова, чем варианты AppleScript.

Плагин называется KPRunEverywhereXcodePlugin и доступен через Alcatraz или на GitHub: https://github.com/kitschpatrol/KPRunEverywhereXcodePlugin

New menu items

Надеюсь, это поможет!

Ответ 2

На самом деле это проще, чем я думал. Этот AppleScript вызывает некоторую боль из Xcode:

tell application "Xcode"
    activate
end tell

tell application "System Events"
    tell application process "Xcode"
        click menu item "1st iDevice Name" of menu 1 of menu item "Destination" of menu 1 of menu bar item "Product" of menu bar 1
        click menu item "Run" of menu 1 of menu bar item "Product" of menu bar 1
        delay 5
        click menu item "2nd iDevice Name" of menu 1 of menu item "Destination" of menu 1 of menu bar item "Product" of menu bar 1
        click menu item "Run" of menu 1 of menu bar item "Product" of menu bar 1
        delay 5
        click menu item "iPhone 6.1 Simulator" of menu 1 of menu item "Destination" of menu 1 of menu bar item "Product" of menu bar 1            
        click menu item "Run" of menu 1 of menu bar item "Product" of menu bar 1
    end tell
end tell
  • Сохраните выше AppleScript как .app. (Настройте delay на свой компьютер.)
  • Создайте новый Service в Automator: выберите Launch Application и выберите .app с предыдущего шага.
  • Сохранить Service с предыдущего шага и дать ему комбинацию клавиш. Совет: избегайте ярлыков с ^, так как это вызовет диалог: enter image description here

Конечно, это не является строго одновременным "Build and Run", но он уверен, что он путается вручную между получателями.

Ответ 3

Было бы неплохо иметь сразу несколько загрузок с Xcode. Однако, как я понимаю, aggregate позволяет вам скомпилировать несколько целей, а не запускать их.

Учитывая вторую часть вопроса (после редактирования), я могу указать вам на другой способ сделать это. У вас не будет прикрепленного xcode (но gdb в режиме консоли), и вы сможете сделать его одновременным на нескольких устройствах, хотя это не было основной целью. Это конкретное решение не работает с симулятором, но для других есть другие методы.

запуск приложения iOS из консоли Mac OS X

Ответ 4

Здесь script, который будет запускать все устройства, доступные в настоящее время в меню Product → Destination. NB: он полагается на следующие условия:

  • Устройства выбираются из меню Product → Destination (можно изменить в будущих версиях Xcode)
  • Элемент меню перед вашими устройствами называется "Мой Mac 64-бит" (может измениться в будущих версиях Xcode)
  • Пункт меню после того, как ваши устройства называются "iOS Simulator" (предположим, когда это может измениться?)

    tell application "Xcode"
        activate
    end tell
    
    tell application "System Events"
        tell process "Xcode"
            set deviceMenu to menu 1 of menu item "Destination" of menu 1 of menu bar item "Product" of menu bar 1
            set allUIElements to entire contents of deviceMenu
            set startAfterName to "My Mac 64–bit"
            set stopName to "iOS Simulator"
            set started to false
            repeat with anElement in allUIElements
                try
                    set menuName to name of anElement
                    if menuName is equal to stopName then
                        set started to false
                        exit repeat
                    else if menuName is equal to startAfterName then
                        set started to true
                    else if started then
                        click menu item menuName of menu 1 of menu item "Destination" of menu 1 of menu bar item "Product" of menu bar 1
                        click menu item "Run" of menu 1 of menu bar item "Product" of menu bar 1
                        delay 5
                    end if
                end try
            end repeat
        end tell
    end tell