Compartir vía


Xamarin.iOS 9: Solucionar problemas

En este artículo se proporcionan varias sugerencias de solución de problemas para trabajar con iOS 9 en aplicaciones Xamarin.iOS.

¿Dónde están los simuladores de iOS 8?

Si ha instalado Xcode 7 (o superior), reemplazará automáticamente todos los simuladores de iOS 8 por simuladores de iOS 9 de forma predeterminada. Si todavía necesita probar en iOS 8, puede iniciar Xcode y, a continuación, descargar e instalar los simuladores de iOS 8.

En Xcode, seleccione el menú Xcode y, después, Preferencias...>Descargas:

Descargas de simuladores de iOS 8

Seleccione el botón Comprobar e instalar ahora para volver a instalar los simuladores de iOS 8.

Restricción de diseño con errores de atributo izquierdo/derecho

En iOS 8 (y anteriores), los elementos de la interfaz de usuario de guiones gráficos podrían usar una combinación de atributos de derecha e izquierda (NSLayoutAttributeRight y NSLayoutAttributeLeft) y atributos inicial y final (NSLayoutAttributeLeading y NSLayoutAttributeTrailing) en el mismo diseño.

Si se ejecuta el mismo guión gráfico en iOS 9, se producirá una excepción como la siguiente:

Terminación de la aplicación debido a una excepción no detectada 'NSInvalidArgumentException', motivo: '*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: No se puede realizar una restricción entre un atributo inicial o final y un atributo derecho/izquierdo. Use inicial o final para ambos o ninguno de ellos.

iOS 9 aplica diseños para usar atributos Right & Left o Leading & Trailing, pero no ambos. Para corregir este problema, cambie todas las restricciones de diseño para usar el mismo conjunto de atributos dentro del archivo de guion gráfico.

Para obtener más información, consulte la explicación de Stack Overflow del error de restricción de iOS 9.

ERROR ITMS-90535: Unexpected CFBundleExecutable Key

Después de cambiar a iOS 9, desde una aplicación usa componentes de terceros (específicamente nuestro componente existente de Google Mapas) que se compiló y ejecutó en iOS 8 (o versiones anteriores), al intentar enviar la nueva compilación a iTunes Connect puede obtener un error como el siguiente:

ERROR ITMS-90535: Unexpected CFBundleExecutable Key. La agrupación en "Payload/app-name.app/component.bundle" no contiene un ejecutable de lote...

Este problema normalmente se puede resolver mediante la búsqueda del lote con nombre en el proyecto y, después, como sugiere el mensaje de error, editó el Info.plist que se encuentra en la agrupación quitando la clave CFBundleExecutable. La clave CFBundlePackageType también debe establecerse en BNDL.

Después de realizar estos cambios, haga una limpieza y recompile todo el proyecto. Puede enviar a iTunes Connect sin problemas después de realizar estos cambios.

Para obtener más información, consulte esta discusión en Stack Overflow.

Error de CFNetwork SSLHandshake (-9824)

Al intentar conectarse a Internet, ya sea directamente o desde una vista web en iOS 9, es posible que reciba un error parecido a este:

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)

O como este:

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.

En iOS9, App Transport Security (ATS) aplica conexiones seguras entre los recursos de Internet (como el servidor back-end de la aplicación) y su aplicación. Además, ATS requiere la comunicación mediante el protocolo HTTPS y la comunicación de API de alto nivel para cifrarse mediante TLS versión 1.2 con confidencialidad directa.

Dado que ATS está habilitado de forma predeterminada en las aplicaciones creadas para iOS 9 y OS X 10.11 (El Capitan), todas las conexiones que utilicen NSURLConnection, CFURL o NSURLSession estarán sujetas a los requisitos de seguridad de ATS. Si las conexiones no cumplen estos requisitos, producirán un error con una excepción.

Consulte la sección No participar en ATS de nuestra guía de Seguridad de transporte de aplicaciones para obtener información sobre cómo resolver este problema.

Mis aplicaciones existentes no se ejecutan en iOS 9

Consulte nuestra información de compatibilidad de iOS 9 para obtener instrucciones sobre cómo volver a generar y volver a implementar las aplicaciones existentes para que se ejecuten en iOS 9.

UICollectionViewCell.ContentView es Null en Constructores

Motivo: en iOS 9, el constructor initWithFrame: ahora es necesario, debido a los cambios de comportamiento en iOS 9 como indica la documentación de UICollectionView. Si registró una clase para el identificador especificado y se debe crear una nueva celda, la celda ahora se inicializa llamando a su método initWithFrame:.

Corrección: agregue el constructor initWithFrame: de la siguiente manera:

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

Ejemplos relacionados: MotionGraph, TextKitDemo

UIView no puede inicializarse con Coder al cargar una vista desde un Xib/Nib

Motivo: se llama al constructor initWithCoder: al cargar una vista desde un archivo Xib de Interface Builder. Si este constructor no se exporta, el código no administrado no puede llamar a la versión administrada de él. Anteriormente (por ejemplo, en iOS 8), el constructor IntPtr se invocó para inicializar vistas.

Corrección: cree y exporte el constructor initWithCoder: de la siguiente manera:

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

Ejemplo relacionado: Chat

Mensaje de Dyld: sin imagen de caché con nombre...

Es posible que experimente un bloqueo con la siguiente información en el registro:

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

