Después de actualizar a Xcode 11.2 desde Xcode 11.1, la aplicación se bloquea debido a _UITextLayoutView

351

Después de actualizar a Xcode 11.2 desde Xcode 11.1, mi aplicación se bloquea:

*** Finalización de la aplicación debido a la excepción no detectada 'NSInvalidUnarchiveOperationException', razón: 'No se pudo crear una instancia de la clase llamada _UITextLayoutView porque no se encontró ninguna clase llamada _UITextLayoutView; la clase debe definirse en el código fuente o vincularse desde una biblioteca (asegúrese de que la clase sea parte del objetivo correcto) '

¿Por qué está pasando esto? ¿Cómo puedo prevenir este bloqueo?

Sudhakar Tharigoppula
fuente
17
Parece que el error Xcode 11.2. Consulte el hilo forum.developer.apple.com/thread/125287 . Lo más probable es que esté relacionado con TextViews en la jerarquía
Pavel Stepanov el
3
@DanielStorm desafortunadamente, eso no ayudó. Acabo de agregar un UITextView simple a una pantalla que no lo tenía antes (y tampoco se bloqueó antes :)). Ahora se bloquea con el mismo error. El problema persiste para todos los dispositivos / simuladores, excepto para el último iOS 13.2
Pavel Stepanov el
3
¿Alguien sabe si esto bloqueará las aplicaciones de producción creadas con Xcode 11.2 cuando se ejecuta en dispositivos iOS 13.1.2?
gfpacheco
2
esta es una pregunta perfectamente buena, de ahí los 198 votos, por lo que no estoy seguro de por qué alguien lo marcó como "en espera no está claro"
Mike Volmar
44
@MikeVolmar He votado para cerrar y ya no es relevante. Se solucionó con 11.2.1. Esta pregunta tenía una ventana muy corta de utilidad.
rmaddy

Respuestas:

145

Enhorabuena

La nueva versión de Xcode (11.2.1) está disponible ahora, que es la mejor manera de deshacerse de este problema.

Soluciones alternativas

@Mojtaba Hosseini, la solución que propuse fue de la ayuda y la participación de mi parte a mis colegas desarrolladores sobre StackOverflow. Usted, yo y el resto del desarrollador aquí ya sabemos que cuando Apple anuncie la nueva versión, este problema desaparecerá.

Pero al lado de todo

La solución mencionada anteriormente fue definitivamente aceptada por Apple Review, ya que no hay ninguna API privada involucrada en absoluto. Este enfoque es muy similar a la propiedad de creación como

@interface UITextView (diseño)

O

UITextView + Layout.h

Entonces, cuando está creando una propiedad, está utilizando directamente los componentes privados de APPLE y los modula según sus necesidades o requisitos.

El ejemplo simple son las clases de AMFNetworking

- (void)setImageWithURL:(NSURL *)url {
    [self setImageWithURL:url placeholderImage:nil];
}

Espero haber terminado con la acusación

La respuesta a continuación fue solo un poco de ayuda de mi parte para permitir que el desarrollador continúe desarrollando, ya que inicialmente propusimos que el desarrollador retrotraiga Xcode. Fue una mala práctica volver a descargar Xcode de 8 GB ya que todos sabemos que la nueva versión de Xcode se lanzará pronto.

Si bien está corregido en Xcode 11.2.1, obtuve una solución para Xcode 11.2 por la cual puede deshacerse de este bloqueo:

*** Finalización de la aplicación debido a la excepción no detectada 'NSInvalidUnarchiveOperationException', razón: 'No se pudo crear una instancia de la clase llamada _UITextLayoutView porque no se encontró ninguna clase llamada _UITextLayoutView; la clase debe definirse en el código fuente o vincularse desde una biblioteca (asegúrese de que la clase sea parte del objetivo correcto) '

SOLUCIÓN

Vaya a la búsqueda de Configuración de compilación para "DEAD_CODE_STRIPPING" y configúrelo en NO

DEAD_CODE_STRIPPING = NO

Entonces

crear archivos UITextViewWorkaround

