Xcode6: รันสองอินสแตนซ์ของตัวจำลอง


122

ฉันมีเป้าหมายสองเป้าหมายที่แตกต่างกันสำหรับแอป iOS ของฉัน เป็นไปได้หรือไม่ที่จะเรียกใช้ทั้งสองแอปพร้อมกันในสองอินสแตนซ์ของเครื่องจำลอง เป็นเรื่องปกติหากไม่ต้องการประโยชน์จากการดีบักเกอร์ของ Xcode จนถึงตอนนี้ทางออกเดียวที่ฉันพบคือการติดตั้ง XCode สองเวอร์ชัน แต่นั่นเป็นโซลูชันที่หนักมาก / ใช้พื้นที่มาก



3
เป็นคำถามที่ซ้ำกัน แต่คำตอบของ @ i40west ดีกว่าจริงๆ
vintagexav

ที่จริงคำตอบที่นี่ดีกว่าstackoverflow.com/questions/896487/…
FlowUI SimpleUITesting.com

คำตอบ:


224

คุณสามารถเรียกใช้โปรแกรมจำลอง iOS สองอินสแตนซ์ได้จากบรรทัดคำสั่ง พวกเขาจะไม่เชื่อมต่อกับการดีบัก Xcode แต่ดูเหมือนว่าจะใช้งานได้ก็ต่อเมื่อคุณทำโดยที่ Xcode ไม่ทำงานเลย

ขั้นแรกคุณต้องเรียกใช้แอปในเครื่องจำลองจาก Xcode เพื่อติดตั้งในเครื่องจำลอง ตรวจสอบให้แน่ใจว่าคุณใช้เครื่องจำลองแบบเดียวกับที่คุณจะใช้ในท้ายที่สุด

ตอนนี้เปิดหน้าต่าง Terminal แล้วทำสิ่งนี้

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

6
อาจเป็นเพราะ XCode ของฉันกำลังทำงานอยู่ บางทีคุณควรเพิ่มคำสั่งนั้นในคำตอบของคุณ :) นอกจากนี้ยังใช้งานได้เฉพาะเมื่อใช้ฮาร์ดแวร์จำลองที่แตกต่างกันสองเครื่อง (เช่น iPhone 5 และ iPhone 5s)
vintagexav

13
อย่างไรก็ตามในการเรียกใช้เครื่องจำลองที่แตกต่างกันสองเครื่องอย่างถูกต้องด้วยฮาร์ดแวร์จำลองที่แตกต่างกันสองเครื่องและหลีกเลี่ยง "ไม่สามารถบูตอุปกรณ์ในสถานะปัจจุบัน: บูต" คุณต้องเปลี่ยนเวอร์ชันของโปรแกรมจำลองแรกหลังจากเริ่มโดยคลิกที่ตัวจำลอง> ฮาร์ดแวร์ ข้อมูลเพิ่มเติม: stackoverflow.com/questions/24023029/…
vintagexav

1
ขอบคุณ! ฉันใช้เครื่องจำลอง 2 เครื่อง (เครื่องหนึ่งใช้ iPhone5, อีกเครื่อง iPhone6) เพื่อทดสอบการซิงค์ iCloud โปรดทราบว่าการซิงค์ของ Simulator เป็นเรื่องที่ยุ่งยากดังนั้นเพื่อวัตถุประสงค์ในทางปฏิบัติคุณต้องบังคับให้ซิงค์ iCloud โดยใช้ Debug-> Trigger iCloud Sync ดังนั้นด้วยอุปกรณ์ทั้งสองนี้ที่เรียกใช้แอปพลิเคชันของฉันในหน้าต่างจำลองที่แยกจากกันฉันทำการเปลี่ยนแปลงบน device1 (iphone5) บังคับให้ซิงค์สำหรับอุปกรณ์ 1 คลิกไปที่อุปกรณ์ 2 (iPhone6) และบังคับให้ซิงค์ และวิโอลาตอนนี้คุณสามารถทดสอบการซิงค์ iCloud ในโปรแกรมจำลองได้แล้ว การเปิดคอนโซลของโปรแกรมจำลองจะมีประโยชน์เนื่องจากคุณสามารถดูกิจกรรมการซิงค์พื้นหลังเมื่อเกิดขึ้น
ObjectiveTC

