Após a atualização para o Xcode 11.2 do Xcode 11.1, o aplicativo falha devido a _UITextLayoutView

351

Após a atualização para o Xcode 11.2 do Xcode 11.1, meu aplicativo falha:

*** Finalizando o aplicativo devido à exceção não capturada 'NSInvalidUnarchiveOperationException', motivo: 'Não foi possível instanciar a classe denominada _UITextLayoutView porque nenhuma classe denominada _UITextLayoutView foi encontrada; a classe precisa ser definida no código-fonte ou vinculada a partir de uma biblioteca (verifique se a classe faz parte do destino correto) '

Por que isso está acontecendo? Como posso evitar esta falha?

Sudhakar Tharigoppula
fonte
17
Parece o bug do Xcode 11.2. Verifique o tópico forums.developer.apple.com/thread/125287 . O mais provável é que está relacionado com os TextViews na hierarquia
Pavel Stepanov
3
@DanielStorm infelizmente, isso não ajudou. Acabei de adicionar um UITextView simples a uma tela que não possuía antes (e não travava antes também :)). Agora ele trava com o mesmo erro. Os persiste problema para todos os dispositivos / simuladores, exceto para as últimas iOS 13.2
Pavel Stepanov
3
Alguém sabe se isso travará os aplicativos de produção criados com o Xcode 11.2 ao executar nos dispositivos iOS 13.1.2?
Gfpacheco 04/11/19
2
Este é um perfeitamente boa pergunta, portanto, os 198 votos, por isso estou realmente não tenho certeza por que alguém marcado como "colocado em espera claro"
Mike Volmar
4
@MikeVolmar Votei em fechar e não é mais relevante. É corrigido com 11.2.1. Esta questão teve uma janela muito curta de utilidade.
rmaddy

Respostas:

145

Parabéns

A nova versão do Xcode (11.2.1) está disponível agora, que é a melhor maneira de se livrar desse problema.

Soluções alternativas

@Mojtaba Hosseini, a solução que propus foi a ajuda e a participação do meu lado para meus colegas desenvolvedores no StackOverflow. Você, eu e todo o restante do desenvolvedor aqui já sabemos que, quando a nova versão for anunciada pela Apple, esse problema será eliminado.

Mas ao lado de tudo

A solução mencionada acima foi definitivamente aceita pela Apple Review, pois não há API privada envolvida. Essa abordagem é muito semelhante à propriedade de criação, como

@interface UITextView (Layout)

Ou

UITextView + Layout.h

Portanto, ao criar uma propriedade, você está usando diretamente o APPLE Private Components e re-modulando-a conforme sua necessidade ou necessidade.

O exemplo simples é AMFNetworking classes

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

Espero que eu terminei com a Alegação

A resposta abaixo foi apenas uma ajuda da minha parte para permitir que o desenvolvedor continue desenvolvendo conforme você propôs inicialmente que o desenvolvedor reverta o Xcode. Foi uma prática ruim fazer o download do Xcode de 8 GB novamente, pois todos sabemos que a nova versão do Xcode será lançada em breve.

Enquanto ele está corrigido no Xcode 11.2.1, eu tenho uma solução para o Xcode 11.2 pela qual você pode se livrar dessa falha:

*** Finalizando o aplicativo devido à exceção não capturada 'NSInvalidUnarchiveOperationException', motivo: 'Não foi possível instanciar a classe denominada _UITextLayoutView porque nenhuma classe denominada _UITextLayoutView foi encontrada; a classe precisa ser definida no código-fonte ou vinculada a partir de uma biblioteca (verifique se a classe faz parte do destino correto) '

SOLUÇÃO

Vá para a pesquisa Configuração de compilação para "DEAD_CODE_STRIPPING" e defina-o como NO

DEAD_CODE_STRIPPING = NO

Então

criar arquivos 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

execute-o no delegado do aplicativo

#import "UITextViewWorkaround.h"

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

            [UITextViewWorkaround executeWorkaround];
    return yes;
    }

Compile o código e você terá um aplicativo em execução :)