UITextViewWorkaround.h

    #import <Foundation/Foundation.h>


    @interface UITextViewWorkaround : NSObject
    + (void)executeWorkaround; 
@end

UITextViewWorkaround.m

#import "UITextViewWorkaround.h"
#import  <objc/runtime.h>



    @implementation UITextViewWorkaround

    + (void)executeWorkaround {
        if (@available(iOS 13.2, *)) {
        }
        else {
            const char *className = "_UITextLayoutView";
            Class cls = objc_getClass(className);
            if (cls == nil) {
                cls = objc_allocateClassPair([UIView class], className, 0);
                objc_registerClassPair(cls);
    #if DEBUG
                printf("added %s dynamically\n", className);
    #endif
            }
        }
    }

    @end

ejecutarlo en el delegado de la aplicación

#import "UITextViewWorkaround.h"

        - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
            // Override point for customization after application launch.

            [UITextViewWorkaround executeWorkaround];
    return yes;
    }

Compila el código y tendrás una aplicación en ejecución :)

aftab muhammed khan
fuente
2
Si funciona para usted, por favor, suba de rango para que otros puedan probar esta solución también
aftab muhammed khan el
3
@Hardy_Germany Probé esto un poco, para Swift puedes probar: class UITextViewWorkaround: NSObject {class func executeWorkaround () {if #available (iOS 13.2, *) {} else {let className = "_UITextLayoutView" var cls = objc_getClass (className ) if cls == nil {cls = objc_allocateClassPair (UIView.self, className, 0) objc_registerClassPair (cls as! AnyClass) #if DEBUG print ("agregado% @ dinámicamente \ n", className); #endif}}}}
John Nimis
2
@DaveDude DEAD_CODE_STRIPPING = NO es necesario si utiliza Swift Package Manager con Xcode 11.2
Cœur
55
@pradipsutariya sí, por supuesto, ¿por qué no cambiamos nunca nada en CLASES DE MANZANAS?
aftab muhammed khan
55
Solo se lanza Xcode 11.2.1 GM seed (beta). La versión estable puede lanzarse pronto.
Lal Krishna el
221

Actualización: ¡arreglado! 🎉🎊

La ÚNICA solución es actualizar

Este error se corrigió en Xcode 11.2.1. Así que puedes descargarlo y usarlo desde aquí.

Los guiones gráficos que contienen un UITextView ya no harán que la aplicación se bloquee en las versiones del sistema operativo anteriores a iOS 13.2, tvOS 13.2 o macOS 10.15.2. (56808566, 56873523)


Xcode 11.2 está en desuso por Apple el 5 de noviembre de 2019

Si alguna vez intenta enviar su aplicación que se compila con Xcode 11.2 a la AppStore, será rechazado:

Advertencia de funcionamiento de App Store Connect

ADVERTENCIA ITMS-90703 : " Desactivación de Xcode Build. Debido a problemas resueltos de archivos de aplicaciones, hemos desaprobado Xcode 11.2 el 5 de noviembre de 2019. Descargue Xcode 11.2.1 o posterior, reconstruya su aplicación y vuelva a enviarla".

Entonces, todas las soluciones alternativas hechas con Xcode 11.2 son inútiles


Es un error para Xcode 11.2, y se corrigió en Xcode 11.2.1.

Solución (es)

Volver al rollo anterior Xcode liberación de la versión de: Rollback no es una opción más y AppStore rechazará cualquier acumulación con Xcode continuación 11.2.1 echar un vistazo a este

https://developer.apple.com/services-account/download?path=/Developer_Tools/Xcode_11.1/Xcode_11.1.xip

Tenga en cuenta que debe usar Safari para descargarlo y primero debe iniciar sesión en el portal de desarrolladores de Apple .

Puede encontrar todas las otras versiones de Xcode y otros enlaces de recursos (incluidas las versiones de lanzamiento y beta) aquí en https://developer.apple.com/download/more

La solución

Esto es muy difícil pero está trabajando para solucionarlo. Reemplace todos los UITextViews en storyboard sy Xib s con la versión de código puro .


Tenga en cuenta que este error es encontrado y reparado por Apple

Fijo

También anteriormente, el error fue confirmado por Apple Staff edford

Confirmación


Para aquellos con iOS 13.2 y que ya no pueden usar Xcode 11.1:

  1. Actualice macOS a 10.15.1 o posterior
  2. Instale Xcode 11.2.1 o posterior
  3. Debería funcionar ahora en el dispositivo actualizado.

Para aquellos con storyboard:

  1. Subclase UITextView
  2. Asignarlo a todos los UITextViewobjetos.
  3. No olvide actualizar los cambios de propiedad que puedan perderse en la subclase.

Para aquellos que se sienten cómodos con el método swizzling (Objc y comportamiento dinámico)

Diríjase a la respuesta @aftab muhammed khan para Objective-C y la respuesta @MikRo para la versión adaptada Swift

Simplemente no lo hagas más:

¡Incluso si estas dos últimas soluciones alternativas no están utilizando la API privada de Apple , serán rechazadas en AppStore porque Apple no aceptará compilaciones con versiones de Xcode en 11.2.1 !

Una vez mas:

Xcode 11.2 está en desuso por Apple el 5 de noviembre de 2019

Mojtaba Hosseini
fuente
3
Triste, pero la solución está funcionando para mí. ¡Gracias! 11.1 obras. No sugeriría convertir a código puro, porque apuesto a que pronto saldrá una solución. Si no le importa: actualice esta respuesta una vez que haya una nueva versión que funcione. Sería malo si la gente comienza a descargar el evento 11.1 aunque hay una versión fija por ahí :)
Sebastian Weiß
2
Ya tengo 11.1 pero no funcionó, no actualicé a 11.2.
JAHelia el
66
Tenga en cuenta que probablemente debería eliminar la aplicación de su dispositivo de desarrollo y / o limpiar la carpeta de compilación de Xcode ( CMD + Shift + K)
JeroenJK
3
¿Cómo puedo actualizar a v11.2.1? No aparece en la tienda de aplicaciones. ¡Y descargar la semilla GM desde el portal del desarrollador intenta descargar la aplicación por alrededor de 8 gb!
Mesqueeb
3
Además, si está en desuso, ¿por qué Apple no solo elimina 11.2 en la tienda de aplicaciones por ahora?
Malcolm Salvador
40

El problema se solucionó en Xcode 11.2.1.

EDITAR: a medida que se publica la solución, debe cambiar a esa versión de Xcode y comentar esta solución. Como Mojtaba Hosseini en su respuesta mencionó:

... ¡Estas dos últimas soluciones alternativas están utilizando la API privada de Apple y serán rechazadas de la revisión de Apple!

Para el tiempo hasta que Apple lanzó la solución, esta fue una buena solución para continuar desarrollando y probando.


Para Xcode 11.2, basado en la idea de Aftab Muhammed Khan y con la ayuda de John Nimis, acabo de probar el siguiente código.

¡No es necesario cambiar los archivos del guión gráfico!

Edité mi archivo AppDelegate.swift y agregué esta clase

//******************************************************************
// MARK: - Workaround for the Xcode 11.2 bug
//******************************************************************
class UITextViewWorkaround: NSObject {

    // --------------------------------------------------------------------
    // MARK: Singleton
    // --------------------------------------------------------------------
    // make it a singleton
    static let unique = UITextViewWorkaround()

    // --------------------------------------------------------------------
    // MARK: executeWorkaround()
    // --------------------------------------------------------------------
    func executeWorkaround() {

        if #available(iOS 13.2, *) {

            NSLog("UITextViewWorkaround.unique.executeWorkaround(): we are on iOS 13.2+ no need for a workaround")

        } else {

            // name of the missing class stub
            let className = "_UITextLayoutView"

            // try to get the class
            var cls = objc_getClass(className)

            // check if class is available
            if cls == nil {

                // it's not available, so create a replacement and register it
                cls = objc_allocateClassPair(UIView.self, className, 0)
                objc_registerClassPair(cls as! AnyClass)

                #if DEBUG
                NSLog("UITextViewWorkaround.unique.executeWorkaround(): added \(className) dynamically")
               #endif
           }
        }
    }
}

