2012-10-18 135 views
9

我試圖自動化構建應用程序,運行單元測試以及最終運行UI測試的過程。腳本在iOS模擬器中安裝應用程序

我正在通過命令行(xcodebuild -sdk iphonesimulator6.0)在某個目錄中構建應用程序。

如何通過命令行(在〜/庫/應用程序支持/ iPhone模擬器//應用程序中)將此應用程序安裝到iOS模擬器?

我想:

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

但是這將打開一個名爲「iPhone模擬器找不到模擬應用」新Finder窗口。

回答

18

我做了一個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路徑/到/ project_name.app/

    • 然後./installApp安裝該應用到模擬器。

我從傑弗裏·斯科菲爾德的理念:Run iOS Simulator from the Command Line


對於iOS8上和新的XCode蘋果改變了一些東西,並使其難以安裝通過應用命令行。它仍然是有可能做到:

  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

  • 將有與上述結構中的多個UUID父目錄。每個UUID對應於不同設備的模擬器。打開最上面的目錄,你會發現一個device.plist文件。此文件將包含它模擬設備:
  • <dict> 
        ... 
        <string>34792D41-55A9-40F5-AAC5-16F742F1F3E4</string> 
        <string>com.apple.CoreSimulator.SimDeviceType.iPhone-6-Plus</string> 
        ... 
    </dict> 
    
  • 如果你想安裝你的iPhone-6-PLUS的應用程序是這樣的目錄你將執行它。運行上面的shell腳本來安裝應用程序。更改TOPDIR路徑$HOME/Library/Developer/CoreSimulator/Devices/{UUID for device}/data/Containers/Bundle/Applications/$UUID/
  • +0

    不幸的是,這似乎不再工作(我使用iOS 7.1) – thomers

    +0

    對不起,我應該更具體。目錄仍然存在,文件被複制,但模擬器不會在跳板上顯示應用程序。 – thomers

    +1

    @thomers它可以與iOS 7.1一起使用,您只需將此腳本放入'project_name.app'文件夾並將'6.0'重命名爲'7.1'(但它經常崩潰)。然後你從該目錄運行'installApp'。所以,如果我有我的'project.app /'裏面有一個'project'。我會'cd project.app /'並運行'./installApp project'。我也將這個評論留給未來讀者更好的文檔。 – film42

    4

    由於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)打開一個仿真實例對每個測試:

    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 
    
    相關問題