aftab muhammed khan
fonte
2
Se o seu trabalho para você classificação gentilmente para que outro pode tentar esta solução bem
aftab Muhammed Khan
3
@Hardy_Germany Eu testei isso um pouco, para Swift você pode tentar: class UITextViewWorkaround: NSObject {class func executeWorkaround () {se # disponível (iOS 13.2, *) {} else {deixe className = "_UITextLayoutView" var cls = objc_getClass (className ) se cls == nil {cls = objc_allocateClassPair (UIView.self, className, 0) objc_registerClassPair (cls como! AnyClass) #if DEBUG print ("%% dinamicamente \ n", className); #endif}}}}
John Nimis
2
@DaveDude DEAD_CODE_STRIPPING = NÃO é necessário se você usar o Swift Package Manager com o Xcode 11.2
Cœur
5
@pradipsutariya sim fora do curso, porque nunca mudamos nada nas APPLE CLASSES.
aftab Muhammed Khan
5
Apenas o Xcode 11.2.1 GM seed (beta) é lançado. Versão estável pode ser lançada em breve.
Lal Krishna
221

Atualização: corrigida! 🎉🎊

A única solução é atualizar

Este bug foi corrigido no Xcode 11.2.1. Então você pode baixar e usá-lo aqui.

Os storyboards que contêm um UITextView não causam mais o travamento do aplicativo nas versões do sistema operacional anteriores ao iOS 13.2, tvOS 13.2 ou macOS 10.15.2. (56808566, 56873523)


O Xcode 11.2 foi descontinuado pela Apple em 5 de novembro de 2019

se você tentar enviar seu aplicativo criado com o Xcode 11.2 para a AppStore, será rejeitado:

Aviso de operação de conexão da App Store

AVISO ITMS-90703 : "Construção obsoleta do Xcode. Devido a problemas resolvidos nos arquivos do aplicativo, descontinuamos o Xcode 11.2 em 5 de novembro de 2019. Faça o download do Xcode 11.2.1 ou mais recente, reconstrua seu aplicativo e reenvie."

Portanto, todas as soluções alternativas feitas com o Xcode 11.2 são inúteis


É um bug do Xcode 11.2 e corrigido no Xcode 11.2.1.

Solução (s)

Reverter para Xcode anterior liberação versão de: Reversão não é mais uma opção e AppStore irá rejeitar qualquer construção com o Xcode abaixo 11.2.1 dar uma olhada neste

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

Observe que você deve usar o Safari para fazer o download e primeiro fazer login no portal de desenvolvedores da Apple .

Você pode encontrar todas as outras versões do Xcode e o link de outros recursos (incluindo as versões beta e de lançamento) aqui em https://developer.apple.com/download/more

A solução alternativa

Isso é muito difícil, mas funciona como solução alternativa. Substitua todas as UITextViews em storyboard s e Xib s com o código puro versão.


Observe que esse bug foi encontrado e corrigido pela Apple

Fixo

Ainda mais cedo, o bug foi confirmado pela Apple Staff edford

Confirmação


Para aqueles com iOS 13.2 e não podem mais usar o Xcode 11.1:

  1. Atualize o macOS para 10.15.1 ou posterior
  2. Instale o Xcode 11.2.1 ou posterior
  3. Agora deve funcionar no dispositivo atualizado.

Para aqueles com storyboard:

  1. Subclasse UITextView
  2. Atribua a todos os UITextViewobjetos
  3. Não se esqueça de atualizar quaisquer alterações de propriedade que possam perder na subclasse.

Para quem se sente à vontade com o método swizzling (Objc e comportamento dinâmico)

Vá para a resposta @aftab muhammed khan da Objective-C e a resposta @MikRo da versão adaptada do Swift

Só não faça mais:

Mesmo que essas duas últimas soluções alternativas não utilizem a API privada da Apple , elas serão rejeitadas na AppStore porque a Apple não aceitará builds com versões do Xcode em 11.2.1 !

E mais uma vez:

O Xcode 11.2 foi descontinuado pela Apple em 5 de novembro de 2019

Mojtaba Hosseini
fonte
3
Triste, mas a solução está funcionando para mim. Obrigado! 11.1 funciona. Eu não sugeriria a conversão para código puro, porque aposto que haverá uma correção em breve. Se você não se importa: atualize esta resposta quando houver uma nova versão que funcione. Seria ruim se as pessoas começar a baixar 11,1 evento embora haja uma versão fixa lá fora :)
Sebastian Weiß
2
Eu já tenho 11.1, mas não funcionou, não atualizei para 11.2.
precisa saber é
6
Por favor, note que você provavelmente deve excluir a aplicação do dispositivo de desenvolvimento e / limpo pasta de compilação ou de Xcode ( CMD + Shift + K)
JeroenJK
3
Como posso atualizar para a v11.2.1? Não está aparecendo na loja de aplicativos. E o download da semente GM do portal do desenvolvedor tenta baixar o aplicativo por cerca de 8 GB!
7339 mesveeb
3
Além disso, se estiver obsoleto, por que a Apple não remove a 11.2 na App Store por enquanto?
Malcolm Salvador
40

O problema foi corrigido no Xcode 11.2.1.

EDIT: Como a correção foi lançada agora, você deve mudar para essa versão do Xcode e comentar esta solução alternativa. Como Mojtaba Hosseini em sua resposta mencionou:

... essas duas últimas soluções alternativas estão usando a API privada da Apple e serão rejeitadas da revisão da Apple!

Até o momento em que a correção foi lançada pela Apple, essa foi uma boa solução para continuar desenvolvendo e testando.


Para o Xcode 11.2, com base na idéia de Aftab Muhammed Khan e com a ajuda de John Nimis, testei o código a seguir.

Não é necessária nenhuma alteração nos arquivos do storyboard!

Editou meu arquivo AppDelegate.swift e adicionou esta classe

//******************************************************************
// 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
           }
        }
    }
}

