11

我正在尝试自动化构建应用程序、运行单元测试以及最终运行 UI 测试的过程。

我正在某个目录中通过命令行(xcodebuild -sdk iphonesimulator6.0)构建应用程序。

如何通过命令行(在 ~/Library/Application Support/iPhone Simulator//Applications 中)将此应用程序安装到 iOS 模拟器?

我试过:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone\ Simulator.app/Contents/MacOS/iPhone\ Simulator -SimulateApplication MyApp.app/MyApp

但这会打开一个名为“iOS 模拟器找不到要模拟的应用程序”的新查找器窗口。

4

2 回答 2

19

我制作了一个将应用程序安装到模拟器的 shell 脚本。

#!/bin/sh
# Pick a uuid for the app (or reuse existing one).
if ! [ -f installApp.uuid ]; then
    uuidgen > installApp.uuid
fi
UUID=$(cat installApp.uuid)
#create supporting folders
TOPDIR="$HOME/Library/Application Support/\
iPhone Simulator/6.0/Applications/$UUID/"
mkdir -p "$TOPDIR"
mkdir -p "$TOPDIR/Documents"
mkdir -p "$TOPDIR/Library"
mkdir -p "$TOPDIR/tmp"
mkdir -p "$TOPDIR/$1.app"

#copy all the app file to the simulators directory
cp -r * "$TOPDIR/$1.app"

如何使用此脚本安装应用程序:

  1. 更改此行:

    TOPDIR="$HOME/Library/Application Support/iPhone Simulator/6.0/Applications/$UUID/"
    

    以反映您正在使用的 iPhone Simulator 版本,即6.0/ 7.1

  2. 将脚本保存installApp.sh在您的project_name.app/文件夹中。

  3. 打开终端窗口并installApp从项目目录运行。

    • 所以如果我有我project_name.app/的里面有一个项目。在终端输入:

      cd path/to/project_name.app/

    • 然后./installApp将应用程序安装到模拟器。

我从 Jeffrey Scofield 那里得到了这个想法:从命令行运行 iOS 模拟器


对于iOS8 和新的 XCode, Apple 改变了一些东西,使得通过命令行安装应用程序变得困难。仍然可以这样做:

  1. 首先你需要找到app目录(假设你已经安装了apps):find ~/Library/Developer/CoreSimulator/Devices -name '*.app'

  2. 这将列出安装了自定义应用程序的所有路径。例如

/34792D41-55A9-40F5-AAC5-16F742F1F3E4/data/Containers/Bundle/Application/4BA2A285-6902-45A8-9445-FC3E46601F51/YourApp.app

  1. 将有多个具有上述结构的 UUID 父目录。每个 UUID 对应于不同设备的模拟器。打开顶层目录,你会发现一个device.plist文件。该文件将包含它正在模拟的设备:
<dict>
    ...
    <string>34792D41-55A9-40F5-AAC5-16F742F1F3E4</string>
    <string>com.apple.CoreSimulator.SimDeviceType.iPhone-6-Plus</string>
    ...
</dict>
  1. 如果您想为 iPhone-6-Plus 安装您的应用程序,这是您要在其中执行此操作的目录。运行上面的 shell 脚本来安装应用程序。TOPDIR将路径更改为$HOME/Library/Developer/CoreSimulator/Devices/{UUID for device}/data/Containers/Bundle/Applications/$UUID/
于 2012-10-19T20:55:43.313 回答
13

从 Xcode 6 开始,您应该能够使用它simctl来完成此操作。

1)获取可用设备列表:

xcrun simctl list devices

1a)假设您已经jq安装,您可以使用它来仅获取那些实际可用的设备:

xcrun simctl list devices -j \
| jq -rc '.[] | .[] | .[] | select( .availability | contains( "(available)" ) ) '

1b) 甚至通过 iPhone 或 iPad 进一步过滤:

xcrun simctl list devices -j \
| jq -rc '.[] | .[] | .[] | select( .name | contains( "iPhone" ), contains( "iPad" ) ) | select( .availability | contains( "(available)" ) ) '

2) 获得要安装到的设备的 UDID 后:

xcrun simctl install $DEVICE_UDID /path/to/your/app

2a) 或者,如果您只想安装到已启动的设备:

xcrun simctl install booted /path/to/your/app

如果您想在所有设备上运行相同的应用程序,这真的很方便:

1)重置/擦除所有模拟器:

xcrun simctl erase all

2) 为每个测试打开一个 Simulator 实例:

open -n /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app
(Ignore the 'Booted' error and switch hardware.)

3) 获取我们想要安装到的可用设备的 UDID:

DEVICES=$( xcrun simctl list devices -j | jq -rc '.[] | .[] | .[] | select( .name | contains( "iPhone" ), contains( "iPad" ) ) | select( .availability | contains( "(available)" ) ) | select( .state == "Booted" ) | .udid ' )

4) 安装应用程序(必须为相应的模拟器 SDK 构建):

for device in DEVICES ; do xcrun simctl install $device /path/to/app ; done

5) 为方便起见,在每台设备上启动应用程序:

for device in $DEVICES ; do xcrun simctl launch $device your.product.app.id ; done
于 2016-10-06T17:02:07.467 回答