Xamarin.iOS 9 — rozwiązywanie problemów
Ten artykuł zawiera kilka wskazówek dotyczących rozwiązywania problemów dotyczących pracy z systemem iOS 9 w aplikacjach platformy Xamarin.iOS.
Gdzie są symulatory systemu iOS 8?
Jeśli zainstalowano program Xcode 7 (lub nowszy), automatycznie zastąpi wszystkie symulatory systemu iOS 8 symulatorami systemu iOS 9 domyślnie. Jeśli nadal musisz przetestować system iOS 8, możesz uruchomić program Xcode, a następnie pobrać i zainstalować symulatory systemu iOS 8.
W programie Xcode wybierz menu Xcode , a następnie pozycję Preferencje...>Pliki do pobrania:
Wybierz przycisk Sprawdź i zainstaluj teraz, aby ponownie zainstalować symulatory systemu iOS 8.
Ograniczenie układu z błędami atrybutów po lewej/prawej
W systemach iOS 8 (i wcześniejszych) elementy interfejsu użytkownika w scenorysach mogą używać kombinacji zarówno atrybutów po prawej , jak i lewej (NSLayoutAttributeRight
i NSLayoutAttributeLeft
) oraz atrybutów wiodących i końcowych (NSLayoutAttributeLeading
i NSLayoutAttributeTrailing
) w tym samym układzie.
Jeśli ten sam scenorys jest uruchamiany w systemie iOS 9, spowoduje to wyjątek w następującym formularzu:
Kończenie działania aplikacji z powodu wyjątku "NSInvalidArgumentException", przyczyna: '*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:mnożnik:constant:]: Nie można wykonać ograniczenia między atrybutem wiodącym/końcowym a atrybutem po prawej/lewej stronie. Użyj wiodącej/końcowej dla obu lub nie."
System iOS 9 wymusza układy do używania atrybutów od prawej i lewej do lewej lub wiodącej i końcowej, ale nie obu. Aby rozwiązać ten problem, zmień wszystkie ograniczenia układu, aby użyć tego samego zestawu atrybutów w pliku Scenorysu.
Aby uzyskać więcej informacji, zobacz dyskusję na temat błędu ograniczenia systemu iOS 9 Stack Overflow.
BŁĄD ITMS-90535: Nieoczekiwany klucz CFBundleExecutable
Po przełączeniu się do systemu iOS 9 z poziomu aplikacji używa składników innych firm (w szczególności naszego istniejącego składnika Google Maps), który kompilował i uruchamiał się w systemie iOS 8 (lub starszym), podczas próby przesłania nowej kompilacji do programu iTunes Connect możesz uzyskać błąd w formularzu:
BŁĄD ITMS-90535: Nieoczekiwany klucz CFBundleExecutable. Pakiet w folderze "Payload/app-name.app/component.bundle" nie zawiera pliku wykonywalnego pakietu...
Ten problem można zwykle rozwiązać, wyszukując nazwany pakiet w projekcie — tak jak sugeruje komunikat o błędzie — edytował Info.plist
element w pakiecie, usuwając CFBundleExecutable
klucz. Klucz CFBundlePackageType
powinien być również ustawiony na BNDL
wartość .
Po wprowadzeniu tych zmian wykonaj czyste i ponownie skompiluj cały projekt. Możesz przesłać do programu iTunes Connect bez problemu po wprowadzeniu tych zmian.
Aby uzyskać więcej informacji, zobacz tę dyskusję na temat rozwiązania Stack Overflow .
Błąd CFNetwork SSLHandshake (-9824)
Podczas próby nawiązania połączenia z Internetem bezpośrednio lub z widoku internetowego w systemie iOS 9 może wystąpić błąd w formularzu:
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)
Lub w formularzu:
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.
W systemie iOS9 usługa App Transport Security (ATS) wymusza bezpieczne połączenia między zasobami internetowymi (takimi jak serwer zaplecza aplikacji) i aplikacją. Ponadto usługa ATS wymaga komunikacji przy użyciu protokołu i komunikacji interfejsu HTTPS
API wysokiego poziomu do szyfrowania przy użyciu protokołu TLS w wersji 1.2 z tajemnicą przesyłania dalej.
Ponieważ usługa ATS jest domyślnie włączona w aplikacjach utworzonych dla systemów iOS 9 i OS X 10.11 (El Capitan), wszystkie połączenia korzystające z systemu NSURLConnection
CFURL
, lub NSURLSession
będą objęte wymaganiami dotyczącymi zabezpieczeń usługi ATS. Jeśli połączenia nie spełniają tych wymagań, nie powiedzą się z wyjątkiem.
Aby uzyskać informacje na temat rozwiązywania tego problemu, zobacz sekcję Rezygnacja z usługi ATS w naszym przewodniku dotyczącym usługi App Transport Security .
Moje istniejące aplikacje nie działają w systemie iOS 9
Zobacz nasze informacje o zgodności systemu iOS 9, aby uzyskać instrukcje dotyczące ponownego kompilowania i ponownego wdrażania istniejących aplikacji do uruchamiania w systemie iOS 9.
UICollectionViewCell.ContentView ma wartość Null w konstruktorach
Przyczyna: W systemie iOS 9 initWithFrame:
konstruktor jest teraz wymagany ze względu na zmiany zachowania w systemie iOS 9 jako stany dokumentacji UICollectionView. Jeśli zarejestrowano klasę dla określonego identyfikatora i należy utworzyć nową komórkę, komórka zostanie zainicjowana przez wywołanie jej initWithFrame:
metody.
Poprawka: Dodaj initWithFrame:
konstruktor w następujący sposób:
[Export ("initWithFrame:")]
public YourCellClassName (CGRect frame) : base (frame)
{
Initialize (); // refactor initialize code into a method
}
Powiązane przykłady: MotionGraph, TextKitDemo
Funkcja UIView nie może zainicjować elementu Coder podczas ładowania widoku z elementu Xib/Nib
Przyczyna: Konstruktor jest wywoływany initWithCoder:
podczas ładowania widoku z pliku Xib konstruktora interfejsu. Jeśli ten konstruktor nie jest eksportowany, niezarządzany kod nie może wywołać zarządzanej wersji. Wcześniej (np. w systemie iOS 8) IntPtr
konstruktor został wywołany do inicjowania widoków.
Poprawka: Utwórz i wyeksportuj initWithCoder:
konstruktor w następujący sposób:
[Export ("initWithCoder:")]
public YourClassName (NSCoder coder) : base (coder)
{
Initialize (); // refactor initialize code into a method
}
Powiązany przykład: Czat
Komunikat Dyld: Brak obrazu pamięci podręcznej o nazwie...
Może wystąpić awaria z następującymi informacjami w dzienniku:
Dyld Error Message:
Dyld Message: no cach image with name (/System/Library/PrivateFrameworks/JavaScriptCore.framework/JavaScriptCore)
Powód: Jest to usterka w natywnym konsolidatorze firmy Apple, która występuje, gdy upubliczniają prywatną strukturę (JavaScriptCore została upubliczniona w systemie iOS 7, wcześniej była to struktura prywatna), a celem wdrożenia aplikacji jest wersja systemu iOS, gdy platforma była prywatna. W tym przypadku konsolidator firmy Apple połączy się z prywatną wersją platformy zamiast wersji publicznej.
Poprawka: ta opcja zostanie usunięta dla systemu iOS 9, ale istnieje łatwe obejście, które można zastosować samodzielnie w międzyczasie: wystarczy wybrać późniejszą wersję systemu iOS w projekcie (w tym przypadku można wypróbować system iOS 7). Inne struktury mogą wykazywać podobne problemy, na przykład struktura WebKit została upubliczniona w systemie iOS 8 (a więc kierowanie do systemu iOS 7 spowoduje ten błąd; należy kierować system iOS 8 do korzystania z zestawu WebKit w aplikacji).
Niezaufany deweloper przedsiębiorstwa
Podczas próby uruchomienia aplikacji platformy Xamarin.iOS w wersji 9 na rzeczywistym sprzęcie z systemem iOS może zostać wyświetlony komunikat informujący, że twoje konto dewelopera nie było zaufane na urządzeniu. Na przykład:
Aby rozwiązać ten problem, wykonaj następujące czynności:
Uruchom program Xcode (najnowszą wersję beta) na komputerze Mac deweloperów.
Wybierz pozycję Urządzenia z menu Okno , aby otworzyć okno Urządzenia:
W panelu bocznym URZĄDZENIA wybierz urządzenie, kliknij prawym przyciskiem myszy i wybierz pozycję Pokaż profile aprowizacji...:
Wybierz każdy profil aprowizacji aktualnie na urządzeniu i wybierz przycisk, - aby go usunąć:
Z menu Xcode wybierz pozycję Preferencje... i Konta:
Kliknij przycisk Wyświetl szczegóły... i wybierz przycisk Pobierz wszystko:
Po zakończeniu aktualizowania listy wybierz przycisk Gotowe i zamknij okno Preferencje.
Usuń istniejącą wersję aplikacji platformy Xamarin.iOS, którą próbowano przetestować z urządzenia z systemem iOS.
Wróć do Visual Studio dla komputerów Mac, wykonaj czystą kompilację i spróbuj ponownie uruchomić aplikację na urządzeniu.
Może być konieczne zatrzymanie i ponowne uruchomienie Visual Studio dla komputerów Mac, zanim będą widoczne nowe profile aprowizacji załadowane przez program Xcode. Może być również konieczne dostosowanie opcji podpisywania pakietu systemu iOS dla aplikacji Xamarin.iOS, aby wybrać nowe profile aprowizacji.
Problemy z ekranem uruchamiania
System iOS 9 wymusza teraz wymagania dotyczące ekranu uruchamiania, dzięki czemu ten sam obraz uruchamiania nie może być już ponownie używany do obsługi różnych orientacji interfejsu. Aby uzyskać więcej informacji, zobacz dokumentację UILanchImage firmy Apple.
Opcjonalnie możesz użyć pliku scenorysu, aby przedstawić ekran uruchamiania aplikacji, a nie przy użyciu zestawu plików obrazów .png . Jest to teraz preferowany sposób prezentowania ekranów launch firmy Apple. Aby uzyskać więcej informacji, zobacz przewodnik Wprowadzenie do ujednoliconych scenorysów .
Na koniec aplikacja musi używać pliku scenorysu dla ekranu uruchamiania i obsługiwać wszystkie cztery orientacje interfejsu (pionowy, pionowy, lewy poziomy i poziomy w prawo), aby można je było uznać za uruchomione w panelu Przesuwa nad lub w trybie widoku podzielonego. Aby dowiedzieć się więcej o nowych możliwościach wielozadaniowości systemu iOS 9, zobacz nasz przewodnik multitasking for iPad (Multitasking for iPad guide).
Wyjątek NSInternalInconsistencyException
Podczas kompilowania i uruchamiania istniejącej aplikacji platformy Xamarin.iOS dla systemu iOS 9 może wystąpić błąd w formularzu:
Objective-C Wyjątek. Nazwa: NSInternalInconsistencyException Przyczyna: Okna aplikacji powinny mieć kontroler widoku głównego na końcu uruchamiania aplikacji
Ten błąd jest zgłaszany, ponieważ system Windows aplikacji powinien mieć kontroler widoku głównego na końcu uruchamiania aplikacji, a istniejąca aplikacja nie.
Istnieją co najmniej dwa możliwe obejścia tego problemu:
- Zaktualizuj aplikację, aby używała pliku scenorysu
xib
zamiast plików w celu zdefiniowania interfejsu użytkownika. Wymaga to dużo czasu, aby poprawić, w zależności od rozmiaru aplikacji i wiedzy o sposobie używania konstruktora interfejsu Xcode do układów scenorysów. Aby uzyskać więcej informacji, zobacz dokumentację Wprowadzenie do ujednoliconych scenorysów . - Skonfiguruj
RootViewController
właściwość okna aplikacji w metodzie wFinishedLaunching
AppDelegate
klasie, aby wskazać kontroler widoku w interfejsie użytkownika aplikacji.
Kiedy inicjować widoki i wyświetlać kontrolery
W przypadku platformy Xamarin.iOS można zainicjować kontrolery widoków lub widoków wewnątrz konstruktorów, które są wywoływane, gdy coś jest uwidocznione w kodzie zarządzanym, ale przerywa projektowanie systemu iOS.
Ogólnie rzecz biorąc, nie należy inicjować niczego, co może wywołać kod wstecz Objective-C z konstruktora, ponieważ nie można mieć pewności, kiedy zostanie wywołana. Oznacza to również, że istnieje lepsze miejsce (inne ctor) lub wywołania przesłonięcia (jak Objective-C nie ma zdarzeń), w których należy wykonać tę inicjację.