y dentro de la llamada de delegado para "didFinishLaunchingWithOptions" llame a la solución

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    // Override point for customization after application launch.

    // This is the workaround for Xcode 11.2
    UITextViewWorkaround.unique.executeWorkaround()
}
Hardy_Alemania
fuente
34

He adaptado la solución Obj-C de khan a Swift :

import UIKit

@objc
class UITextViewWorkaround : NSObject {

    static func executeWorkaround() {
        if #available(iOS 13.2, *) {
        } else {
            let className = "_UITextLayoutView"
            let theClass = objc_getClass(className)
            if theClass == nil {
                let classPair: AnyClass? = objc_allocateClassPair(UIView.self, className, 0)
                objc_registerClassPair(classPair!)
            }
        }
    }

}

Llámalo al final de didFinishLaunchingWithOptionsin AppDelegate.

Gracias @Aftab!

MikRo
fuente
¿Dónde necesitamos agregar este código? En archivos delegados?
SIDHARTH PU
@SIDHARTHPU puedes llamarlodidFinishLaunchingWithOptions
Lal Krishna el
¿Intentó una variedad de soluciones en este problema y este funcionó hasta Xcode 11.3? ¡Gracias!
FlimFlam Vir
1
¡Esta es la solución más corta y brillante!
sVd
1
@LalKrishna Cree un nuevo archivo llamado UITextViewWorkaround.swift y agregue el código anterior. Luego agregue UITextViewWorkaround.executeWorkaround () esto a didFinishLaunchingWithOptions antes de la declaración de devolución.
ashishn
22

