2014-10-19 49 views
117

我的iOS應用有兩個不同的目標。是否可以在模擬器的兩個不同實例上同時運行這兩個應用程序? 如果它不需要Xcode調試器的好處就沒關係。 到目前爲止,我發現的唯一解決方案是安裝兩個版本的XCode,但這是一個非常沉重/耗費空間的解決方案。Xcode6:運行模擬器的兩個實例

+3

的[有沒有辦法使用的Xcode/iPhone的SIM模擬多個iPhone手機?(可能重複http://stackoverflow.com/questions/896487/is-there-a-way-to- simulate-multiple-iphones-using-xcode-iphone-sim) – rebello95 2014-10-19 01:40:11

+3

這是一個重複的問題,但@ i40west的答案實際上更好。 – vintagexav 2014-10-20 06:12:18

+0

其實,這裏的答案更好https://stackoverflow.com/questions/896487/is-there-a-way-to-simulate-multiple-iphones-using-xcode-iphone-sim/30607358#30607358 – 2015-06-02 22:21:50

回答

224

您可以從命令行運行iOS模擬器的兩個實例。他們不會被附加到Xcode調試 - 事實上,如果你沒有運行Xcode,它似乎只能工作。

首先,您需要從Xcode運行模擬器中的應用程序,以便將其安裝在模擬器中。確保你運行的是最終將使用的模擬器

現在打開一個終端窗口,並執行此操作。

cd /Applications/Xcode.app/Contents/Developer/Applications 
open -n iOS\ Simulator.app 
open -n iOS\ Simulator.app 

更新的Xcode 7:在Xcode 7模擬器的應用程序的名稱發生了變化,所以它的這個代替:

cd /Applications/Xcode.app/Contents/Developer/Applications 
open -n Simulator.app 
open -n Simulator.app 

當第二次啓動,你會得到一個錯誤警報。只要解僱它並從「硬件」»「設備」中選擇不同的設備。現在你有兩個模擬器在運行,並且你已經安裝在Xcode上的任何應用程序都會在那裏。

+7

嘿嘿謝謝,這是一個好主意,但不幸的是它說第二個模擬器的「無法在當前狀態下引導設備:引導」。我看到兩個模擬器,但第二個模擬器的屏幕仍然保持黑色,即使在放棄警報之後。 – vintagexav 2014-10-19 02:11:44

+0

這就是我正在談論的錯誤警報。在我解僱它後,我的第二個模擬器啓動。如果你的沒有,我不知道爲什麼。 – i40west 2014-10-19 02:16:47

+6

也許這是因爲我的XCode目前正在運行。也許你應該添加該指令到你的答案:) 也適用於只使用兩個不同的模擬硬件(例如:iPhone 5和iPhone 5s) – vintagexav 2014-10-19 02:18:03

5

您可以爲不同的硬件配置文件運行模擬器的多個實例並進行調試。首先,您需要從XCode爲每種硬件類型(iPhone 6,iPad等)運行您的應用程序以將其安裝到模擬器實例中。然後像上面解釋的那樣運行模擬器實例和您的應用程序。要調試它,您可以將調試器附加到從「XCode-> Debug-> Attach to Process」菜單中運行的進程。您可以檢查此博客條目爲例 :http://oguzdemir.dualware.com/?p=43

9

成功測試了i40west的解決方案可手動啓動模擬器,但似乎傻了,在這個時代,在iOS模擬器需要不同的Xcode版本和運行的併發當不同的設備類型來自命令行的測試(略有不同的用例,但與原始問題有關)。

請參考這裏的蘋果製品,其是最相關的命令行構建和測試: https://developer.apple.com/library/ios/technotes/tn2339/_index.html

多個併發測試一直很好對我們來說,如果經過正確--args - 到的iOS simulator.app「在運行帶有正確的'-destination'值的'xcodebuild test'命令之前,使用'xcrun simctl list'輸出中的UUID值匹配simultator啓動,並設置DEVELOPER_DIR環境變量以選擇不同的XCode版本二進制文件(即Xcode 6.1的基本路徑和6.4)

需要在同一臺物理機器和同一個iOS模擬器上進行併發單元測試的原因iPad或iPhone等設備以及相同的Xcode版本主要用於支持任何iOS項目的CI(持續集成),因此同一個構建系統可以同時運行多個應用程序的多個構建版本(我們公司有30個應用程序)功能分支上的簽入由Bamboo代理自動掃描和構建,無需等待其他正在運行的構建完成 - 如果啓用,Bamboo在自動發現的功能分支上支持此類自動構建。

至於在運行多個併發測試時會發生什麼,我們在不同的終端連續運行兩次'xcodebuild測試'命令。應用程序窗口,結果只有一個模擬器窗口出現,並且在最簡單的測試中測試失敗。

當我們使測試啓動的入口標準變得複雜時,爲每個模擬和測試啓動使用不同的Xcode版本,當按照手冊頁(xcodebuild測試)使用DEVELOPER_DIR時,我們指定了在兩個獨立窗口中打開的不同設備,但結果是第一個窗口中的任何運行測試都會被第二個iOS模擬器窗口中斷。

似乎有一個公共共享資源正在阻礙,不確定它是有意的還是隻是一個新功能,需要超過幾天的認真思考才能更好地實現併發測試運行沒有不利影響。

我們不想使用虛擬機來解決模擬限制問題,因爲我們的經驗和其他人的經驗是,iOS在具有大量小文件的虛擬機上構建性能比物理硬件慢。由於VMware軟件和Apple硬件和/或固件相結合的I/O問題,虛擬機通常會使構建速度下降很多。對於我們來說很抱歉,但對我們來說,虛擬機的性能並不理想 - 這個虛擬的網站向我們提供了有關如何在Mac Mini上爲我們的構建服務器場安裝ESXi 5.5的說明。

我們已經經歷過在Mac Mini上ESXi 5.5的構建性能問題,即使SSD的性能比裸機還要低2倍或更多(即10分鐘的裸機構建需要20個VM)。關於爲什麼,請參閱下面的文章。

https://corner.squareup.com/2015/07/ios-build-infrastructure.html

1臺SIM設備的在時間xcodebuild聯編單元測試的限制嚴重降低生產效率和指數地增加了蘋果和生態系統顯著成本。

蘋果不支持併發性以支付更多硬件購買的成本應該仔細考慮,這樣就可以將開發人員速度的風險與其他競爭對手相比較,這些競爭對手在模擬和EULA方面的限制較少。

併發測試在同一用戶登錄中的優勢(大多數ci系統的工作原理)是蘋果品牌應用商店應用的質量,這反過來又是使人們首先購買iOS設備的部分原因。糟糕的軟件質量使得整個品牌在iOS模擬器中更加呆板和併發支持似乎成爲支持生態系統的智能方式。這個問題的一個必然結果是最近的改進,例如Apple的Xcode服務器CI,以及Xcode 7中Xcode的自動UI測試功能。

鼓勵不必要的開銷讓人們購買大量的硬件,設置,配置,更何況許多人需要支持所有的機器,網絡和電源點等,最終可能會損害蘋果的利潤,因爲並非每個人都像蘋果一樣,並且能夠支付MacPro或Mac Mini的機架只是爲了支持模擬器上的並行測試。模擬器的重點在於避免使用硬件並加速測試。

再加上EULA對虛擬機的限制,使得Mac Pro上虛擬機的情況非常糟糕。如果多個模擬器可以運行,這種硬件類型會很有吸引力,但由於不支持併發單元測試(除了上述兩種情況 - 不同的XCode版本和不同的模擬器設備),我們可能會堅持使用Mac Mini構建基礎架構。

Apple的這些sim和EULA限制不僅使構建管道變慢,而且增加了不必要的複雜性和成本。對於小應用程序來說,這可能不是那麼重要,但隨着應用程序規模和複雜性的增長,構建過程可能需要花費一個多小時(我聽說Facebook iOS構建可能需要很長時間)。沒有人想等一個小時才能知道構建是否通過。

我們知道在Mac Minis上運行ESXI虛擬機這樣的黑客解決方案在OS X和xcodebuild上的性能不佳,而在大型項目上,構建時間超過10分鐘的Mac Book Pro或Mac Mini,或裸機上不同的登錄賬戶,以便能夠在相同的Xcode版本和相同的模擬器設備上運行併發測試。

儘管ESXi運行良好,但並未得到正式支持。 VMware可能不支持Mac Mini硬件的原因之一是缺少ECC內存,儘管Mac Pro受支持,因爲它具有ECC內存,但與Mac Mini相比,iOS版本與裸機相比速度更慢在相同的硬件和軟件配置上進行測試(只需更改VM與運行OS X的裸機)。 MacPro目前尚未經過我們的測試。根據我們的經驗,VMware Fusion在性能方面也相當慢。

更重要的是,當上述問題混雜在一起時,開發人員需要等待更長的時間,除非機器池足夠大以支持變化的pipleline(每2個開發人員一個CI構建,機器與開發人員的比例很高)。 CI構建機器應該能夠運行比1更多的併發構建和更多的併發測試。

有關iOS模擬器的其他觀察之一是,它們似乎是一項正在進行中的工作,即使在7個主要版本之後也完全未完成。 'xcrun simctl'子命令有一個--set選項,它可以允許某種類型的靈活性,但不確定什麼可能的值是有效的,並且與--noxpc相同。沒有人應該需要猜測適當的值,而且,應該有一個涵蓋此選項的手冊頁,也可能是示例。這兩個有趣的選項有哪些用例?

你可能會說,哦,不應用程序的設計應該有一個大的足跡,值得併發測試運行,並利用基於XPC更好的架構,單片應用程序是問題。這很可能是正確的,它並不像務實的解決方案,我們可以希望,如果你有20+的應用程序建立在相同的基礎設施問題依然。

製作機構和過程作爲一般和可擴展的,儘可能爲更高的吞吐量,需要在模擬器(表觀+核心開發者)一些工作。它還要求所有Apple模擬器開發人員和模擬器產品所有者(S)需要高度協作以正確地爲產品積壓訂購此問題以獲得任何關注:-)

