Xamarin.iOS 9 - Risoluzione dei problemi
Questo articolo fornisce diversi suggerimenti per la risoluzione dei problemi relativi all'uso di iOS 9 nelle app Xamarin.iOS.
Dove sono i simulatori iOS 8?
Se Xcode 7 (o versione successiva) è installato, sostituirà automaticamente tutti i simulatori iOS 8 con simulatori iOS 9 per impostazione predefinita. Se è ancora necessario eseguire il test in iOS 8, è possibile avviare Xcode, quindi scaricare e installare i simulatori iOS 8.
In Xcode selezionare il menu Xcode e quindi Preferenze...>Download:
Selezionare il pulsante Controlla e installa adesso per reinstallare i simulatori iOS 8.
Vincolo di layout con errori di attributo sinistro/destro
In iOS 8 (e versioni precedenti), gli elementi dell'interfaccia utente negli storyboard possono usare una combinazione di attributi sia di destra che di sinistra (NSLayoutAttributeRight
& NSLayoutAttributeLeft
) e di attributi iniziali e finali (NSLayoutAttributeLeading
& NSLayoutAttributeTrailing
) nello stesso layout.
Se lo stesso storyboard viene eseguito in iOS 9, verrà generata un'eccezione nel formato seguente:
Terminazione dell'app a causa di un'eccezione non rilevata 'NSInvalidArgumentException', motivo: '** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: Non è possibile eseguire un vincolo tra un attributo iniziale/finale e un attributo destro/sinistro. Usare l'inizialità/finale per entrambi o nessuno dei due.
iOS 9 applica i layout per usare gli attributi Right & Left o Leading & Trailing, ma non entrambi. Per risolvere questo problema, modificare tutti i vincoli di layout per usare lo stesso set di attributi all'interno del file Storyboard.
Per altre informazioni, vedere la discussione sull'errore del vincolo iOS 9 Stack Overflow.
ERRORE ITMS-90535: Chiave CFBundleExecutable imprevista
Dopo il passaggio a iOS 9, da un'app vengono usati componenti di terze parti (in particolare il componente Google Maps esistente) compilati ed eseguiti in iOS 8 (o versioni precedenti), quando si tenta di inviare la nuova build a iTunes Connect, è possibile ottenere un errore nel formato:
ERRORE ITMS-90535: Chiave CFBundleExecutable imprevista. Il bundle in "Payload/app-name.app/component.bundle" non contiene un eseguibile del bundle...
Questo problema può essere in genere risolto trovando il bundle denominato nel progetto, così come suggerisce il messaggio di errore, ha modificato l'oggetto Info.plist
presente nel bundle rimuovendo la CFBundleExecutable
chiave. Anche la CFBundlePackageType
chiave deve essere impostata su BNDL
.
Dopo aver apportato queste modifiche, eseguire una pulizia e ricompilare l'intero progetto. È possibile inviare a iTunes Connect senza problemi dopo aver apportato queste modifiche.
Per altre informazioni, vedere questa discussione su Stack Overflow .
Errore CFNetwork SSLHandshake (-9824)
Quando si tenta di connettersi a Internet, direttamente o da una visualizzazione Web in iOS 9, è possibile che venga visualizzato un errore nel modulo:
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)
Oppure nel formato :
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.
In iOS9, App Transport Security (ATS) applica connessioni sicure tra le risorse Internet (ad esempio il server back-end dell'app) e l'app. ATS richiede inoltre la comunicazione tramite il HTTPS
protocollo e la comunicazione api di alto livello per essere crittografata usando TLS versione 1.2 con segreto d'inoltro.
Poiché ATS è abilitato per impostazione predefinita nelle app compilate per iOS 9 e OS X 10.11 (El Capitan), tutte le connessioni che usano NSURLConnection
, CFURL
o NSURLSession
saranno soggette ai requisiti di sicurezza di ATS. Se le connessioni non soddisfano questi requisiti, avranno esito negativo con un'eccezione.
Per informazioni su come risolvere questo problema, vedere la sezione Rifiuto esplicito di ATS della guida alla sicurezza del trasporto app.
Le app esistenti non vengono eseguite in iOS 9
Vedere le informazioni sulla compatibilità di iOS 9 per istruzioni sulla ricompilazione e la ridistribuzione delle app esistenti da eseguire in iOS 9.
UICollectionViewCell.ContentView è Null nei costruttori
Motivo: in iOS 9 il initWithFrame:
costruttore è ora necessario, a causa delle modifiche del comportamento in iOS 9 come stato della documentazione UICollectionView. Se è stata registrata una classe per l'identificatore specificato e deve essere creata una nuova cella, la cella viene ora inizializzata chiamando il relativo initWithFrame:
metodo.
Correzione: aggiungere il initWithFrame:
costruttore come segue:
[Export ("initWithFrame:")]
public YourCellClassName (CGRect frame) : base (frame)
{
Initialize (); // refactor initialize code into a method
}
Esempi correlati: MotionGraph, TextKitDemo
UIView non riesce a eseguire l'init con Coder durante il caricamento di una visualizzazione da un xib/nib
Motivo: il initWithCoder:
costruttore viene chiamato quando si carica una visualizzazione da un file Xib di Interface Builder. Se questo costruttore non viene esportato, il codice non gestito non può chiamarne la versione gestita. In precedenza (ad esempio, in iOS 8) il IntPtr
costruttore veniva richiamato per inizializzare le visualizzazioni.
Correzione: creare ed esportare il initWithCoder:
costruttore come segue:
[Export ("initWithCoder:")]
public YourClassName (NSCoder coder) : base (coder)
{
Initialize (); // refactor initialize code into a method
}
Esempio correlato: Chat
Messaggio Dyld: Nessuna immagine della cache con nome...
È possibile che si verifichi un arresto anomalo con le informazioni seguenti nel log:
Dyld Error Message:
Dyld Message: no cach image with name (/System/Library/PrivateFrameworks/JavaScriptCore.framework/JavaScriptCore)
Motivo: si tratta di un bug nel linker nativo di Apple, che si verifica quando rendono pubblico un framework privato (JavaScriptCore è stato reso pubblico in iOS 7, prima che fosse un framework privato) e la destinazione di distribuzione dell'app è per una versione iOS quando il framework era privato. In questo caso il linker di Apple verrà collegato alla versione privata del framework anziché alla versione pubblica.
Correzione: questo problema verrà risolto per iOS 9, ma esiste una soluzione semplice che è possibile applicare manualmente nel frattempo: è sufficiente usare una versione iOS successiva nel progetto (in questo caso è possibile provare iOS 7). Altri framework potrebbero presentare problemi simili, ad esempio il framework WebKit è stato reso pubblico in iOS 8 (e quindi la destinazione di iOS 7 genererà questo errore; è consigliabile usare iOS 8 per usare WebKit nell'app).
Sviluppatore enterprise non attendibile
Quando si tenta di eseguire la versione iOS 9 dell'app Xamarin.iOS su hardware iOS reale, è possibile che venga visualizzato un messaggio che informa che l'account per sviluppatore non è stato considerato attendibile nel dispositivo. Ad esempio:
Per risolvere questo problema, eseguire le operazioni seguenti:
Avviare Xcode (la versione beta più recente) nel Mac di sviluppo.
Selezionare Dispositivi dal menu Finestra per aprire la finestra Dispositivi:
Nel pannello laterale DISPOSITIVI selezionare il dispositivo, fare clic con il pulsante destro del mouse e scegliere Mostra profili di provisioning...:
Selezionare ogni profilo di provisioning attualmente nel dispositivo e selezionare il - pulsante per eliminarlo:
Dal menu Xcode selezionare Preferenze e Account:
Fare clic sul pulsante Visualizza dettagli... e quindi selezionare il pulsante Scarica tutto :
Al termine dell'aggiornamento dell'elenco, selezionare il pulsante Fine e chiudere la finestra Preferenze.
Rimuovere la versione esistente dell'app Xamarin.iOS che si sta tentando di testare dal dispositivo iOS.
Tornare a Visual Studio per Mac, eseguire una compilazione pulita e provare a rieseguire l'app nel dispositivo.
Potrebbe essere necessario arrestare e riavviare Visual Studio per Mac prima che vengano visualizzati i nuovi profili di provisioning caricati da Xcode. Potrebbe anche essere necessario modificare le opzioni di firma del bundle iOS per l'app Xamarin.iOS per selezionare i nuovi profili di provisioning.
Problemi della schermata di avvio
iOS 9 applica ora i requisiti della schermata di avvio in modo che la stessa immagine di avvio non possa più essere riutilizzata per supportare diversi orientamenti dell'interfaccia. Per altre informazioni, vedere UiLanchImage Reference (Informazioni di riferimento su UILanchImage) di Apple.
Facoltativamente, puoi usare un file storyboard per presentare la schermata di avvio dell'app anziché usare un set di file di immagine .png . Questo è il modo preferito di Apple per presentare le schermate di avvio. Per altre informazioni, vedere la guida introduttiva agli storyboard unificati.
Infine, l'app deve usare un file storyboard per la schermata di avvio e supportare tutti e quattro gli orientamenti dell'interfaccia (Verticale, Verticale rovesciato, Orizzontale sinistro e Orizzontale destro) da considerare per l'esecuzione in un pannello Slide Over o in modalità Doppia visualizzazione. Per saperne di più sulle nuove capacità multitasking di iOS 9, vedi la nostra guida multitasking per iPad .
Eccezione NSInternalInconsistencyException
Durante la compilazione e l'esecuzione di un'app Xamarin.iOS esistente per iOS 9, è possibile che venga visualizzato un errore nel formato:
Objective-C eccezione generata. Nome: NSInternalInconsistencyException Reason: le finestre dell'applicazione devono avere un controller di visualizzazione radice alla fine dell'avvio dell'applicazione
Questo errore viene generato perché l'app Windows dovrebbe avere un controller di visualizzazione radice alla fine dell'avvio dell'applicazione e l'app esistente non lo fa.
Esistono almeno due possibili soluzioni alternative per questo problema:
- Aggiornare l'app per usare il file storyboard anziché i
xib
file per definire l'interfaccia utente. Questo richiede molto tempo per correggere, a seconda delle dimensioni dell'app e della conoscenza di come usare Interface Builder di Xcode per il layout degli storyboard. Per altre informazioni, vedere la documentazione introduttiva agli storyboard unificati. - Configurare la
RootViewController
proprietà Finestra dell'app nel metodo nellaFinishedLaunching
AppDelegate
classe in modo che punti a un controller di visualizzazione nell'interfaccia utente dell'app.
Quando inizializzare visualizzazioni e controller di visualizzazione
Con Xamarin.iOS, è possibile che le visualizzazioni o i controller di visualizzazione vengano inizializzati all'interno dei costruttori, che vengono chiamati quando un elemento viene esposto nel codice gestito, ma interrompe la progettazione iOS.
In generale, non è consigliabile inizializzare tutto ciò che può richiamare Objective-C il codice dal costruttore perché non è possibile essere sicuri quando verrà chiamato. Ciò significa anche che c'è un posto migliore (altri .ctor) o chiamate per eseguire l'override (come Objective-C non ha eventi) in cui deve essere eseguita questa inizializzazione.