e, na chamada de delegado para "didFinishLaunchingWithOptions", chame a solução alternativa

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_Germany
fonte
34

Adaptei a solução Obj-C de khan ao 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!)
            }
        }
    }

}

Chamá-lo no final do didFinishLaunchingWithOptionsno AppDelegate.

Obrigado @Aftab!

MikRo
fonte
onde precisamos adicionar esse código? Nos arquivos delegados?
SIDHARTH PU 5/11/19
@SIDHARTHPU você pode chamá-lo emdidFinishLaunchingWithOptions
Lal Krishna
tentei uma variedade de correções sobre esse problema e este fez o truque até o Xcode 11.3 ?! Valeu!
FlimFlam Vir 5/11/19
11
Esta é a solução mais curta e brilhante!
SVd 5/11
11
@LalKrishna Crie um novo arquivo chamado UITextViewWorkaround.swift e adicione o código acima. Em seguida, adicione UITextViewWorkaround.executeWorkaround () a didFinishLaunchingWithOptions antes da declaração de retorno.
ashishn
22

Uma correção mais 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)
        }
    }
}

Adicione esse código em algum lugar e substitua todas as instâncias do storyboard para FixedTextView .

Nota: você perderá todos os atributos criados nos storyboards. Isso pode ter sérias implicações (por exemplo, configuração do delegado, tamanho, etc.)

garafajon
fonte
Este parece ser um bom passo em direção a uma solução, mas não é bem uma solução ainda ...
Fattie
18

Solução atualizada : atualização para o Xcode 11.2.1 . Funciona em dispositivos iOS 11, 12 ou 13 para mim.

Consulte a documentação da apple Esta atualização corrige um problema crítico que poderia causar falhas nos aplicativos usando o UITextView.

Solução antiga: O Xcode 11.1 baixado de https://developer.apple.com/download/more/ A mudança de 11.2 para 11.1 corrigiu a falha.

Além disso, para mim, mesmo com o Xcode 11.2, quando atualizei meu iPhone para 13.2, isso corrigiu a falha.