4

這裏有一個腳本,用於在您的計算機上列出模擬器的UDID並運行它。將下面的代碼複製到擴展名爲「.sh」的文件中並在終端中運行。

如何:將UDID

步驟1.列出與選項1設備和複製想

第2步。運行選項2並粘貼UDID,然後按回車鍵

注意:確認其中包含您的模擬器的路徑是確定的(如果不是由您的路徑替換)

#!/bin/sh 
PS3='Type the number of your choice (1, 2 or 3) and press Enter: ' 
options=("List Devices" "Run Simulator" "Quit") 
select opt in "${options[@]}" 
do 
    case $opt in 
     "List Devices") 
      xcrun simctl list devices 
      echo "\033[1m\n\nCopy the UDID in parentheses of the device which you want run and launch option 2 (Run Simulator)\033[0m" 
      ;; 
     "Run Simulator") 
      read -p 'Type device UDID which you want launch: ' currentDeviceUDID 
      open -n /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app/ --args -CurrentDeviceUDID $currentDeviceUDID 
      ;; 
     "Quit") 
      break 
      ;; 
     *) echo invalid option;; 
    esac 
done 

謝謝

16

Xcode 9

Xcode 9現在支持啓動多個模擬器。這是在WWDC 2017發佈的。

只要去改變Xcode中的模擬器,Cmd + R,你會看到一個新的模擬器彈出。

enter image description here