Xamarin.iOS 9 – Řešení potíží

Tento článek obsahuje několik tipů pro řešení potíží pro práci s iOSem 9 v aplikacích Xamarin.iOS.

Kde jsou simulátory iOS 8?

Pokud jste nainstalovali Xcode 7 (nebo novější), automaticky nahradí všechny simulátory iOS 8 simulátory iOS 9 ve výchozím nastavení. Pokud stále potřebujete testovat v iOSu 8, můžete spustit Xcode, pak stáhnout a nainstalovat simulátory iOS 8.

V Xcode vyberte nabídku Xcode a pak předvolby...>Soubory ke stažení:

iOS 8 Simulators Downloads

Vyberte tlačítko Zkontrolovat a nainstalovat a přeinstalujte simulátory iOS 8.

Omezení rozložení s chybami atributu vlevo/vpravo

V iOSu 8 (a předchozím) můžou prvky uživatelského rozhraní ve scénářích používat kombinaci atributů zprava i doleva (NSLayoutAttributeRight & NSLayoutAttributeLeft) a úvodních a koncových atributů (NSLayoutAttributeLeading & NSLayoutAttributeTrailing) ve stejném rozložení.

Pokud je v iOSu 9 spuštěna stejná storyboard, dojde k výjimce v následujícím formátu:

Ukončení aplikace kvůli nezachycené výjimce NSInvalidArgumentException, důvod: *** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: Omezení nelze provést mezi počátečním/koncovým atributem a atributem vpravo/vlevo. Pro obě nebo ani jedno používejte úvodní nebo koncové šimrnutí.

iOS 9 vynucuje rozložení tak, aby používala atributy zprava a dolevanebona začátku a na konci , ale ne na obou. Pokud chcete tento problém vyřešit, změňte všechna omezení rozložení tak, aby používala stejnou sadu atributů v souboru Storyboard.

Další informace najdete v diskuzi o chybě omezení pro iOS 9 ve službě Stack Overflow.

CHYBA ITMS-90535: Neočekávaný klíč CFBundleExecutable

Po přechodu na iOS 9 používá aplikace komponenty třetích stran (konkrétně naše stávající komponenta Google Mapy), které se zkompilovaly a spustily v iOSu 8 (nebo starším), při pokusu o odeslání nového buildu do iTunes Připojení můžete ve formuláři zobrazit chybu:

CHYBA ITMS-90535: Neočekávaný klíč CFBundleExecutable Sada v souboru Payload/app-name.app/component.bundle neobsahuje spustitelný soubor sady...

Tento problém je obvykle možné vyřešit tak, že v projektu najdete pojmenovanou sadu, a pak ( stejně jako chybová zpráva naznačuje) upravenou Info.plist sadu, která je v sadě, odebráním CFBundleExecutable klíče. Klíč CFBundlePackageType by měl být také nastavený BNDL .

Po provedení těchto změn proveďte vyčištění a znovu sestavte celý projekt. Po provedení těchto změn můžete odeslat do Připojení iTunes bez problému.

Další informace najdete v této diskuzi o Stack Overflow .

Chyba CFNetwork SSLHandshake selhala (-9824)

Při pokusu o připojení k internetu přímo nebo z webového zobrazení v iOSu 9 se může zobrazit chyba ve formuláři:

2015-09-04 14:38:05.757 FormsWebViewiOS[2553:30362] CFNetwork SSLHandshake failed (-9824)
2015-09-04 14:38:05.758 FormsWebViewiOS[2553:30363] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824)

Nebo ve formuláři:

2015-09-04 14:39:17.881 FormsWebViewiOS[2568:30974] App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure.
Temporary exceptions can be configured via your app's Info.plist file.

V systému iOS9 vynucuje služba App Transport Security (ATS) zabezpečená připojení mezi internetovými prostředky (například back-endovým serverem aplikace) a vaší aplikací. AtS navíc vyžaduje komunikaci pomocí HTTPS protokolu a komunikace rozhraní API vysoké úrovně k šifrování pomocí protokolu TLS verze 1.2 s předáváním tajemství.