3
ฉันดีใจที่พบคำตอบของคุณขอบคุณ! แค่อยากจะพูดถึงว่าเห็นได้ชัดว่าคุณสามารถให้ XCode ทำงานในเวลาเดียวกันได้โดยมีคำเตือนต่อไปนี้: 1. ตัวจำลองที่สองต้องมีการกำหนดค่าที่แตกต่างจากตัวแรก (หลังจากป๊อปอัปบ่นคุณต้องเปลี่ยนเวอร์ชันอุปกรณ์ของเครื่องจำลอง จากเมนูฮาร์ดแวร์) 2. เมื่อใดก็ตามที่คุณหยุดและรีสตาร์ทเครื่องจำลองแรกจาก XCode ตัวที่สองจะหยุดและเริ่มต้นใหม่ (และคุณจะต้องเปลี่ยนเวอร์ชันอุปกรณ์อีกครั้ง)
Alex

26

Xcode 9+

Xcode 9 รองรับการเปิดตัวเครื่องจำลองหลายตัวแล้ว ประกาศใน WWDC 2017

เพียงไปและเปลี่ยนโปรแกรมจำลองใน Xcode, Cmd + Rแล้วคุณจะเห็นตัวจำลองใหม่โผล่ขึ้นมา

ใส่คำอธิบายภาพที่นี่


9

ประสบความสำเร็จในการทดสอบว่าโซลูชันของ i40west ทำงานเพื่อเปิดโปรแกรมจำลองด้วยตนเอง แต่ดูเหมือนจะโง่ที่ในยุคนี้และยุคนี้โปรแกรมจำลอง iOS ต้องใช้เวอร์ชัน Xcode ที่แตกต่างกันและประเภทอุปกรณ์ที่แตกต่างกันเมื่อเรียกใช้การทดสอบพร้อมกันจากบรรทัดคำสั่ง (กรณีการใช้งานที่แตกต่างกันเล็กน้อย แต่เกี่ยวข้องกับคำถามดั้งเดิมที่ด้านบน )

ดูบทความของ Apple ที่นี่ซึ่งเกี่ยวข้องกับการสร้างและการทดสอบบรรทัดคำสั่งมากที่สุด: https://developer.apple.com/library/ios/technotes/tn2339/_index.html

การทดสอบพร้อมกันหลายรายการทำงานได้ดีสำหรับเราหากผ่าน --args - ไปที่ 'iOS simulator.app' ที่ถูกต้องก่อนที่จะเรียกใช้คำสั่ง 'xcodebuild test' ด้วยการเปิดตัวจำลองการจับคู่ค่า '-destination' ที่ถูกต้องพร้อมค่า UUID จากเอาต์พุตของ 'xcrun simctl list 'และการตั้งค่าตัวแปรสภาวะแวดล้อม DEVELOPER_DIR เพื่อเลือกไบนารีเวอร์ชัน XCode ที่แตกต่างกัน (เช่นพา ธ ฐานไปยัง Xcode 6.1 และ 6.4)

เหตุผลที่ต้องทดสอบหน่วยพร้อมกันบนเครื่องจริงเครื่องเดียวกันและอุปกรณ์จำลอง iOS เดียวกันเช่น iPad หรือ iPhone และ Xcode เวอร์ชันเดียวกันเป็นหลักเพื่อรองรับ CI (การผสานรวมอย่างต่อเนื่อง) ของโปรเจ็กต์ iOS ใด ๆ โดยระบบบิลด์เดียวกันสามารถรันได้มากกว่า 1 บิวด์จากหลาย ๆ แอพ (บริษัท ของเรามี 30 แอพหรือมากกว่านั้น) ต่อครั้งเมื่อเช็คอินที่สาขาฟีเจอร์จะถูกสแกนและสร้างโดยอัตโนมัติโดย Bamboo agent โดยไม่จำเป็นต้องรอให้บิลด์อื่น ๆ ทำงานเสร็จสมบูรณ์ - Bamboo รองรับการสร้างอัตโนมัติประเภทนี้ในระบบอัตโนมัติ - ค้นพบสาขาคุณลักษณะหากเปิดใช้งาน

สำหรับสิ่งที่เกิดขึ้นเมื่อเรียกใช้การทดสอบพร้อมกันหลายรายการเราเรียกใช้คำสั่ง 'xcodebuild test' หลายคำสั่งสองครั้งติดต่อกันในหน้าต่าง Terminal.app ที่แตกต่างกันผลลัพธ์คือหน้าต่างจำลองเพียงหน้าต่างเดียวปรากฏขึ้นและการทดสอบล้มเหลวในการทดสอบที่ง่ายที่สุด