Una solución más rápida:

///Substitute class for _UITextLayoutView bug
class FixedTextView: UITextView {
    required init?(coder: NSCoder) {
        if #available(iOS 13.2, *) {
            super.init(coder: coder)
        }
        else {
            let rect = CGRect(origin: .zero, size: CGSize(width: 100, height: 44*3))
            super.init(frame: rect, textContainer: nil)
        }
    }
}

Agregue este código en algún lugar y luego reemplace todas las instancias del guión gráfico FixedTextView.

Nota: perderá cualquier atributo creado en los guiones gráficos. Esto podría tener serias implicaciones (por ejemplo, configuración de delegado, tamaño, etc.)

garafajon
fuente
Este parece ser un buen paso hacia una solución alternativa, pero aún no es una solución ...
Fattie
18

Solución actualizada: Actualización a Xcode 11.2.1 . Funciona en dispositivos iOS 11, 12 o 13 para mí.

Consulte la documentación de Apple. Esta actualización soluciona un problema crítico que podría causar que las aplicaciones que usan UITextView se bloqueen.

Solución anterior: Xcode 11.1 descargado de https://developer.apple.com/download/more/ Cambiar de 11.2 a 11.1 solucionó el bloqueo.

Además, para mí, incluso con Xcode 11.2, cuando actualicé mi iPhone a 13.2, eso solucionó el bloqueo.

