Xcode 11.1からXcode 11.2にアップグレードした後、_UITextLayoutViewが原因でアプリがクラッシュする


351

Xcode 11.1からXcode 11.2にアップグレードした後、アプリがクラッシュします。

***キャッチされない例外 'NSInvalidUnarchiveOperationException'によりアプリを終了します、理由: '_UITextLayoutViewという名前のクラスが見つからなかったため、_UITextLayoutViewという名前のクラスをインスタンス化できませんでした。クラスをソースコードで定義するか、ライブラリからリンクする必要があります(クラスが正しいターゲットの一部であることを確認してください) '

なんでこんなことが起こっているの?このクラッシュを防ぐにはどうすればよいですか?


17
Xcode 11.2バグのようです。スレッドforums.developer.apple.com/thread/125287を確認してください。最も可能性が高いのは、階層内のTextViewに関連している
Pavel Stepanov

3
@DanielStorm残念ながら、それは役に立ちませんでした。プレーンUITextViewを1つの画面に追加しましたが、以前はそれがありませんでした(以前にもクラッシュしませんでした:))。今度は同じエラーでクラッシュします。この問題は、最新のiOS 13.2を除くすべてのデバイス/シミュレーター
Pavel Stepanov

3
iOS 13.1.2デバイスで実行しているときに、これがXcode 11.2でビルドされた本番アプリケーションをクラッシュさせるかどうか誰かが知っていますか?
gfpacheco

2
これは完全に良い質問なので、198票なので、なぜ誰かがそれを「保留中の状態が不明」とマークしたのか、本当にわかりません
Mike Volmar

4
@MikeVolmar終了することに投票し、関連性はなくなりました。11.2.1で修正されました。この質問の有用性は非常に短かった。
rmaddy

回答:


145

おめでとう

Xcodeの新しいバージョン(11.2.1)が利用可能になりました。これは、この問題を回避するための最良の方法です。

回避策

@Mojtaba Hosseini私が提案した解決策は、StackOverflowを介した私の側から私の開発者への支援と参加によるものでした。あなた、私、そしてここにいる開発者全員は、新しいバージョンがAppleによって発表されたときに、この問題がなくなることをすでに知っています。

しかし、すべての横に

前述の解決策は、プライベートレビューがまったく含まれていないため、Apple Reviewによって確実に受け入れられました。このアプローチは、次のようなプロパティの作成と非常に似ています。

@interface UITextView(レイアウト)

または

UITextView + Layout.h

したがって、プロパティを作成するときは、APPLEプライベートコンポーネントを直接使用し、必要に応じてそれらを再調整します。

簡単な例はAMFNetworkingクラスです

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

申し立てが完了したと思います

以下の答えは、開発者がXcodeをロールバックすることを最初に提案したときに開発者が開発を継続できるようにするための私の側からのほんの一部の助けでした。XGBの新しいバージョンがまもなくリリースされることは誰もが知っているので、これは8 GB Xcodeを再度ダウンロードするのは悪い習慣でした。

これはXcode 11.2.1で修正されていますが、このクラッシュを回避できるXcode 11.2の解決策が1つあります。

***キャッチされない例外 'NSInvalidUnarchiveOperationException'によりアプリを終了します、理由: '_UITextLayoutViewという名前のクラスが見つからなかったため、_UITextLayoutViewという名前のクラスをインスタンス化できませんでした。クラスをソースコードで定義するか、ライブラリからリンクする必要があります(クラスが正しいターゲットの一部であることを確認してください) '

解決

「DEAD_CODE_STRIPPING」のビルド設定検索に移動し、NOに設定します

DEAD_CODE_STRIPPING = NO

その後

ファイルの作成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

アプリデリゲートで実行する

#import "UITextViewWorkaround.h"

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

            [UITextViewWorkaround executeWorkaround];
    return yes;
    }

コードをコンパイルすると、実行中のアプリができます:)


2
他の人もこの解決策を試すことができるように、あなたのために機能するものが親切にランク付けされている場合
aftab muhammed khan

