How do I specify a simulated device by name in xcodebuild?

Xcodebuild a simulátory: Přesná specifikace zařízení

04/01/2024

Rating: 4.59 (6617 votes)

Jako vývojáři pro iOS jsme zvyklí na to, že každá nová verze Xcode přináší nejen nové funkce, ale občas i nové výzvy. Jednou z nejčastějších a nejvíce matoucích situací je, když se vaše osvědčené skripty pro sestavování a testování pomocí příkazového řádku xcodebuild najednou začnou chovat podivně, často s chybovými zprávami, které se zdají být zcela mimo mísu. Typickým příkladem jsou chyby související s provisioning profilu, když se přitom snažíte spustit testy na simulátoru. Tento článek vás provede kořenovou příčinou těchto problémů a ukáže vám, jak správně a spolehlivě specifikovat simulátor pro vaše sestavení a testy, ať už jste se setkali s přechodem z Xcode 15.0.1 na 15.1, nebo s jakoukoli podobnou aktualizací.

How do I specify a simulated device by name in xcodebuild?
From the xcodebuild man page: When specifying the simulated device by name, the iOS version for that simulated device, such as 6.0, or the string latest (the default) to indicate the most recent version of iOS supported by this version of Xcode. My invocation was asking for the latest iOS version on iPhone 14.

Nejčastěji se tento problém projevuje po aktualizaci Xcode, kdy se změní dostupnost nebo výchozí verze simulátorů. Může se stát, že váš skript, který dříve fungoval bezchybně a požadoval například 'iPhone 14' s 'nejnovějším' iOS, najednou selže. Důvodem je, že 'nejnovější' verze iOS v nové instalaci Xcode nemusí být kompatibilní se všemi staršími modely simulátorů, které máte na svém Macu. I když se na první pohled zdá, že chyba souvisí s certifikáty nebo profily, skutečná příčina je mnohem prozaičtější a skrytá hlouběji v logu xcodebuild.

Obsahový index

Hlavní problém: Změny v simulátorech a Xcode aktualizace

Představte si situaci: aktualizovali jste Xcode z verze 15.0.1 na 15.1. V předchozí verzi jste možná úspěšně používali příkaz xcodebuild s parametrem -destination 'platform=iOS Simulator,name=iPhone 14,OS=latest'. Po aktualizaci ale tento příkaz najednou selhává. Proč?

S každou novou verzí Xcode se aktualizují i sady SDK a s nimi i dostupné verze iOS pro simulátory. Xcode 15.1 přichází s iOS 17.2 jako 'nejnovější' verzí. Problém nastává, když váš simulátor 'iPhone 14', který máte nainstalovaný, podporuje maximálně iOS 17.0.1. Vaše žádost o 'iPhone 14' s 'nejnovějším' iOS (tedy 17.2) se stává nesplnitelnou. Xcode 15.1 totiž nabízí iPhone 15 s iOS 17.2, ale ne iPhone 14 s touto verzí.

Místo aby xcodebuild jasně nahlásil, že taková kombinace zařízení a OS neexistuje, chová se poněkud záludně. V logu se objeví varování, které je snadné přehlédnout:

--- xcodebuild: WARNING: Using the first of multiple matching destinations: { platform:macOS, arch:arm64, variant:Designed for [iPad,iPhone], id:00006001-001460CE1A45801E } { platform:iOS, id:dvtdevice-DVTiPhonePlaceholder-iphoneos:placeholder, name:Any iOS Device } { platform:iOS Simulator, id:dvtdevice-DVTiOSDeviceSimulatorPlaceholder-iphonesimulator:placeholder, name:Any iOS Simulator Device } { platform:iOS Simulator, id:03FE7456-3AAA-4060-A403-A0A90E8DE31A, OS:15.0, name:iPad (9th generation) } { platform:iOS Simulator, id:03FE7456-3AAA-4060-A403-A0A90E8DE31A, OS:15.0, name:iPad (9th generation) } And so on...

Toto varování znamená, že xcodebuild nenašel přesně to, co jste požadovali, a tak si vybral první alternativu ze seznamu dostupných destinací. A právě zde se skrývá jádro problému, které vede k matoucí chybové zprávě.

Pochopení parametru `destination` v `xcodebuild`

Parametr -destination je klíčový pro určení, na jakém zařízení nebo simulátoru se má vaše aplikace sestavit, testovat nebo spustit. Má několik sub-parametrů, z nichž nejdůležitější jsou platform, name a OS. Důležité je si uvědomit, že i zde existují výchozí hodnoty. Pokud například nespecifikujete OS, použije se hodnota latest, což označuje nejnovější verzi iOS podporovanou danou verzí Xcode.

Problém nastává, když se spoléháte na latest bez ověření, zda vaše konkrétní zařízení (např. 'iPhone 14') skutečně podporuje absolutně nejnovější verzi iOS, kterou Xcode nabízí. Jak bylo zmíněno, 'iPhone 14' s iOS 17.0.1 se stane nekompatibilním s požadavkem na 'latest' iOS 17.2, který je v Xcode 15.1 dostupný pouze pro novější zařízení jako 'iPhone 15'.