anoo_radha
fuente
2
Esta es la solución más fácil: actualice el iPhone iOS a 13.2
Reefwing el
66
La actualización de iOS claramente no es una solución dado que OP está hablando desde la perspectiva del desarrollador.
keeshux el
2
Apple confirmó que el error ocurre con las versiones de iOS anteriores a 13.2 y Xcode 11.2.
Chuck Krutsinger
XCode degradado a la versión 11.1 (11A1027) - todavía tiene el mismo bloqueo (
rommex
si actualiza o baja y aún se bloquea la carpeta de compilación de Xcode limpia (CMD + Shift + K) según el comentario de Wojteck a continuación, que solucionó esto para mí en la actualización
Mike Volmar
17

11.2.1 Semilla GM resuelve este problema

(y se puede usar para publicar en App Store)

Vaya a https://developer.apple.com/download/ . Descargar Xcode 11.2.1 GM seed

Las notas de la versión confirman que corrige este error:

ingrese la descripción de la imagen aquí

arte
fuente
55
Tenga en cuenta que después de instalar Xcode 11.2.1 GM seed, probablemente debería eliminar la aplicación de su dispositivo de desarrollo y / o limpiar la carpeta de compilación de Xcode (CMD + Shift + K).
Wojtek Dmyszewicz
13

Puede descargar la última versión beta de Xcode (11.2.1 GM) del sitio web para desarrolladores de Apple.

Aquí el enlace directo

Xcode 11.2.1 semillas GM

BossOz
fuente
Tenga en cuenta que después de instalar Xcode 11.2.1 GM seed, probablemente debería eliminar la aplicación de su dispositivo de desarrollo y / o limpiar la carpeta de compilación de Xcode (CMD + Shift + K).
Wojtek Dmyszewicz
instalado y ejecutado sin ningún otro procedimiento. Problema solucionado ✌️
BossOz
¿Cómo instalo esto? Me dio una carpeta, pero no hay ejecutable
Scobee
1
simplemente descargue zip desde el enlace proporcionado y extráigalo. Luego copie la aplicación en la carpeta Aplicación.
BossOz el
1
el problema es que cuando lo extraigo, obtengo dos archivos, Contenido y Metadatos ... por eso pregunté qué hacer con ellos. Utilicé una utilidad de archivo porque hacer clic en ella normalmente fallaba. Lo intentaré de nuevo
Scobee, el
12

Mejora en la respuesta de @garafajon. Para mí funciona en la mayoría de los casos.

///Substitute class for _UITextLayoutView bug
class FixedTextView: UITextView {
    required init?(coder: NSCoder) {
        if #available(iOS 13.2, *) {
            super.init(coder: coder)
        }
        else {
            super.init(frame: .zero, textContainer: nil)
            self.autoresizingMask = [.flexibleWidth, .flexibleHeight]
            self.contentMode = .scaleToFill

            self.isScrollEnabled = false   // causes expanding height

            // Auto Layout
            self.translatesAutoresizingMaskIntoConstraints = false
            self.font = UIFont(name: "HelveticaNeue", size: 18)
        }
    }
}
Awsom3D
fuente
1
Funciona perfectamente. El código de @ garafajon causó problemas con las cajas en lugares inesperados. Esto soluciona esos problemas ~ ¡buen trabajo!
ekrenzin el
8

Como solución "rápida", puede agregarla UITextViewdirectamente desde el código y no a través de IB. Al menos funcionó para mí. Aunque desde mi punto de vista, es mejor retroceder a Xcode anterior / esperar al nuevo.

Pavel Stepanov
fuente
6

Es un error con Xcode 11.2. Las vistas de texto subclasificadas se bloquean en todos los dispositivos que no tienen instalada la nueva compilación de iOS (13.2). Probablemente sea mejor no compilar una versión con esa compilación.

Tu puedes ahora:

  • degradar Xcode a 11.1 o
  • actualice su dispositivo a iOS 13.2
mark.so.cgn
fuente
1
Entonces, ¿este error solo afecta las vistas de texto subclasificadas?
Darren
1
La actualización de iOS al actualizar Xcode resuelve el problema.
Buyin Brian
2
La pregunta es, si el accidente ocurrirá en una aplicación en libertad con cada IOS menor que 13.2 ... Tengo miedo a tratar ...
mark.so.cgn
6

Utilicé una solución exitosa, pero fue dolorosa. Este es el proceso que seguí:

  1. Abra el XIB en un editor de texto.
  2. Encuentra al ofensor TextView. En mi caso:
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="782-j1-88c" customClass="LCAnsiConsoleTextView">
  <rect key="frame" x="16" y="20" width="343" height="589"/>
  <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
  <fontDescription key="fontDescription" name="Menlo-Regular" family="Menlo" pointSize="12"/>
  <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
</textView>
  1. Tenga en cuenta su id(en mi caso: id="782-j1-88c")
  2. Anule la clase como se indica en las respuestas anteriores y vuelva a crear las opciones (la mía es Objective-C, lo siento):
@implementation FixedTextView

