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í:
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 doleva nebo na 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 Maps), které se zkompilovaly a spustily v iOSu 8 (nebo starším), při pokusu o odeslání nového buildu do iTunes Connect se může zobrazit chyba ve formuláři:
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 na iTunes Connect 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
, CFURL
nebo 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:
Pokud chcete tento problém vyřešit, postupujte takto:
Spusťte Xcode (nejnovější beta verzi) na vývojovém Macu.
Výběrem zařízení v nabídce Okna otevřete okno Zařízení:
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...:
Vyberte každý zřizovací profil, který je aktuálně na zařízení, a výběrem tlačítka ho - odstraňte:
V nabídce Xcode vyberte Předvolby... a Účty:
Klikněte na tlačítko Zobrazit podrobnosti... a pak vyberte tlačítko Stáhnout vše :
Po dokončení aktualizace seznamu vyberte tlačítko Hotovo a zavřete okno Předvolby.
Odeberte existující verzi aplikace Xamarin.iOS, kterou jste se pokusili otestovat ze zařízení s iOSem.
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í:
- 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ářů . - Nastavte
RootViewController
vlastnost okna aplikace v metodě veFinishedLaunching
AppDelegate
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.