เมื่อเราทำให้เกณฑ์การเข้าสู่การทดสอบของเราซับซ้อนขึ้น Xcode เวอร์ชันที่แตกต่างกันสำหรับแต่ละซิมและการเปิดตัวทดสอบเมื่อใช้ DEVELOPER_DIR ตาม man pages (xcodebuild test) เรากำลังระบุอุปกรณ์ที่แตกต่างกันซึ่งเปิดในสองหน้าต่างแยกกัน แต่ผลลัพธ์ก็คือ การทดสอบที่ทำงานอยู่ในหน้าต่างแรกจะถูกขัดจังหวะโดยหน้าต่างจำลอง iOS ที่สอง

ดูเหมือนว่าจะมีทรัพยากรที่ใช้ร่วมกันทั่วไปภายใต้ประทุนที่กำลังเข้ามาไม่แน่ใจว่ามีจุดมุ่งหมายหรือเป็นเพียงคุณลักษณะใหม่ที่ต้องใช้ความคิดอย่างจริงจังมากกว่าสองสามวันในการดำเนินการทดสอบพร้อมกันให้ดีขึ้นโดยไม่มีผลกระทบในทางลบ

เราไม่ต้องการใช้ VM เพื่อหลีกเลี่ยงข้อ จำกัด ของซิมเนื่องจากประสบการณ์ของเราและของคนอื่น ๆ โดยทั่วไปคือ iOS สร้างประสิทธิภาพบน VM ที่มีไฟล์ขนาดเล็กจำนวนมากช้ากว่าฮาร์ดแวร์จริง โดยทั่วไปแล้ว VM จะชะลอการสร้างลงอย่างมากเนื่องจากปัญหา I / O ในการรวมกันของซอฟต์แวร์ VMware และฮาร์ดแวร์และ / หรือเฟิร์มแวร์ของ Apple ขออภัยแทบสลัม แต่สำหรับเรา VMs ทำงานได้ไม่ดี - เว็บไซต์แทบสลัมได้ให้คำแนะนำเกี่ยวกับวิธีการติดตั้ง ESXi 5.5 บน Mac Mini สำหรับสร้างฟาร์มของเรา

เราประสบปัญหาประสิทธิภาพการทำงานของการสร้าง ESXi 5.5 บน Mac Mini ช้ากว่าโลหะเปล่าแม้จะใช้ SSD ด้วยปัจจัย 2 หรือมากกว่า (เช่นการสร้างแบบ baremetal 10 นาทีใช้เวลา 20 บน VM) อ้างถึงบทความ Squareup ด้านล่างเกี่ยวกับสาเหตุ

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

ข้อ จำกัด ของอุปกรณ์ซิม 1 เครื่องต่อครั้งสำหรับการทดสอบหน่วย xcodebuild ช่วยลดประสิทธิภาพการทำงานอย่างมากและเพิ่มต้นทุนจำนวนมากให้กับ Apple และระบบนิเวศ

ค่าใช้จ่ายของ Apple ในการไม่สนับสนุนการใช้งานพร้อมกันเพื่อปรับการซื้อฮาร์ดแวร์ให้มากขึ้นควรได้รับการพิจารณาอย่างรอบคอบโดยชั่งน้ำหนักความเสี่ยงที่จะสูญเสียความเร็วของนักพัฒนาเมื่อเทียบกับคู่แข่งรายอื่นที่มีข้อ จำกัด น้อยกว่าในแง่ของซิมส์และ EULA

ข้อดีของการทดสอบพร้อมกันในการเข้าสู่ระบบของผู้ใช้เดียวกัน (ระบบ ci ส่วนใหญ่ทำงานอย่างไร) คือคุณภาพของแอพร้านค้าแอปแบรนด์ Apple ซึ่งเป็นส่วนหนึ่งที่ทำให้ผู้คนซื้ออุปกรณ์ iOS ตั้งแต่แรก คุณภาพซอฟต์แวร์ที่ไม่ดีทำให้ทั้งแบรนด์มีการรองรับการทำงานพร้อมกันในเครื่องจำลอง iOS มากขึ้นดูเหมือนจะเป็นวิธีที่ชาญฉลาดในการสนับสนุนระบบนิเวศ ข้อพิสูจน์เล็กน้อยสำหรับปัญหาที่เกิดขึ้นคือการปรับปรุงล่าสุดเช่นเซิร์ฟเวอร์ Xcode ของ Apple สำหรับ CI, UI อัตโนมัติของ Xcode ทดสอบฟังก์ชันการทำงานใน Xcode 7

