【问题标题】:Script to install app in iOS Simulator在 iOS 模拟器中安装应用程序的脚本
【发布时间】:2012-10-18 21:27:16
【问题描述】:

我正在尝试自动化构建应用程序、运行单元测试以及最终运行 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 模拟器找不到要模拟的应用程序”的新查找器窗口。

【问题讨论】:

    标签: shell command-line ios-simulator


    【解决方案1】:

    我制作了一个将应用程序安装到模拟器的 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. 在您的project_name.app/ 文件夹中将脚本另存为installApp.sh

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

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

        cd path/to/project_name.app/

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

    我的想法来自 Jeffrey Scofield:Run iOS Simulator from the Command Line


    对于 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>
    
    1. 如果您想为 iPhone-6-Plus 安装您的应用程序,您可以在此目录中执行此操作。运行上面的 shell 脚本来安装应用程序。将TOPDIR 路径更改为$HOME/Library/Developer/CoreSimulator/Devices/{UUID for device}/data/Containers/Bundle/Applications/$UUID/

    【讨论】:

    • 可悲的是,这似乎不再起作用(我使用的是 iOS 7.1)
    • 对不起,我应该更具体一些。目录还在,文件被复制了,但是模拟器没有在跳板上显示应用。
    • @thomers 它确实适用于 iOS 7.1,您只需将此脚本放入 project_name.app 文件夹并将 6.0 重命名为 7.1(但它经常崩溃)。然后你从那个目录运行installApp。所以如果我的project.app/ 里面有一个project。我会cd project.app/ 并运行./installApp project。我也将此评论作为更好的文档留给未来的读者。
    • @stackErr 这是应用程序,脚本运行良好。我意识到我犯了一个错误,因为我从.ipa Payload 中提取了我的应用程序,并且总是会崩溃,因为它是为 iPhone arm 架构而不是 x86 iPhone Simulator 编译的。
    • 用iOS8,看起来很难。
    【解决方案2】:

    从 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 2014-04-16
      • 2014-07-16
      • 2011-05-23
      • 2013-09-30
      • 2011-06-17
      相关资源
      最近更新 更多