Vzhledem k tomu, že ats je ve výchozím nastavení povolená v aplikacích vytvořených pro iOS 9 a OS X 10.11 (El Capitan), všechna připojení používající NSURLConnection, CFURLnebo NSURLSession budou podléhat požadavkům na zabezpečení ATS. Pokud vaše připojení nesplňují tyto požadavky, dojde k selhání s výjimkou.

Informace o řešení tohoto problému najdete v části Odhlášení z ATS v průvodci službou App Transport Security .

Moje stávající aplikace neběží v iOSu 9

Pokyny k opětovnému sestavení a opětovnému nasazení stávajících aplikací pro iOS 9 najdete v našich informacích o kompatibilitě iOS 9.

UICollectionViewCell.ContentView je null v konstruktorech

Důvod: V iOSu initWithFrame: 9 je teď konstruktor povinný, protože chování se mění v iOS 9 jako dokumentace UICollectionView stavy. Pokud jste zaregistrovali třídu pro zadaný identifikátor a je nutné vytvořit novou buňku, buňka je nyní inicializována voláním jeho initWithFrame: metody.

Oprava: Přidejte initWithFrame: konstruktor takto:

[Export ("initWithFrame:")]
public YourCellClassName (CGRect frame) : base (frame)
{
    Initialize (); // refactor initialize code into a method
}

Související ukázky: MotionGraph, TextKitDemo

UiView se při načítání zobrazení z Xib/Nib nepodaří inicializaci s Coder

Důvod: Konstruktor initWithCoder: je volána při načítání zobrazení ze souboru Xib Tvůrce rozhraní. Pokud tento konstruktor není exportovaný, nespravovaný kód nemůže volat spravovanou verzi. Dříve (např. v iOS 8) IntPtr byl konstruktor vyvolán k inicializaci zobrazení.

Oprava: Vytvoření a export konstruktoru initWithCoder: takto:

[Export ("initWithCoder:")]
public YourClassName (NSCoder coder) : base (coder)
{
    Initialize (); // refactor initialize code into a method
}

Související ukázka: Chat

Zpráva Dyld: Žádná image mezipaměti s názvem...

Může docházet k chybovému ukončení s následujícími informacemi v protokolu:

Dyld Error Message:
Dyld Message: no cach image with name (/System/Library/PrivateFrameworks/JavaScriptCore.framework/JavaScriptCore)

Důvod: Jedná se o chybu v nativním linkeru společnosti Apple, ke které dochází, když zpřístupní privátní architekturu (JavaScriptCore byl v iOSu 7 před tím, než se jednalo o privátní architekturu), a cílem nasazení aplikace je verze iOS, když byla architektura soukromá. V tomto případě linker společnosti Apple bude odkazovat s privátní verzí architektury místo veřejné verze.

Oprava: Tento problém bude vyřešen pro iOS 9, ale existuje jednoduché alternativní řešení, které můžete použít mezitím: stačí cílit na novější verzi iOS v projektu (v tomto případě můžete vyzkoušet iOS 7). Jiné architektury můžou vykazovat podobné problémy, například architektura WebKit byla v iOSu 8 veřejná (a proto cílení na iOS 7 způsobí tuto chybu; měli byste cílit na iOS 8, aby používal WebKit ve vaší aplikaci).

Nedůvěryhodný podnikový vývojář

Při pokusu o spuštění verze aplikace Xamarin.iOS 9 na skutečném hardwaru iOS se může zobrazit zpráva s informací, že váš vývojářský účet na zařízení není důvěryhodný. Příklad:

Untrusted Enterprise Developer alert

