programing

Xcode6: 시뮬레이터의 두 인스턴스 실행

muds 2023. 5. 31. 18:36
반응형

Xcode6: 시뮬레이터의 두 인스턴스 실행

저는 제 iOS 앱에 대해 두 가지 다른 대상을 가지고 있습니다.시뮬레이터의 서로 다른 두 인스턴스에서 두 앱을 동시에 실행할 수 있습니까?Xcode의 디버거를 사용하지 않아도 괜찮습니다.지금까지 제가 찾은 유일한 해결책은 두 가지 버전의 XCode를 설치하는 것이었지만, 그것은 매우 무거운/공간 소모적인 해결책입니다.

명령줄에서 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에서 이미 설치한 앱이 거기에 있을 것입니다.

Xcode 9+

Xcode 9는 이제 여러 시뮬레이터의 실행을 지원합니다.이것은 WWDC 2017에서 발표되었습니다.

Xcode, Cmd + R의 시뮬레이터를 변경하기만 하면 새로운 시뮬레이터가 나타납니다.

여기에 이미지 설명 입력

i40west의 솔루션이 시뮬레이터를 수동으로 시작할 수 있다는 것을 성공적으로 테스트했지만, 오늘날에는 iOS 시뮬레이터가 명령줄에서 동시 테스트를 실행할 때 다른 Xcode 버전과 다른 장치 유형을 필요로 한다는 것이 어리석어 보입니다(사용 사례는 약간 다르지만 상단의 원래 질문과 관련됨).

명령줄 빌드 및 테스트와 가장 관련된 Apple 기사를 참조하십시오. https://developer.apple.com/library/ios/technotes/tn2339/_index.html

'xcodebuild test' 명령을 실행하기 전에 올바른 --args를 'iOS simulator.app'에 전달하면 여러 개의 동시 테스트가 정상적으로 작동하며, 'xcrun simctl list' 출력의 UUID 값과 일치합니다.다른 XCode 버전 바이너리(즉, Xcode 6.1 및 6.4의 기본 경로)를 선택하도록 DEPLOVEL_DIR 환경 변수를 설정합니다.

동일한 물리적 머신, 동일한 iOS 시뮬레이터 장치(예: iPad 또는 iPhone), 동일한 Xcode 버전)에 동시 유닛 테스트가 필요한 이유는 체크인 시 동일한 빌드 시스템이 한 번에 하나 이상의 여러 앱 빌드를 실행할 수 있는 iOS 프로젝트의 CI(연속 통합)를 지원하기 위한 것입니다(당사의 앱 수는 30개 내외).기능 분기는 실행 중인 다른 빌드가 완료될 때까지 기다릴 필요 없이 Bamboo 에이전트에 의해 자동으로 검색되고 빌드됩니다. 사용 가능으로 설정된 경우 Bamboo는 자동 검색 기능 분기에서 이러한 유형의 자동 빌드를 지원합니다.

여러 개의 동시 테스트를 실행할 때 발생하는 현상에 대해서는 여러 개의 'xcodebuild test' 명령을 서로 다른 Terminal.app 창에서 두 번 연속으로 실행하면 시뮬레이터 창이 하나만 나타나고 가장 간단한 테스트에서는 테스트가 실패합니다.

테스트 시작, 각 sim 및 테스트 시작에 대한 다른 Xcode 버전의 입력 기준을 복잡하게 만들 때, DEPLOVEL_DIR을 man page(xcodebuild test)에 따라 사용할 때 두 개의 별도 창에서 열리는 다른 장치를 지정합니다.그러나 결과적으로 첫 번째 창에서 실행 중인 테스트는 두 번째 iOS 시뮬레이터 창에 의해 중단됩니다.

장애물 아래 공통적인 공유 리소스가 있는 것 같습니다. 이 리소스가 의도된 것인지 확실하지 않거나 부정적인 영향 없이 동시 테스트 실행을 더 잘 구현하는 방법에 대해 며칠 이상의 진지한 고민이 필요한 새로운 기능일 뿐입니다.