การสนับสนุนค่าใช้จ่ายที่ไม่จำเป็นเพื่อให้ผู้คนซื้อฮาร์ดแวร์การตั้งค่าการกำหนดค่าจำนวนมากไม่ต้องพูดถึงผู้คนจำนวนมากที่ต้องรองรับเครื่องเครือข่ายและพาวเวอร์พอยต์ทั้งหมด ฯลฯ อาจส่งผลเสียต่อผลกำไรของ Apple ในที่สุดเพราะไม่ใช่ทุกคนที่เหมือน Apple และ สามารถซื้อชั้นวางของ MacPro หรือ Mac Mini เพื่อรองรับการทดสอบพร้อมกันบนเครื่องจำลอง จุดรวมของโปรแกรมจำลองคือหลีกเลี่ยงการใช้ฮาร์ดแวร์และเร่งการทดสอบด้วย

บวกกับข้อ จำกัด ของ EULA บน VM ทำให้กรณีของ VM บน Mac Pro ค่อนข้างอ่อนแอ ฮาร์ดแวร์ประเภทนี้น่าสนใจหากสามารถทำงานได้หลายซิม แต่เนื่องจากไม่รองรับการทดสอบหน่วยพร้อมกัน (ยกเว้นในสองเงื่อนไขข้างต้น - เวอร์ชัน XCode ที่แตกต่างกันและอุปกรณ์จำลองที่แตกต่างกัน) เราน่าจะยึดติดกับ Mac Mini เพื่อสร้างโครงสร้างพื้นฐาน

ข้อ จำกัด ของซิมและ EULA จาก Apple ไม่เพียง แต่ทำให้ build pipeline ช้าลง แต่ยังเพิ่มความซับซ้อนและต้นทุนที่ไม่จำเป็นอีกด้วย อาจไม่เกี่ยวข้องกับแอพขนาดเล็ก แต่เนื่องจากแอพมีขนาดและความซับซ้อนมากขึ้นการสร้างอาจใช้เวลานานกว่าหนึ่งชั่วโมง (ฉันได้ยินมาว่าการสร้าง Facebook iOS อาจใช้เวลานานขนาดนั้น) ไม่มีใครอยากรอเป็นชั่วโมงเพื่อรู้ว่างานสร้างผ่านหรือไม่

เรารู้จักโซลูชันแฮ็คเช่นการเรียกใช้ ESXI VM บน Mac Minis ซึ่งเล่นได้ไม่ดีพอกับ OS X และ xcodebuild ในโปรเจ็กต์ขนาดใหญ่ที่มีการสร้างที่ใช้เวลามากกว่า 10 นาทีใน Mac Book Pro หรือ Mac Mini ที่ทันสมัยหรือบัญชีล็อกอินอื่น บนเครื่องโลหะเปล่าสู่สภาพแวดล้อมเพียงเพื่อให้สามารถทำการทดสอบพร้อมกันบน Xcode เวอร์ชันเดียวกันและอุปกรณ์จำลองเดียวกันได้

ESXi ไม่ได้รับการสนับสนุนอย่างเป็นทางการแม้ว่าจะใช้งานได้ดี สาเหตุหนึ่งที่ VMware อาจไม่รองรับฮาร์ดแวร์ Mac Mini แต่ขาดหน่วยความจำ ECC แม้ว่า Mac Pro จะได้รับการสนับสนุนเนื่องจากมีหน่วยความจำ ECC แต่ก็น่าจะมีปัญหาเช่นเดียวกับ Mac Mini ในแง่ของ iOS ที่สร้างช้าลงเมื่อเทียบกับโลหะเปลือย การทดสอบการกำหนดค่าฮาร์ดแวร์และซอฟต์แวร์เดียวกัน (การเปลี่ยนแปลงคือ VM กับ bare metal ที่ใช้ OS X) MacPro ยังไม่ได้รับการทดสอบจากเราในขณะนี้ จากประสบการณ์ของเรา VMware Fusion ค่อนข้างช้าในแง่ของประสิทธิภาพเช่นกัน

ที่สำคัญกว่านั้นนักพัฒนาจะต้องรอนานขึ้นเมื่อมีการรวมปัญหาดังกล่าวเข้าด้วยกันเว้นแต่ว่าพูลของเครื่องจะมีขนาดใหญ่พอที่จะรองรับการเปลี่ยนแปลงแบบ pipleline (หนึ่ง CI build สำหรับทุกๆ 2 devs, อัตราส่วนของเครื่องจักรต่อผู้พัฒนาที่สูงมาก) เครื่องสร้าง CI ควรสามารถรันบิลด์พร้อมกันได้มากกว่าและการทดสอบพร้อมกันมากกว่า 1