3
@Hardy_Germanyこれを少しテストしましたが、Swiftの場合は次のことを試すことができます。 )if cls == nil {cls = objc_allocateClassPair(UIView.self、className、0)objc_registerClassPair(cls as!AnyClass)#if DEBUG print( "added%@ dynamic \ n"、className); #endif}}}}
John Nimis

2
あなたはXcodeの11.2とスウィフトパッケージマネージャを使用している場合@DaveDude DEAD_CODE_STRIPPING = NOが必要とされている
・クール

5
@pradipsutariyaはいコース外アップルクラスで何も変更しないでください。
aftab muhammed khan

5
Xcode 11.2.1 GMシード(ベータ版)のみがリリースされています。安定版は間もなくリリースされる可能性があります。
Lal Krishna

221

更新:修正されました!🎉🎊

唯一の解決策は更新することです

このバグはXcode 11.2.1で修正されています。ここからダウンロードして使用できます。

UITextViewを含むストーリーボードは、iOS 13.2、tvOS 13.2、またはmacOS 10.15.2より前のバージョンのオペレーティングシステムでアプリがクラッシュすることはなくなりました。(56808566、56873523)


Xcode 11.2は、2019年11月5日にAppleによって非推奨になりました

Xcode 11.2でビルドしたアプリをAppStoreに送信しようとすると、拒否されます。

App Store Connectオペレーション警告

警告ITMS-90703:「非推奨のXcodeビルド。アプリアーカイブの問題が解決されたため、2019年11月5日にXcode 11.2を非推奨にしました。Xcode11.2.1以降をダウンロードし、アプリを再ビルドして再送信してください。」

Xcode 11.2で行われたすべての回避策は役に立たない


これはXcode 11.2のバグであり、Xcode 11.2.1で修正されています。

ソリューション

以前のXcode リリースバージョンにロールバックする:ロールバックはオプションではなくなり、AppStoreは11.2.1以下のXcodeでのビルドを拒否しますこれを見てください

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

Safariを使用してダウンロードし、最初にApple開発者ポータルにログインする必要があることに注意してください。

他のすべてのXcodeバージョンと他のリソースリンク(リリースバージョンとベータバージョンを含む)は、https: //developer.apple.com/download/moreで見つけることができます

回避策

これは非常に困難ですが、回避策です。ストーリーボードおよびXibのすべてUITextViewのを純粋なコードバージョンに置き換えます。


ことを注意このバグが見つかり、Appleが固定されています。

修繕

また、以前はAppleスタッフのエドフォードによってバグが確認されました

確認


iOS 13.2を使用していて、Xcode 11.1をもう使用できない場合:

  1. macOSを10.15.1以降にアップデートする
  2. Xcode 11.2.1以降をインストールする
  3. 更新されたデバイスで動作するはずです。

ストーリーボードを持っている人のために:

  1. サブクラス UITextView
  2. すべてのUITextViewオブジェクトに割り当てます
  3. サブクラス化で失われる可能性があるプロパティの変更を更新することを忘れないでください。

メソッドのスウィズリングに慣れている方(OBJCと動的動作)

ヘッド@aftabモハメド・カーン のObjective-Cのための答え@MikRo スウィフトのための答えは、バージョンを適応しました

もうやらないでください:

これらの最後の二つのスウィズリングの回避策を使用していない場合でも、アップルのプライベートAPIを、彼らは拒否されますので、AppStoreでAppleが11.2.1の下にXcodeのバージョンとビルドを受け入れることはありません

そしてもう一度:

Xcode 11.2は、2019年11月5日にAppleによって非推奨になりました


3
悲しいですが、解決策は私のために働いています。ありがとう!11.1は機能します。純粋なコードに変換することはお勧めしません。まもなく修正される予定です。よろしければ、動作する新しいバージョンが見つかったら、この回答を更新してください。そこに修正されたバージョンがあるにもかかわらず、人々が11.1イベントのダウンロードを開始するのは悪いことです:)
SebastianWeiß19年

2
11.1をすでに持っていますが、機能しません。11.2にアップグレードしませんでした。
JAHelia

6
開発デバイスからアプリを削除するか、Xcodeのビルドフォルダ(CMD + Shift + K)をクリーンアップする必要があることに注意してください
JeroenJK