VM을 사용하여 SIM 제한 문제를 해결하고 싶지는 않습니다. 일반적으로 작은 파일이 많은 VM에서 iOS 빌드 성능이 물리적 하드웨어보다 느립니다.일반적으로 VM은 VMware 소프트웨어와 Apple 하드웨어 및/또는 펌웨어의 조합에서 발생하는 I/O 문제로 인해 빌드 속도가 크게 느려집니다.가상 게토로 인해 죄송합니다. 가상 게토 사이트에서는 빌드 팜을 위해 Mac Mini에 ESXi 5.5를 설치하는 방법에 대한 지침을 제공했습니다.

Mac Mini의 ESXi 5.5에서 SSD를 사용하더라도 베어메탈보다 2배 이상 느린 빌드 성능 문제가 발생했습니다(즉, VM에서 10분 베어메탈 빌드에 20개 필요).이유에 대한 아래의 정리 기사를 참조하십시오.

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

xcodebuild 장치 테스트를 위해 한 번에 1개의 SIM 장치를 제한하면 생산성이 크게 저하되고 Apple과 에코시스템에 상당한 비용이 추가됩니다.

더 많은 하드웨어 구매를 정당화하기 위해 동시성을 지원하지 않는 Apple에 대한 비용은 신중하게 고려해야 하며, SIM 및 EULA 측면에서 제약이 적은 다른 경쟁업체에 비해 개발자 속도가 저하될 위험을 고려해야 합니다.

동일한 사용자 로그인(대부분의 ci 시스템이 작동하는 방식)에서 동시 테스트의 장점은 Apple 브랜드 앱 스토어 앱의 품질이 우선 iOS 기기를 구매하게 만드는 부분이 있다는 것입니다.낮은 소프트웨어 품질은 전체 브랜드를 약간 더 부진하게 만들고 iOS 시뮬레이터에서의 동시 지원은 생태계를 지원하는 현명한 방법으로 보입니다.당면한 문제의 약간의 결과는 CI용 애플의 Xcode 서버, Xcode의 Xcode 7의 자동 UI 테스트 기능과 같은 최근의 개선 사항입니다.

불필요한 간접비를 장려하여 사람들이 하드웨어, 설정, 구성, 모든 기계, 네트워크 및 전원 지점 등을 지원하는 데 필요한 수많은 인력은 말할 것도 없고,모든 사람이 Apple과 같지 않고 시뮬레이터에 대한 동시 테스트를 지원하기 위해 MacPro 또는 Mac Mini 랙을 구입할 수 있기 때문에 결국 Apple의 이익에 잠재적으로 타격을 줄 수 있습니다.시뮬레이터의 요점은 하드웨어 사용을 피하고 테스트 속도를 높이는 것입니다.

또한 VM에 대한 EULA 제한으로 인해 Mac Pro의 VM은 매우 취약합니다.이 하드웨어 유형은 여러 개의 SIM을 실행할 수 있다면 매력적이지만 동시 장치 테스트가 지원되지 않기 때문에(위의 두 가지 조건 - 다른 XCode 버전과 다른 시뮬레이터 장치 제외) 빌드 인프라를 위해 Mac Mini를 고수할 가능성이 높습니다.

Apple의 이러한 SIM 및 EULA 제한은 빌드 파이프라인을 느리게 만들 뿐만 아니라 불필요한 복잡성과 비용을 증가시킵니다.작은 앱의 경우에는 그렇게 걱정이 되지 않을 수 있지만 앱의 크기와 복잡성이 증가함에 따라 빌드에 1시간 이상 걸릴 수 있습니다(Facebook iOS 빌드는 그렇게 오래 걸릴 수 있다고 들었습니다).빌드가 통과했는지 여부를 알기 위해 한 시간을 기다리는 사람은 없습니다.

Mac Minis에서 ESXI VM을 실행하는 것과 같은 해킹 솔루션은 OS X 및 xcodebuild에서 제대로 작동하지 않으며 최신 Mac Book Pro 또는 Mac Mini에서 10분 이상 걸리는 빌드가 있는 대규모 프로젝트에서 구축됩니다.또는 동일한 Xcode 버전 및 동일한 시뮬레이터 장치에서 동시 테스트를 실행할 수 있도록 환경에 대한 베어메탈 시스템의 서로 다른 로그인 계정.

