在iOS模拟器中安装应用程序的脚本

sta*_*Err 9 shell command-line ios-simulator

我试图自动化构建应用程序,运行单元测试,最后运行UI测试的过程.

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

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

我试过了:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone\ Simulator.app/Contents/MacOS/iPhone\ Simulator -SimulateApplication MyApp.app/MyApp
Run Code Online (Sandbox Code Playgroud)

但这会打开一个名为"iOS模拟器无法找到要模拟的应用程序"的新查找器窗口.

sta*_*Err 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"
Run Code Online (Sandbox Code Playgroud)

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

  1. 改变这一行:

    TOPDIR="$HOME/Library/Application Support/iPhone Simulator/6.0/Applications/$UUID/"
    
    Run Code Online (Sandbox Code Playgroud)

    反映你正在使用的iPhone模拟器的版本即6.0/ 7.1.

  2. 将脚本保存installApp.shproject_name.app/文件夹中.

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

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

      cd path/to/project_name.app /

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

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


对于iOS8和新的XCode Apple改变了一些东西,并且很难通过命令行安装应用程序.它仍然可以做:

  1. 首先,您需要找到应用程序目录(假设您已安装应用程序): 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>
Run Code Online (Sandbox Code Playgroud)
  1. 如果你想为iPhone-6-Plus安装你的应用程序,这就是你要进行的目录.运行上面的shell脚本来安装应用程序.将TOPDIR路径更改为$HOME/Library/Developer/CoreSimulator/Devices/{UUID for device}/data/Containers/Bundle/Applications/$UUID/


Pal*_*tim 8

从Xcode 6开始,您应该可以使用它simctl来完成此任务.

1)获取可用设备列表:

xcrun simctl list devices
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

xcrun simctl install $DEVICE_UDID /path/to/your/app
Run Code Online (Sandbox Code Playgroud)

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

xcrun simctl install booted /path/to/your/app
Run Code Online (Sandbox Code Playgroud)

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

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

xcrun simctl erase all
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

for device in DEVICES ; do xcrun simctl install $device /path/to/app ; done
Run Code Online (Sandbox Code Playgroud)

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

for device in $DEVICES ; do xcrun simctl launch $device your.product.app.id ; done
Run Code Online (Sandbox Code Playgroud)