3
どうすればv11.2.1にアップグレードできますか?App Storeには表示されません。そして、開発者ポータルからGMシードをダウンロードすると、約8 GBにわたってアプリがダウンロードされます。
mesqueeb

3
また、廃止予定の場合、今のところAppleがアプリストアから11.2を削除しないのはなぜですか?
マルコムサルバドール

40

この問題はXcode 11.2.1で修正されました。

編集:修正がリリースされたので、そのXcodeバージョンに切り替えて、この回避策をコメント化する必要があります。Mojtaba Hosseiniが彼の回答で述べたように:

...最後の2つの回避策はAppleプライベートAPIを使用しており、Appleレビューから拒否されます!

修正がAppleによってリリースされるまでの間、これは開発とテストを継続するための良い回避策でした。


Xcode 11.2の場合、Aftab Muhammed Khanの考えに基づいており、John Nimisの助けを借りて、次のコードをテストしました。

ストーリーボードファイルを変更する必要はありません。

AppDelegate.swiftファイルを編集し、このクラスを追加しました

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

「didFinishLaunchingWithOptions」のデリゲート呼び出し内で回避策を呼び出します

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()
}

34

私はカーンのObj-Cソリューションを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!)
            }
        }
    }

}

終わりにそれを呼び出しdidFinishLaunchingWithOptionsの中でAppDelegate

ありがとう@Aftab!


このコードをどこに追加する必要がありますか?デリゲートファイルで?
SIDHARTH PU

@SIDHARTHPU呼び出し可能didFinishLaunchingWithOptions
Lal Krishna

この問題のさまざまな修正を試みましたが、Xcode 11.3までこれでうまくいきましたか?THX!
FlimFlam Vir

1
これは最も短くて素晴らしいソリューションです!
sVd

1
@LalKrishna UITextViewWorkaround.swiftという名前の新しいファイルを作成し、上記のコードを追加します。次に、UITextViewWorkaround.executeWorkaround()thisを追加して、returnステートメントの前にdidFinishLaunchingWithOptionsに追加します。
ashishn

22

より迅速な修正:

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

このコードをどこかに追加してから、すべてのストーリーボードインスタンスをに置き換えますFixedTextView

注:ストーリーボードで作成された属性はすべて失われます。これは深刻な影響を与える可能性があります(たとえば、デリゲート設定、サイズなど)。


これは回避策への良いステップのようですが、まだ完全な解決策ではありません...
Fattie

18

更新されたソリューション:Xcode 11.2.1に 更新。iOS 11、12、または13デバイスで動作します。

Apple のドキュメントを参照してください。このアップデートでは、UITextViewを使用するアプリがクラッシュする可能性がある重大な問題が修正されています。

古い解決策:https : //developer.apple.com/download/more/からXcode 11.1をダウンロードしました。11.2から11.1に 戻すとクラッシュが修正されました。

また、Xcode 11.2を使用していても、iPhoneを13.2にアップグレードするとクラッシュが修正されました。


2
これが最も簡単な修正です
。iPhoneiOS

6
OPが開発者の観点から話していることを考えると、iOSのアップグレードは明らかに修正ではありません。
keeshux

2
Appleは、バグが13.2およびXcode 11.2より前のiOSバージョンで発生することを確認しました。
チャック・クルツィンガー、