Když xcodebuild nemůže najít přesnou shodu pro vaši specifikaci (např. 'iPhone 14' s iOS 17.2), přistoupí k výběru první dostupné "alternativní" destinace. A právě zde se dostáváme k oné matoucí chybě.

Zavádějící chybové zprávy a skutečná příčina

Když xcodebuild nenajde požadovanou kombinaci simulátoru a verze OS, vybere si první položku ze seznamu kompatibilních destinací. Na Macích s procesory Apple Silicon a díky funkci "Designed for iPhone or Designed for iPad" je možné spouštět iOS aplikace přímo v macOS. A bohužel, často je právě tato "macOS" destinace uvedena jako první v seznamu.

Pokud xcodebuild vybere tuto macOS destinaci, pokusí se spustit vaši iOS aplikaci přímo na vašem Macu. Protože se snaží spustit aplikaci na "reálném zařízení" (v tomto případě na vašem Macu, který se chová jako zařízení), očekává, že toto zařízení bude registrováno v provisioning profilu. A protože tomu tak obvykle není (nebo není pro daný build), dostanete chybovou zprávu týkající se provisioning profilu nebo podpisových certifikátů. Tato chyba je extrémně zavádějící, protože problém vůbec nesouvisí s vašimi profily nebo certifikáty, ale s tím, že xcodebuild se snaží spustit aplikaci na špatném cíli!

Klíčem k řešení je tedy ignorovat tuto zdánlivou chybu a místo toho se zaměřit na varování, které se objeví výše v logu xcodebuild. Toto varování jasně naznačuje, že xcodebuild si vybral jinou destinaci, než jste zamýšleli, a to je ten moment, kdy byste měli zbystřit.

Jak správně specifikovat simulátor v `xcodebuild`

Abyste se vyhnuli těmto frustrujícím situacím, je nutné být při specifikaci simulátorů v xcodebuild co nejpřesnější. Zde jsou klíčové strategie:

1. Buďte maximálně specifičtí: Jméno zařízení A verze iOS

Nejspolehlivější metodou je specifikovat jak název simulátoru, tak přesnou verzi iOS, kterou pro něj chcete použít. To eliminuje jakoukoli nejistotu spojenou s 'latest'.

  • Příklad: Pokud chcete iPhone 14 s iOS 17.0.1, použijte:
    -destination 'platform=iOS Simulator,name=iPhone 14,OS=17.0.1'
  • Jak zjistit dostupné simulátory a jejich verze: Použijte příkaz xcrun simctl list devices. Tento příkaz vypíše všechny dostupné simulátory s jejich UUID, názvy a verzemi iOS. Pečlivě si zkontrolujte, které verze iOS jsou skutečně dostupné pro váš konkrétní model simulátoru.

Příklad výstupu xcrun simctl list devices (zkráceno):

== Devices == -- iOS 15.0 -- iPad (9th generation) (03FE7456-3AAA-4060-A403-A0A90E8DE31A) (Shutdown) -- iOS 17.0.1 -- iPhone 14 (ABCD1234-EFGH-IJKL-MNOP-QRSTUVWX9876) (Shutdown) -- iOS 17.2 -- iPhone 15 (ZYXWVUTSRQPO-NMLK-JIHG-FEDA-BC9876543210) (Shutdown)

Z tohoto výstupu je jasné, že iPhone 14 je dostupný pouze s iOS 17.0.1, zatímco iPhone 15 s iOS 17.2.

2. Používejte `latest` moudře

Pokud trváte na použití latest, ujistěte se, že název zařízení, který zadáváte, skutečně podporuje absolutně nejnovější verzi iOS, kterou vaše aktuální instalace Xcode nabízí. V případě Xcode 15.1 a iOS 17.2 by to byl spíše iPhone 15 než iPhone 14.

  • Příklad:
    -destination 'platform=iOS Simulator,name=iPhone 15,OS=latest'

    Tento příkaz by v Xcode 15.1 úspěšně našel iPhone 15 s iOS 17.2.

3. Pravidelná kontrola dostupných simulátorů

Po každé větší aktualizaci Xcode je dobrým zvykem spustit xcrun simctl list devices a zkontrolovat, jaké simulátory a verze iOS jsou skutečně k dispozici. To vám pomůže předejít mnoha problémům a rychle identifikovat, zda je vaše specifikace platná.

4. Zvažte použití UUID simulátoru (méně časté, ale spolehlivé)

Můžete také specifikovat simulátor pomocí jeho UUID (Universal Unique Identifier), který získáte z xcrun simctl list devices. Toto je nejpřesnější, ale méně čitelné:

  • Příklad:
    -destination 'platform=iOS Simulator,id=ABCD1234-EFGH-IJKL-MNOP-QRSTUVWX9876'

Srovnávací tabulka: Špatně vs. Správně

Následující tabulka demonstruje běžné chyby a správné přístupy k definování simulátorů v xcodebuild.