- (id) initWithCoder:(NSCoder*)coder
{
    if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){13,2,0}])
        self = [super initWithCoder:coder];
    else {
        self = [super initWithFrame:CGRectMake(16, 3, 343, 605)];
        self.editable = YES;
        self.selectable = YES;
        self.insetsLayoutMarginsFromSafeArea = YES;
        self.clipsToBounds = YES;
        self.clearsContextBeforeDrawing = YES;
        self.autoresizesSubviews = YES;
        self.contentMode = UIViewContentModeScaleToFill;
        self.scrollEnabled = YES;
        self.userInteractionEnabled = YES;
        self.multipleTouchEnabled = YES;
        self.translatesAutoresizingMaskIntoConstraints = NO;
        self.font = [UIFont fontWithName:@"Menlo-Regular" size:12.0];
    }
    return self;
}
  1. Tenga en cuenta las restricciones que incluyen su ID de vista de texto y vuelva a crear esas restricciones contra los otros identificadores de elementos en su vista o controlador de vista. En mi caso:
- (id) initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self xibSetup];
        [self initView];
/*
        <constraint firstItem="75C-lt-YtE" firstAttribute="top" secondItem="782-j1-88c" secondAttribute="bottom" constant="8" symbolic="YES" id="8SH-5l-FAs"/>
        <constraint firstItem="782-j1-88c" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leadingMargin" id="Mve-aZ-HCe"/>
        <constraint firstItem="782-j1-88c" firstAttribute="leading" secondItem="75C-lt-YtE" secondAttribute="leading" id="dPG-u3-cCi"/>
        <constraint firstItem="782-j1-88c" firstAttribute="trailing" secondItem="iN0-l3-epB" secondAttribute="trailingMargin" id="sjT-0Q-hNj"/>
        <constraint firstItem="782-j1-88c" firstAttribute="top" secondItem="vUN-kp-3ea" secondAttribute="top" id="vic-vZ-osR"/>
*/
        [self.command.topAnchor constraintEqualToAnchor:self.console.bottomAnchor constant:8].active = YES;
        [self.console.leadingAnchor constraintEqualToAnchor:self.layoutMarginsGuide.leadingAnchor].active = YES;
        [self.console.leadingAnchor constraintEqualToAnchor:self.command.leadingAnchor].active = YES;
        [self.console.trailingAnchor constraintEqualToAnchor:self.trailingAnchor].active = YES;
        [self.console.topAnchor constraintEqualToAnchor:self.safeAreaLayoutGuide.topAnchor].active = YES;

    }
    return self;
}

Hacer esto solucionó el problema para mí sin pérdida en la funcionalidad deseada. Afortunadamente, solo tenía uno UITextViewpara reemplazar. De lo contrario, esto se vuelve insostenible.

Eric Lange
fuente
2

Tuve el mismo problema: acabo de actualizar mi Xcode 11.2 a 11.2.1, funcionó bien.

Después de la actualización, probé lo mismo en iOs 13 y iOS 12 y estaba funcionando bien.

Mohammad Parvez
fuente
Duplicado de la respuesta BossOz.
Cœur
0

1. Problema:

Hay un problema con Xcode 11.2 en el que Storyboards que contiene un UITextView hará que la aplicación se bloquee en las versiones del sistema operativo anteriores a iOS 13.2 si se compila con Xcode 11.2.

Xcode 11.2

Consulte esta documentación de Apple .

2. Solución:

La única solución es actualizar su Xcode a 11.2.1 u 11.3.

Xcode 11.2.1 se lanzó especialmente para solucionar este problema de bloqueo.

ingrese la descripción de la imagen aquí Consulte esta documentación de Apple.

3. Sugerencia:

Te sugiero que vayas con la última versión de Xcode 11.3 ya que esto admite el desarrollo de aplicaciones para iOS 13.3 y también hay muchas características nuevas. Consulte esta documentación de Apple .

Jayprakash Dubey
fuente
-1

Este problema se solucionó en Xcode versión 11.2.1 y se menciona en las notas de la versión:

Esta actualización soluciona un problema crítico que podría causar que las aplicaciones que usan UITextView se bloqueen

Captura de pantalla de las notas de la versión de Xcode

pkamb
fuente