XCodeをバージョン11.1(11A1027)にダウングレード-引き続き同じクラッシュ(
rommex

アップグレードまたはダウングレードしても、以下のWojteckのコメントに従ってクリーンなXcodeのビルドフォルダー(CMD + Shift + K)がクラッシュする場合、アップグレード時にこれが修正されました
Mike Volmar

17

11.2.1 GMシードはこの問題を解決する

(App Storeへの公開に使用できます)

https://developer.apple.com/download/にアクセスます。Xcode 11.2.1 GMシードをダウンロード

リリースノートでは、このエラーが修正されていることを確認しています。

ここに画像の説明を入力してください


5
Xcode 11.2.1 GMシードをインストールした後、開発デバイスからアプリを削除するか、Xcodeのビルドフォルダー(CMD + Shift + K)をクリーンアップする必要があることに注意してください。
Wojtek Dmyszewicz

13

最新のXcodeベータリリース(11.2.1 GM)は、Apple開発者のWebサイトからダウンロードできます。

ここに直接リンク

Xcode 11.2.1 GMシード


Xcode 11.2.1 GMシードをインストールした後、開発デバイスからアプリを削除するか、Xcodeのビルドフォルダー(CMD + Shift + K)をクリーンアップする必要があることに注意してください。
Wojtek Dmyszewicz

他の手順なしでインストールして実行します。問題は✌️固定
BossOz

これをインストールするにはどうすればよいですか?それは私にフォルダーを与えましたが、実行可能ファイルはありません
Scobee

1
提供されているリンクからzipをダウンロードして解凍します。次に、アプリケーションをアプリケーションフォルダーにコピーします。
BossOz

1
問題は、それを抽出すると、コンテンツとメタデータの2つのファイルが取得されることです。アーカイブユーティリティを使用したのは、それをクリックするのが通常は失敗するためです。再試行します
Scobee

12

@garafajonの回答を改善しています。私にとっては、ほとんどの場合に機能します。

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

1
完璧に動作します。@garafajonのコードにより、予期しない場所にあるボックスで問題が発生しました。これでこれらの問題が修正されました〜すばらしい仕事です!
ekrenzin

8

「迅速な」修正として、UITextViewIBを介さずにコードから直接追加できます。少なくともそれは私のために働いた。私の観点からは、以前のXcodeにロールバックするか、新しいXcodeを待つ方が良いです。


6

Xcode 11.2のバグです。サブクラス化されたテキストビューは、最新のiOSビルド(13.2)がインストールされていないすべてのデバイスでクラッシュします。そのビルドでリリースをビルドしない方がよいでしょう。

今はできる:

  • Xcodeを11.1または
  • デバイスをiOS 13.2にアップグレードする

1
それで、このバグはサブクラス化されたテキストビューにのみ影響しますか?
Darren

1
Xcodeの更新時にiOSを更新すると、問題が解決します。
Buyin Brian、

2
問題は、13.2よりも小さいすべてのiOSでリリースされたアプリでクラッシュが発生するかどうかです...私は試してみませんか
mark.so.cgn

6

回避策は成功しましたが、苦痛でした。これは私が従ったプロセスです:

  1. テキストエディターでXIBを開く
  2. 問題のあるものを見つけますTextView。私の場合:
<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. その注意id(私の場合:id="782-j1-88c"
  2. 上記の回答に記載されているようにクラスをオーバーライドし、オプションを再作成します(私はObjective-Cです)。
@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. テキストビューIDを含む制約に注意し、ビューまたはビューコントローラーの他の要素IDに対する制約を再作成します。私の場合:
- (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;
}

これを行うと、問題が解決し、必要な機能が失われることはありませんでした。幸いUITextView、交換するのは1つだけでした。そうでなければ、これは受け入れられなくなります。


2

Xcode 11.2を11.2.1にアップグレードしただけで同じ問題が発生し、問題なく動作しました。

アップグレード後、iOs 13とiOS 12で同じものをテストしましたが、問題なく動作していました。


BossOz回答の複製。
・クール

0

1.問題:

Xcode 11.2に問題があります。UITextViewを含むストーリーボードが原因で、Xcode 11.2でコンパイルした場合、iOS 13.2より前のOSバージョンでアプリがクラッシュします。

Xcode 11.2

このアップルのドキュメントを確認してください。

2.解決策:

唯一の解決策は、Xcodeを11.2.1または11.3に更新することです。

Xcode 11.2.1は、このクラッシュの問題を修正するために特にリリースされました。

ここに画像の説明を入力してください このアップルのドキュメントを確認してください

3.提案:

Xcode 11.3の最新バージョンを使用することをお勧めします。これは、iOS 13.3のアプリの開発をサポートし、多くの新機能もあるためです。このアップルのドキュメントを確認してください。


-1

この問題はXcodeバージョン11.2.1で修正され、リリースノートで呼び出されました。

このアップデートにより、UITextViewを使用するアプリがクラッシュする可能性がある重大な問題が修正されます

Xcodeリリースノートのスクリーンショット

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.