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

时间:2012-10-18 21:27:17

标签: 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

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

2 个答案:

答案 0 :(得分: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模拟器版本,即6.0 / 7.1

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

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

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

        

      cd path / to / project_name.app /

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

  4. 我从杰弗里·斯科菲尔德那里得到了这个想法:Run iOS Simulator from the Command Line


    对于 iOS8和新的XCode ,Apple更改了一些内容,并且难以通过命令行安装应用程序。仍然可以这样做:

    1. 首先,您需要找到应用目录(假设您已安装应用):find ~/Library/Developer/CoreSimulator/Devices -name '*.app'

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

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

      1. 将有多个具有上述结构的UUID父目录。每个UUID对应于不同设备的模拟器。打开顶级目录,您将找到device.plist文件。该文件将包含它正在模拟的设备:
      2. <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/

答案 1 :(得分:7)

从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