ESXi는 제대로 작동하지만 공식적으로 지원되지 않습니다.VMware가 Mac Mini 하드웨어를 지원하지 않지만 ECC 메모리가 부족한 이유 중 하나는 Mac Pro가 ECC 메모리를 지원하지만 동일한 하드웨어 및 소프트웨어 구성에서 베어메탈 테스트를 수행하는 것에 비해 iOS 빌드 속도가 느려지는 Mac Mini와 동일한 문제가 있을 수 있습니다(VM과 베어메탈을 실행하는 OS X의 차이점은 다름).현재 MacPro는 당사에서 테스트하지 않았습니다.VMware Fusion은 성능 면에서도 상당히 느립니다.

더 중요한 것은 앞에서 언급한 문제가 복합적으로 발생할 경우 시스템 풀이 여러 개의 변경 사항을 지원할 수 있을 정도로 크지 않은 경우(2개의 개발마다 하나의 CI 빌드, 시스템 대 개발자 비율이 매우 높음) 개발자는 더 많은 시간을 기다려야 한다는 것입니다.CI 빌드 시스템은 1보다 더 많은 동시 빌드와 더 많은 동시 테스트를 실행할 수 있어야 합니다.

iOS 시뮬레이터에 대한 다른 관찰 중 하나는 7개의 주요 버전 이후에도 진행 중이고 완전히 미완성 상태인 것으로 보인다는 것입니다.'xcrun simctl' 하위 명령에는 --set 옵션이 있어 어떤 종류의 유연성을 허용할 수 있지만 어떤 가능한 값이 유효한지 확실하지 않으며 --noxpc와 동일합니다.아무도 적절한 값을 추측할 필요가 없으며, 더 나아가 이 옵션과 예를 다루는 man 페이지가 있어야 합니다.이 두 가지 흥미로운 옵션의 사용 사례는 무엇입니까?

단일 애플리케이션이 문제이기 때문에 어떤 애플리케이션도 동시에 테스트를 실행하고 XPC를 기반으로 더 나은 아키텍처를 사용할 수 있도록 큰 설치 공간을 갖도록 설계되어서는 안 됩니다.이는 매우 정확할 수 있으며, 우리가 기대하는 것만큼 실용적인 솔루션이 아니며, 동일한 인프라에 20개 이상의 앱을 구축할 경우에도 문제가 남아 있습니다.

더 높은 처리량을 위해 기계 구성 및 프로세스를 가능한 일반적이고 확장 가능하게 만들려면 시뮬레이터(앱 + 코어 개발)에 대한 작업이 필요합니다.또한 모든 Apple 시뮬레이터 개발자 간의 높은 수준의 협업이 필요하며 시뮬레이터 제품 소유자는 이 문제에 대한 관심을 얻으려면 제품 백로그를 올바르게 주문해야 합니다 :-)

Facebook의 FBSimulatorControl은 이를 위한 프로그래밍 방식을 제공합니다.https://github.com/facebook/FBSimulatorControl 에서 이용할 수 있습니다.

»testLaunchesMultipleSimulatorsConcurrentlyinFBSimulatorControlSimulatorLaunchTests.m에는 여러 시뮬레이터를 실행하는 방법을 보여주는 샘플 코드가 있습니다.

서로 다른 하드웨어 프로파일에 대해 시뮬레이터의 여러 인스턴스를 실행하고 디버깅할 수 있습니다.먼저 각 하드웨어 유형(iPhone 6, iPad 등)에 대해 XCode에서 앱을 실행하여 시뮬레이터 인스턴스에 설치해야 합니다.그런 다음 위에서 설명한 대로 시뮬레이터 인스턴스와 앱을 실행합니다.디버그하려면 "XCode->Debug->Attach to Process" 메뉴에서 실행 중인 프로세스에 디버거를 연결하면 됩니다.를 들어 이 블로그 항목을 확인할 수 있습니다. http://oguzdemir.dualware.com/ ?p=43

여기 .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

감사해요.

2020년, xCode 11.4: 파일 -> 장치 열기 -> iOS 13.4 -> 먼저 실행되지 않은 아이폰 버전을 선택하면 두 번째 에뮬레이터가 실행됩니다.

언급URL : https://stackoverflow.com/questions/26446346/xcode6-run-two-instances-of-the-simulator

반응형