anoo_radha
fonte
2
Essa é a solução mais fácil - atualize o iPhone iOS para 13.2
Reefwing
6
A atualização do iOS claramente não é uma correção, já que o OP está falando sob a perspectiva do desenvolvedor.
keeshux
2
A Apple confirmou que o bug ocorre nas versões do iOS anteriores a 13.2 e no Xcode 11.2.
Chuck Krutsinger 03/11/19
XCode rebaixado para a versão 11.1 (11A1027) - ainda tem a mesma falha (
rommex 5/11/19
se você atualizar ou desatualização e ainda trava limpo pasta build do Xcode (CMD + Shift + K) por comentário do Wojteck abaixo, que fixa isto para mim na atualização
Mike Volmar
17

11.2.1 A semente GM resolve esse problema

(e pode ser usado para publicar na App Store)

Vá para https://developer.apple.com/download/ . Faça o download da semente GM do Xcode 11.2.1

As notas de versão confirmam que corrige este erro:

insira a descrição da imagem aqui

construir
fonte
5
Observe que após a instalação do Xcode 11.2.1 GM seed, você provavelmente deve excluir o aplicativo do seu dispositivo de desenvolvimento e / ou limpar a pasta de compilação do Xcode (CMD + Shift + K).
Wojtek Dmyszewicz 06/11/19
13

Você pode baixar a última versão beta do Xcode (11.2.1 GM) no site do desenvolvedor da Apple.

Aqui o link direto

Xcode 11.2.1 semente GM

BossOz
fonte
Observe que após a instalação do Xcode 11.2.1 GM seed, você provavelmente deve excluir o aplicativo do seu dispositivo de desenvolvimento e / ou limpar a pasta de compilação do Xcode (CMD + Shift + K).
Wojtek Dmyszewicz 06/11/19
instalado e executado sem nenhum outro procedimento. Problema corrigido ✌️
BossOz 6/11/19
como faço para instalar isso? Ele me deu uma pasta, mas não há nenhum executável
Scobee
11
basta baixar o zip do link fornecido e extraí-lo. Em seguida, copie o aplicativo na pasta Aplicativo.
BossOz 07/11/19
11
o problema é que, ao extraí-lo, recebo dois arquivos, Conteúdo e Metadados ... foi por isso que perguntei o que fazer com eles. Eu usei um utilitário de arquivamento porque clicar nele normalmente estava falhando. Vou tentar novamente
Scobee
12

Melhorando na resposta @garafajon. Para mim, funciona na maioria dos 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
fonte
11
Funciona perfeitamente. O código do @ garafajon causou problemas com caixas em locais inesperados. Isso corrige essas questões ~ ótimo trabalho!
precisa saber é o seguinte
8

Como uma correção "rápida", você pode adicionar UITextViewdiretamente do código e não via IB. Pelo menos funcionou pra mim. Embora, do meu ponto de vista, seja melhor reverter para o Xcode anterior / aguardar o novo.

Pavel Stepanov
fonte
6

É um erro do Xcode 11.2. As visualizações de texto subclassificadas estão travando em todos os dispositivos que não possuem a nova versão iOS build (13.2) instalada. Você provavelmente não deve criar uma versão com essa versão.

Agora você pode:

  • faça o downgrade do Xcode para 11.1 ou
  • atualize seu dispositivo para iOS 13.2
mark.so.cgn
fonte
11
Então, esse bug afeta apenas as exibições de texto em subclasse?
Darren
11
A atualização do iOS ao atualizar o Xcode resolve o problema.
Página Inicial>
2
A questão é, se o acidente vai acontecer em um aplicativo lançado com cada iOS menor do que 13,2 ... Eu tenho medo de tentar ...
mark.so.cgn
6

Usei uma solução alternativa bem-sucedida, mas foi dolorosa. Este é o processo que eu segui:

  1. Abra o XIB em um editor de texto
  2. Encontre o ofensor TextView. No meu 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. Observe o seu id(no meu caso:id="782-j1-88c" :)
  2. Substitua a classe conforme indicado nas respostas acima e recrie as opções (a minha é Objective-C, desculpe):
@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. Observe as restrições que incluem seu ID de exibição de texto e recrie essas restrições com os outros IDs de elemento em seu modo de exibição ou controlador de exibição. No meu 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;
}

Isso resolveu o problema para mim, sem perda da funcionalidade desejada. Felizmente eu tinha apenas um UITextViewpara substituir. Caso contrário, isso fica insustentável.

Eric Lange
fonte
2

Eu tive o mesmo problema, acabei de atualizar meu Xcode 11.2 para 11.2.1, funcionou bem.

Após a atualização, testei o mesmo no iOs 13 e no iOS 12 e estava funcionando bem.

Mohammad Parvez
fonte
Resposta duplicada da BossOz.
Cœur
0

1. Problema:

Há um problema no Xcode 11.2, em que os Storyboards contendo um UITextView causam uma falha do aplicativo nas versões do sistema operacional anteriores ao iOS 13.2, se compiladas com o Xcode 11.2.

Xcode 11.2

Verifique esta documentação da apple .

2. Solução:

A única solução é atualizar o seu Xcode para 11.2.1 ou 11.3.

O Xcode 11.2.1 foi lançado especialmente para corrigir esse problema de falha.

insira a descrição da imagem aqui Verifique esta documentação da apple.

3. Sugestão:

Eu sugiro que você use a versão mais recente do Xcode 11.3, pois ele suporta o desenvolvimento de aplicativos para iOS 13.3 e também há muitos novos recursos. Verifique esta documentação da apple .

Jayprakash Dubey
fonte
-1

Esse problema foi corrigido no Xcode versão 11.2.1 e destacado nas notas de versão:

Esta atualização corrige um problema crítico que poderia causar falhas nos aplicativos usando o UITextView

Captura de tela das notas de versão do Xcode

pkamb
fonte