Scénář/CílŠpatný/Problematický příkazSprávný/Doporučený příkazVysvětlení
Spustit na iPhone 14 s nejnovějším iOS (Xcode 15.1)-destination 'platform=iOS Simulator,name=iPhone 14,OS=latest'-destination 'platform=iOS Simulator,name=iPhone 14,OS=17.0.1'iPhone 14 v Xcode 15.1 nemusí podporovat iOS 17.2 (nejnovější). Musíte specifikovat verzi, kterou *má* k dispozici.
Spustit na iPhone s *absolutně* nejnovějším iOS (Xcode 15.1)N/A (toto je cíl, ne špatný příkaz)-destination 'platform=iOS Simulator,name=iPhone 15,OS=latest'Pokud chcete *skutečně nejnovější* iOS, použijte zařízení, které jej podporuje (např. iPhone 15 v Xcode 15.1).
Spustit na konkrétním iPadu (např. iPad (9th generation) iOS 15.0)-destination 'platform=iOS Simulator,name=iPad (9th generation),OS=latest'-destination 'platform=iOS Simulator,name=iPad (9th generation),OS=15.0'Znovu, buďte konkrétní ohledně verze OS, pokud dané zařízení nepodporuje nejnovější verzi OS, kterou Xcode nabízí.
Spustit na iPhone 14 bez specifikace OS (výchozí `latest`)-destination 'platform=iOS Simulator,name=iPhone 14'-destination 'platform=iOS Simulator,name=iPhone 14,OS=17.0.1'Stejný problém jako s explicitním OS=latest. Implicitně se použije latest, což vede k nekompatibilitě.

Důležité body k zapamatování

  • Pravidelná kontrola: Po každé větší aktualizaci Xcode si zvykněte zkontrolovat dostupnost simulátorů pomocí xcrun simctl list devices.
  • Přesnost je klíčová: Vždy specifikujte jak název zařízení, tak přesnou verzi operačního systému, pokud si nejste absolutně jisti, že latest bude fungovat pro daný simulátor.
  • Nevěřte slepě `latest`: Zvláště po aktualizaci Xcode, kdy se mohou změnit výchozí 'nejnovější' verze iOS pro simulátory.
  • Zkontrolujte varování: Nejen chybové zprávy. Varování v logu xcodebuild, zejména ta o výběru destinace, jsou často klíčem k odhalení skutečné příčiny problému.

Často kladené otázky (FAQ)

Q: Proč xcodebuild vybírá macOS jako destinaci, když chci simulátor?

A: K tomu dochází na Macích s Apple Silicon procesory kvůli funkci "Designed for iPhone/iPad". Pokud xcodebuild nemůže najít přesnou shodu pro vámi požadovaný simulátor (např. iPhone 14 s iOS 17.2), vybere si první *kompatibilní* destinaci ze seznamu. A tou je často právě macOS. To pak vede k chybám s provisioning profilu, protože se snaží spustit aplikaci na vašem Macu jako na reálném zařízení.

Q: Jak zjistím přesné názvy a verze OS simulátorů, které mám k dispozici?

A: Použijte příkaz xcrun simctl list devices v terminálu. Tento příkaz vám vypíše podrobný seznam všech nainstalovaných simulátorů, včetně jejich názvů (např. 'iPhone 14'), verzí iOS (např. 'iOS 17.0.1') a UUID.

Q: Mám odstranit staré simulátory, které už nepoužívám?

A: Není to striktně nutné pro funkčnost, ale může to pomoci s přehledností a snížit počet dostupných (a potenciálně matoucích) destinací. Pokud je simulátor zastaralý a nikdy ho nebudete potřebovat, můžete ho odstranit přes Xcode -> Settings (nebo Preferences) -> Platforms -> Simulators.

Q: Proč se mi stále zobrazují chyby ohledně provisioning profilu, i když mám správné certifikáty?

A: S největší pravděpodobností xcodebuild stále vybírá "reálné" zařízení (například váš Mac, který se chová jako zařízení, nebo skutečně připojený iPhone) namísto simulátoru, protože vaše specifikace simulátoru je chybná nebo nejednoznačná. Vždy zkontrolujte varování v logu xcodebuild, které signalizuje, jakou destinaci si xcodebuild skutečně vybral. Téměř vždy to souvisí s nesprávnou specifikací simulátoru, nikoli s profily.

Závěr

Efektivní práce s xcodebuild a simulátory je klíčová pro plynulý vývoj a CI/CD procesy v iOS. Problémy s nesprávnou specifikací simulátorů jsou běžné, zejména po aktualizacích Xcode. Pamatujte, že zdánlivě nesouvisející chyby, jako jsou ty s provisioning profilu, jsou často jen příznakem hlubšího problému – xcodebuild si prostě vybral špatnou destinaci. Klíčem k řešení je být maximálně přesný v parametru -destination, aktivně kontrolovat dostupné simulátory pomocí xcrun simctl list devices a věnovat pozornost varováním v logu. S těmito znalostmi se vyhnete mnoha frustracím a udržíte svůj vývojový proces hladký a efektivní.

Chceš-li si přečíst další články podobné jako Xcodebuild a simulátory: Přesná specifikace zařízení, navštiv kategorii iPhone.

Go up