Pokud chcete tento problém vyřešit, postupujte takto:

  1. Spusťte Xcode (nejnovější beta verzi) na vývojovém Macu.

  2. Výběrem zařízení v nabídce Okna otevřete okno Zařízení:

    The Devices Window

  3. Na bočním panelu ZAŘÍZENÍ vyberte své zařízení, klikněte pravým tlačítkem myši a vyberte Zobrazit zřizovací profily...:

    SShow Provisioning Profiles

  4. Vyberte každý zřizovací profil, který je aktuálně na zařízení, a výběrem tlačítka ho - odstraňte:

    Deleting a provisioning profile

  5. V nabídce Xcode vyberte Předvolby... a Účty:

    Xcode account preferences

  6. Klikněte na tlačítko Zobrazit podrobnosti... a pak vyberte tlačítko Stáhnout vše :

    Download all profiles

  7. Po dokončení aktualizace seznamu vyberte tlačítko Hotovo a zavřete okno Předvolby.

  8. Odeberte existující verzi aplikace Xamarin.iOS, kterou jste se pokusili otestovat ze zařízení s iOSem.

  9. Vraťte se do Visual Studio pro Mac, proveďte čisté sestavení a zkuste aplikaci na zařízení spustit znovu.

Možná budete muset zastavit a restartovat Visual Studio pro Mac před zobrazením nových zřizovacích profilů načtených Xcodem. Možná budete muset také upravit možnosti podepisování sady prostředků pro aplikaci Xamarin.iOS a vybrat nové zřizovací profily.

Problémy se spuštěním obrazovky

iOS 9 teď vynucuje požadavky na úvodní obrazovku, aby se stejný spouštěcí obrázek už nedá znovu použít pro podporu různých orientací rozhraní. Další informace najdete v referenčních informacích k UILanchImage společnosti Apple.

Volitelně můžete pomocí souboru scénáře prezentovat úvodní obrazovku aplikace místo použití sady .png souborů obrázků. Toto je teď preferovaný způsob, jak prezentovat úvodní obrazovky společnosti Apple. Další informace najdete v našem průvodci Úvodem do sjednocených scénářů .

Nakonec musí vaše aplikace použít soubor scénáře pro spouštěcí obrazovku a podporovat všechny čtyři orientace rozhraní (na výšku, na výšku vzhůru nohama, na šířku vlevo a vpravo na šířku), které se mají zvážit pro spuštění na panelu Snímek přes nebo v režimu rozděleného zobrazení. Další informace o nových schopnostech multitaskingu v iOSu 9 najdete v našem průvodci multitaskingem pro iPad .

Výjimka NSInternalInconsistencyException

Při kompilaci a spuštění existující aplikace Xamarin.iOS pro iOS 9 se může zobrazit chyba ve formuláři:

Objective-C vyvolaná výjimka. Název: NSInternalInconsistencyException Reason: Očekává se, že okna aplikací budou mít na konci spuštění aplikace kontroler kořenového zobrazení.

Tato chyba se vyvolá, protože očekává se, že systém Windows aplikace bude mít na konci spuštění aplikace řadič kořenového zobrazení a vaše stávající aplikace ne.

Pro tento problém existují aspoň dvě možná alternativní řešení:

  1. Aktualizujte aplikaci tak, aby místo souborů používala soubor xib scénáře k definování jeho uživatelského rozhraní. To vyžaduje, aby bylo možné opravit spoustu času v závislosti na velikosti aplikace a znalostech použití Tvůrce rozhraní Xcode k rozložení scénářů. Další informace najdete v naší dokumentaci Úvod do sjednocených scénářů .
  2. Nastavte RootViewController vlastnost okna aplikace v metodě ve FinishedLaunchingAppDelegate třídě tak, aby odkazovat na kontroler zobrazení v uživatelském rozhraní vaší aplikace.

Kdy inicializovat zobrazení a kontrolery zobrazení

V Xamarin.iOS je možné, aby zobrazení nebo kontrolery zobrazení inicializovaly uvnitř konstruktorů, které se volají, když je něco vystaveno ve spravovaném kódu, ale přeruší návrh iOS.

Obecně platí, že byste neměli inicializovat nic, co může volat zpět Objective-C kód z konstruktoru, protože nemůžete mít jistotu, kdy bude volána. To také znamená, že existuje lepší místo (jiné .ctor) nebo volání k přepsání (stejně jako Objective-C žádné události), kde by se tato inicializace měla provést.