Motivo: este es un error en el enlazador nativo de Apple, que sucede cuando hacen público un marco privado (JavaScriptCore se hizo público en iOS 7, antes de que fuera un marco privado) y el destino de implementación de la aplicación es para una versión de iOS de cuando el marco era privado. En este caso, el enlazador de Apple se vinculará con la versión privada del marco en lugar de la versión pública.

Corrección: esto se solucionará para iOS 9, pero hay una solución fácil que puede aplicarse mientras tanto: simplemente tener como destino una versión de iOS posterior en el proyecto (puede probar iOS 7 en este caso). Otros marcos podrían presentar problemas similares, por ejemplo, el marco WebKit se hizo público en iOS 8 (y, por tanto, el destino de iOS 7 dará como resultado este error; debe tener como destino iOS 8 para usar WebKit en la aplicación).

Desarrollador empresarial que no es de confianza

Al intentar ejecutar la versión de iOS 9 de la aplicación de Xamarin.iOS en hardware iOS real, es posible que reciba un mensaje donde se indica que el dispositivo no confía en la cuenta de desarrollador. Por ejemplo:

Alerta de desarrollador empresarial que no es de confianza

Para resolver este problema, haga lo siguiente:

  1. Inicie Xcode (la versión beta más reciente) en el equipo Mac de desarrollo.

  2. Seleccione Dispositivos en el menú Ventana para abrir la ventana Dispositivos:

    Ventana Dispositivos

  3. En el panel lateral DISPOSITIVOS, seleccione el dispositivo, haga clic con el botón derecho y seleccione Mostrar perfiles de aprovisionamiento...:

    Mostrar perfiles de aprovisionamiento

  4. Seleccione cada perfil de aprovisionamiento actualmente en el dispositivo y seleccione el botón - para eliminarlo:

    Eliminación de un perfil de aprovisionamiento

  5. En el menú Xcode, seleccione Preferencias... y Cuentas:

    Preferencias de la cuenta de Xcode

  6. Haga clic en el botón Ver detalles... y seleccione el botón Descargar todo:

    Descargar todos los perfiles

  7. Cuando la lista haya terminado de actualizarse, seleccione el botón Listo y cierre la ventana Preferencias.

  8. Quite la versión existente de la aplicación Xamarin.iOS que estaba intentando probar desde el dispositivo iOS.

  9. Vuelva a Visual Studio para Mac, realice una compilación limpia e intente volver a ejecutar la aplicación en el dispositivo.

Es posible que tenga que detener y reiniciar Visual Studio para Mac antes de que se vean los nuevos perfiles de aprovisionamiento cargados por Xcode. También puede que tenga que ajustar las opciones de firma de paquetes de iOS para la aplicación de Xamarin.iOS, con el fin de seleccionar los nuevos perfiles de aprovisionamiento.

Problemas de la pantalla de inicio

iOS 9 ahora aplica los requisitos de la pantalla de inicio para que la misma imagen de inicio ya no se pueda reutilizar para admitir diferentes orientaciones de interfaz. Consulte la referencia de UILanchImage de Apple para obtener más información.

Opcionalmente, puede usar un archivo de guion gráfico para presentar la pantalla de inicio de la aplicación en lugar de usar un conjunto de archivos de imagen de .png. Esta es ahora la forma preferida de Apple de presentar pantallas de inicio. Consulte nuestra documentación de Introducción a guiones gráficos.

Por último, la aplicación debe usar un archivo de guion gráfico para su pantalla de inicio y admitir las cuatro orientaciones de interfaz (vertical, vertical invertido, horizontal izquierda y horizontal derecha) que se deben considerar para ejecutarse en un panel deslizante o en modo vista dividida. Para más información sobre las nuevas funcionalidades multitarea de iOS 9, vea nuestra guía Multitarea para iPad.

Excepción NSInternalInconsistencyException

Al compilar y ejecutar una aplicación de Xamarin.iOS existente para iOS 9, es posible que reciba un error como el siguiente:

Se inicia una excepción Objective-C. Nombre: NSInternalInconsistencyException Motivo: Se espera que las ventanas de la aplicación tengan un controlador de vista raíz al final del inicio de la aplicación

Este error se produce porque se espera que las aplicaciones de Windows tengan un controlador de vista raíz al final del inicio de la aplicación y la aplicación existente no lo haga.

Hay al menos dos posibles soluciones alternativas para este problema:

  1. Actualice la aplicación para usar el archivo de guion gráfico en lugar de los archivos para definir su interfaz de usuario xib. Corregir esto requiere mucho tiempo, en función del tamaño de la aplicación y el conocimiento de cómo usar Interface Builder de Xcode para diseñar guiones gráficos. Para obtener más información, consulte nuestra documentación de Introducción a guiones gráficos unificados.
  2. Configure la propiedad RootViewController de la ventana de la aplicación en el método FinishedLaunching de la clase AppDelegate para que apunte a un controlador de vista en la interfaz de usuario de la aplicación.

Cuándo inicializar vistas y controladores de vista

Con Xamarin.iOS, es posible que las vistas o los controladores de vista se inicialicen dentro de los constructores, a los que se llama cuando se expone algo en código administrado, pero esto afecta al diseño de iOS.

En general, no debe inicializar nada que pueda llamar al código Objective-C desde el constructor, ya que no se puede saber con certeza cuándo se llamará. Esto también significa que hay un lugar mejor (otro .ctor) o llamadas a invalidar (dado que Objective-C no tiene eventos) donde se debe realizar esta inicialización.