ข้อสังเกตอีกประการหนึ่งเกี่ยวกับเครื่องจำลอง iOS คือดูเหมือนว่าจะอยู่ระหว่างดำเนินการและยังไม่เสร็จสมบูรณ์แม้ว่าจะผ่านไปแล้ว 7 เวอร์ชันหลัก คำสั่งย่อย 'xcrun simctl' มีตัวเลือก --set ซึ่งอาจอนุญาตให้มีความยืดหยุ่นได้บ้าง แต่ไม่แน่ใจว่าค่าใดที่เป็นไปได้นั้นถูกต้องและเหมือนกับ --noxpc ไม่มีใครต้องเดาค่าที่เหมาะสมและนอกจากนี้ควรมี man page ที่ครอบคลุมตัวเลือกนี้และอาจเป็นตัวอย่าง มีกรณีการใช้งานอะไรบ้างสำหรับ 2 ตัวเลือกที่น่าสนใจนี้?

คุณอาจพูดได้ว่าไม่ควรออกแบบแอปให้มีขนาดใหญ่ที่รับประกันการทดสอบพร้อมกันเพื่อให้ทำงานได้และใช้สถาปัตยกรรมที่ดีขึ้นตาม XPC เนื่องจากแอปเสาหินเป็นปัญหา สิ่งนี้อาจถูกต้องมากไม่ใช่วิธีแก้ปัญหาในทางปฏิบัติอย่างที่เราคาดหวังและปัญหาจะยังคงอยู่หากคุณมีแอปมากกว่า 20 แอปที่จะสร้างบนโครงสร้างพื้นฐานเดียวกัน

การกำหนดค่าเครื่องและกระบวนการเป็นแบบทั่วไปและปรับขนาดได้มากที่สุดเพื่อให้ได้ปริมาณงานที่สูงขึ้นจะต้องมีการทำงานบางอย่างกับตัวจำลอง (app + core devs) นอกจากนี้ยังต้องอาศัยการทำงานร่วมกันในระดับสูงระหว่างนักพัฒนาโปรแกรมจำลอง Apple ทั้งหมดและเจ้าของผลิตภัณฑ์จำลองต้องสั่งซื้อสินค้าค้างส่งอย่างถูกต้องเพื่อให้ปัญหานี้ได้รับความสนใจ :-)


6

FBSimulatorControl จาก Facebook ให้วิธีการแบบเป็นโปรแกรมในการดำเนินการนี้ มันมีอยู่ในhttps://github.com/facebook/FBSimulatorControl

วิธีการtestLaunchesMultipleSimulatorsConcurrentlyในFBSimulatorControlSimulatorLaunchTests.mมีโค้ดตัวอย่างที่แสดงวิธีการเปิดตัวจำลองหลายตัว


5

คุณสามารถเรียกใช้โปรแกรมจำลองหลายอินสแตนซ์สำหรับโปรไฟล์ฮาร์ดแวร์ที่แตกต่างกันและแก้ไขข้อบกพร่องได้ ขั้นแรกคุณต้องเรียกใช้แอปของคุณจาก XCode สำหรับฮาร์ดแวร์แต่ละประเภท (iPhone 6, iPad เป็นต้น) เพื่อติดตั้งลงในอินสแตนซ์จำลอง จากนั้นเรียกใช้อินสแตนซ์จำลองและแอปของคุณตามที่อธิบายไว้ข้างต้น ในการดีบักคุณสามารถแนบดีบักเกอร์กับกระบวนการที่กำลังทำงานอยู่จากเมนู "XCode-> Debug-> Attach to Process" คุณสามารถตรวจสอบรายการบล็อกนี้เพื่อดูตัวอย่าง: http://oguzdemir.dualware.com/?p=43


5

ที่นี่เป็นสคริปต์เล็ก ๆ ใน. sh เพื่อแสดงรายการ UDID ของเครื่องจำลองบนคอมพิวเตอร์ของคุณและเรียกใช้ คัดลอกโค้ดด้านล่างในไฟล์ที่มีนามสกุล ".sh" และเรียกใช้ในเทอร์มินัล

ทำอย่างไร:

ขั้นตอนที่ 1. แสดงรายการอุปกรณ์ด้วยตัวเลือก 1 และคัดลอก UDID ที่ต้องการ

ขั้นตอนที่ 2. เรียกใช้ตัวเลือก 2 และวาง UDID จากนั้นกดปุ่ม Enter

ระวัง: ตรวจสอบว่าเส้นทางที่มีเครื่องจำลองของคุณใช้ได้ (หากไม่ถูกแทนที่ด้วยเส้นทางของคุณ)

#!/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

ขอบคุณ,


0

นี่คือปี 2020 xCode 11.4: ไฟล์ -> เปิดอุปกรณ์ -> iOs 13.4 -> และเลือกเวอร์ชัน iPhone ที่ไม่ได้ทำงานก่อนและคุณจะได้รับโปรแกรมจำลองที่สองทำงาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.