web-dev-qa-db-ja.com

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

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

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

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

349

おめでとう

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

回避策

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

ただしすべての横

前述の解決策は、Appleによって完全に受け入れられました。プライベートAPIはまったく含まれていないため、レビューを行ってください。このアプローチは、

@interface UITextView(レイアウト)

または

UITextView + Layout.h

したがって、プロパティを作成するときは、Apple Private Componentsを直接使用し、依存または要件に応じてそれらを再変調します。

簡単な例はAMFNetworkingクラスです

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

申し立てはこれで終わりです

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

Xcode 11.2.1では修正されていますが、このクラッシュを取り除くためのXcode 11.2の解決策が1つありました。

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

[〜#〜] solution [〜#〜]

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

DEAD_CODE_STRIPPING = NO

その後

ファイルを作成するUITextViewWorkaround

ITextViewWorkaround.h

    #import <Foundation/Foundation.h>


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

ITextViewWorkaround.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;
    }

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

145

更新:修正されました! ????????

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

この バグ は、Xcode 11.2.1では fixed です。 ここからダウンロードして使用できます。

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接続操作の警告

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

したがって、Xcode 11.2で行われたすべての回避策はuselessです


これはXcode 11.2のバグで、Xcode 11.2.1で修正されました。

解決策

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

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

Safariを使用してダウンロードする必要があり、最初に ログインApple開発者ポータル

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

回避策

これは非常に難しいですが、回避策です。 storyboardsおよびXibsのすべてのUITextViewsを置き換えますpure codeバージョン.


注意してくださいこれ バグはAppleによって発見され修正されています

Fixed

また、以前に バグApple Staffedford によって確認されました

Confirmation


IOS 13.2でXcode 11.1を使用できなくなった場合:

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

ストーリーボードをお持ちの場合:

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

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

@ aftab muhammed khanObjective-Cの回答 および@ MikRoSwift適応バージョン の答え

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

これらの最後の2つのスウィズル回避策がAppleプライベートAPIを使用していない場合でも、は拒否されますAppStoreでは Appleは11.2.1 !未満のXcodeバージョンでのビルドを受け付けないため

そしてもう一度:

Xcode 11.2は、2019年11月5日にApple

221

この問題は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()
}
40
Hardy_Germany

Khanの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!)
            }
        }
    }

}

didFinishLaunchingWithOptionsAppDelegateの最後で呼び出します。

ありがとう@Aftab!

34
MikRo

より迅速な修正:

///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に置き換えます。

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

22
garafajon

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

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

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

また、Xcode 11.2でも、iPhoneを13.2にアップグレードしたときにクラッシュが修正されました。

18
anoo_radha

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

(そして、App Storeに公開するために使用できます)

https://developer.Apple.com/download/ に移動します。 Xcode 11.2.1をダウンロードGM seed

リリースノート このエラーを修正することを確認します。

enter image description here

17
craft

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

ここに直接リンク

Xcode 11.2.1 GM seed

13
BossOz

@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)
        }
    }
}
12
Awsom3D

「クイック」フィックスとして、IB経由ではなくコードから直接UITextViewを追加できます。少なくとも私にはうまくいきました。私の観点からは、以前のXcodeにロールバックするか、新しいXcodeを待つ方が良いでしょう。

8
Pavel Stepanov

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

いまなら可能です:

  • xcodeを11.1にダウングレードするか、
  • デバイスをiOS 13.2にアップグレードする
6
mark.so.cgn

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

  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つしか交換できませんでした。そうでなければ、これは受け入れられません。

6
Eric Lange

Xcode 11.2を11.2.1にアップグレードしたときと同じ問題があり、うまく機能しました。

アップグレード後、iOs 13とiOS 12で同じテストを行い、正常に動作しました。

2
Mohammad Parvez

1。問題:

Xcode 11.2には、Xcode 11.2でコンパイルされた場合、UITextViewを含むストーリーボードがiOS 13.2より前のOSバージョンでクラッシュするという問題があります。

Xcode 11.2

これを確認してください Appleドキュメント

2。解決策:

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

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

enter image description here これを確認してください Appleのドキュメント

3。提案:

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

0