20

如何一次在多个目的地(例如,iPhone、iPad 和 iSimulator)运行一个项目Xcode 产品选项Xcode 多个目的地


有2个相关问题:

  1. Xcode 4 - 一键构建到多个设备?
  2. 一键在模拟器和手机上运行

1ˢᵗ 问题(据说)有答案,但我不知道应该如何使用目标Aggregate(如果这是正确的方向),显然 OP Josh Kahane 也不能;“答案”仍然以某种方式得到/仍然被接受。

2ⁿᵈ 问题被关闭为“重复”,好像 1ˢᵗ 问题提供了(可行的)答案。


添加了赏金:(如何)一个人可以Aggregate同时使用多个目标Build & Run?也许可以Build & Run通过一些.sh脚本使用xcodebuild?还有其他可能的解决方案吗?

4

5 回答 5

15

我遇到了同样的问题,所以我写了一个 Xcode 插件来帮助解决这个问题。我发现它比 AppleScript 选项更健壮且更容易调用。

该插件名为 KPRunEverywhereXcodePlugin,可通过Alcatraz或 GitHub 获得:https ://github.com/kitschpatrol/KPRunEverywhereXcodePlugin

新菜单项

希望这可以帮助!

于 2014-03-20T14:39:01.290 回答
11

它实际上比我想象的要简单。这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
  1. 将以上内容另存AppleScript.app. (delay根据您的机器自定义 s。)
  2. 创建一个新ServiceAutomator:从上一步中选择Launch Application并选择。.app
  3. 从上一步保存Service并给它一个键盘快捷键。提示:避免使用快捷键^,因为它会弹出这个对话框: 在此处输入图像描述

诚然,这并不是严格意义上的同时“构建和运行”,但它确实胜过在目的地之间手动进行琐事。

于 2013-05-09T14:50:22.203 回答
4

这是一个将在所有连接的 iOS 设备上构建和运行的脚本。要使用:

  1. 打开“自动化”。
  2. 创建一个新的“快速操作”。
  3. 为“工作流接收”选择“无输入”。
  4. 为应用程序选择 Xcode。
  5. 添加“运行 JavaScript”操作并粘贴脚本。
  6. 另存为“Run on All”,您现在可以从 Xcode 的 Xcode -> Services 菜单访问它。

Javascript:

function run(input, parameters)
{
    var xcode = Application("Xcode");
    var ws = xcode.activeWorkspaceDocument();
    var genericDest = null;
    var devices = [];
    ws.runDestinations().forEach(function(runDest)
    {
        if (runDest.platform() != "iphoneos")
            return;
        if (runDest.device().generic())
        {
            genericDest = runDest;
        }
        else
        {
            devices.push(runDest);
        }
    });
    devices.forEach(function(device)
    {
        ws.activeRunDestination = device;
        var buildResult = ws.run();
        while (true)
        {
            if (buildResult.completed())
                break;
            if (buildResult.buildLog() && buildResult.buildLog().endsWith("Build succeeded\n"))
                break;
            delay(1);
        }
        delay(1);
    });
}
于 2018-02-20T04:09:43.427 回答
1

使用 Xcode 一次上传多个文件确实很好。但是据我了解,aggregate仅允许您编译多个目标,而不能运行它们。

鉴于您问题的第二部分(编辑后),我可以为您指出另一种方法。您不会附加 xcode(但 gdb 处于控制台模式),并且您应该能够在多个设备上同时进行,尽管这不是主要目标。此特定解决方案不适用于模拟器,但还有其他方法。

从 Mac OS X 控制台启动 iOS 应用程序

于 2013-05-06T14:25:53.263 回答
0

这是一个脚本,它将运行您的 Product -> Destination 菜单中当前可用的所有设备。注意:它依赖于以下条件:

  1. 从 Product -> Destination 菜单中选择设备(在 Xcode 的未来版本中可能会更改)
  2. 设备前面的菜单项名为“My Mac 64-bit”(在未来的 Xcode 版本中可能会更改)
  3. 设备后的菜单项名为“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
    
于 2013-11-27T17:08:21.533 回答