如何在 Xcode 中一次在多个目的地上“构建和运行”?

Posted

技术标签:

【中文标题】如何在 Xcode 中一次在多个目的地上“构建和运行”?【英文标题】:How to 'Build & Run' on multiple destinations at once in Xcode? 【发布时间】:2013-04-22 04:03:48 【问题描述】:

如何多个目的地(例如,iPhone、iPad 和 iSimulator)同时运行一个项目?


有2个相关问题:

    Xcode 4 - One Click Build to Multiple Devices? Run on simulator and phone with one click

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

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


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

【问题讨论】:

2019 年,Apple 仍然没有提供内置方法来执行此操作。 2021 年,Apple 仍然没有提供内置方法来执行此操作。 2022 年,Apple 仍然没有提供内置方法来执行此操作。 【参考方案1】:

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

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

希望这会有所帮助!

【讨论】:

嗯,谢谢你的脚本,安装得很好,但是当我选择 Run Everywhere 时,它​​只是构建,但不能在我插入的任何设备上运行? @Smikey,我刚刚在 Xcode 6 上再次测试了该插件,看起来还不错。如果你仍然有这个问题,你能在 GitHub 上打开一个包含更多信息的问题吗? github.com/kitschpatrol/KPRunEverywhereXcodePlugin 一键安装,一切正常!如果您还可以包括其中一个模拟器来运行,那将是完美的。 我有没有告诉过你你很棒?我不认为我有。你真棒。谢谢。 如何在启动时处理这样的错误?:[MT] PluginLoading:所需的插件兼容性 UUID E969541F-E6F9-4D25-8158-72DC3545A6C6 用于路径 '~/ 的插件Library/Application Support/Developer/Shared/Xcode/Plug-ins/KPRunEverywhereXcodePlugin.xcplugin' 不存在于 DVTPlugInCompatibilityUUIDs【参考方案2】:

实际上比我想象的要简单。这个AppleScriptXcode 有点痛苦:

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。 (为您的机器自定义 delays。) 在Automator 中创建一个新的Service:选择Launch Application 并选择上一步中的.app。 保存上一步中的Service 并为其提供键盘快捷键。提示:避免使用 ^ 的快捷方式,因为它会弹出此对话框:

当然,这并不是严格意义上的同时“构建和运行”,但它肯定胜过在目的地之间手动操作。

【讨论】:

这还能用吗?我试过这样做,OSX 告诉我它不再支持经典模式“因为不再支持经典环境” @joon,在最新的 Mavericks 上运行良好。不过不确定优胜美地。 (虽然这不是重点,因为我认为 Classic 指的是 OS 9。) @courteous 这太好了,我直接从自动机触发它(这很好),因为在 El Capitan 我收到以下错误“您无法打开应用程序,因为 PowerPC 应用程序没有支持时间更长。”并且该服务没有出现在 Xcode 应用程序的服务菜单中……仍然很有帮助! 在莫哈韦沙漠上运行良好【参考方案3】:

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

    打开“Automator”。 创建一个新的“快速操作”。 为“工作流接收”选择“无输入”。 为应用程序选择 Xcode。 添加“运行 javascript”操作并粘贴脚本。 另存为“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);
    );

【讨论】:

嗨,这对我不起作用。我在 xcode 中选择了服务,但没有任何反应。我该如何测试并检查问题所在? 对我来说效果很好。需要注意的一件事是,在 Mojave 中,Automator 步骤的名称似乎略有不同。对于第 2 步而不是“服务”选择“快速操作”,对于第 3 步“工作流接收” 谁能指点我这个文档?除了platform(),我们还有什么其他API?【参考方案4】:

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

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

launching iOS App from Mac OS X console

【讨论】:

你会如何为 LLDB 做呢?包括模拟器也很棒。 @aggregate 目标,是的,这也是我的理解。我无法理解为什么与 1ˢᵗ 相关的问题有一个公认的答案。 由于 GDB 只是从终端启动,使用 lldb 将是找出正确命令的问题。【参考方案5】:

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

    设备是从 Product -> Destination 菜单中选择的(在 Xcode 的未来版本中可能会更改) 设备前面的菜单项名为“My Mac 64-bit”(在未来的 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
    

【讨论】:

Oldie,但 goodie 已被 github.com/kitschpatrol/KPRunEverywhereXcodePlugin 取代。

以上是关于如何在 Xcode 中一次在多个目的地上“构建和运行”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xcode 7 中一次删除多个集成?

在R中一次在目录内创建子目录

如何在Xcode的Interface Builder中一次编辑多个约束

Xcode:如何在应用程序中一次更改所有字体?

如何一次在多个表中添加行?

如何在 Firestore 中一次创建/更新多个文档