[ios] Xcode 11.1에서 Xcode 11.2로 업그레이드 한 후 _UITextLayoutView로 인해 앱이 충돌 함

Xcode 11.1에서 Xcode 11.2로 업그레이드 한 후 앱이 다운됩니다.

*** catch되지 않은 예외 ‘NSInvalidUnarchiveOperationException’으로 인해 앱을 종료하는 이유 : ‘_UITextLayoutView라는 클래스가 없으므로 _UITextLayoutView라는 클래스를 인스턴스화 할 수 없습니다. 클래스는 소스 코드에서 정의되거나 라이브러리에서 링크되어야합니다 (클래스가 올바른 대상의 일부인지 확인하십시오) ‘

왜 이런 일이 발생합니까? 이 충돌을 어떻게 방지 할 수 있습니까?



답변

축하합니다

이 문제를 해결하는 가장 좋은 방법은 Xcode의 새로운 버전 (11.2.1)입니다.

해결 방법

@ Mojtaba Hosseini 내가 제안한 솔루션은 StackOverflow를 통해 동료 개발자에게 도움과 참여의 도움을 얻은 것입니다. 귀하와 저의 모든 개발자는 이미 Apple에서 새 버전을 발표하면이 문제가 사라질 것임을 이미 알고 있습니다.

그러나 모든 것 옆에

언급 된 솔루션은 Apple API에 전혀 수용되지 않았기 때문에 Apple Review에서 확실히 받아 들였습니다. 이 방법은 다음과 같은 속성 생성과 매우 유사합니다.

@interface UITextView (레이아웃)

또는

UITextView + Layout.h

따라서 속성을 만들 때 APPLE 개인 구성 요소를 직접 사용하고 의존성 또는 요구 사항에 따라 다시 변조합니다.

간단한 예는 AMFNetworking 클래스입니다

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

내가 혐의로 끝났 으면 좋겠다

아래 답변은 개발자가 Xcode를 롤백하도록 처음 제안했을 때 개발자가 계속 개발할 수 있도록 도와주는 도움이었습니다. 8GB Xcode를 다시 다운로드하는 것은 나쁜 습관이었습니다. 새로운 버전의 Xcode가 곧 출시 될 것입니다.

Xcode 11.2.1에서 수정되었지만 Xcode 11.2에 대한 하나의 솔루션이 있어이 충돌을 제거 할 수 있습니다.

*** catch되지 않은 예외 ‘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;
    }

코드를 컴파일하면 실행중인 앱이 있습니다 🙂


답변

업데이트 : 수정되었습니다! 🎉🎊

유일한 해결책은 업데이트하는 것입니다

버그 는 Xcode 11.2.1에서 수정 되었습니다. 그래서 당신은 할 수 있습니다 다운로드하고 여기에서 사용합니다.

UITextView가 포함 된 스토리 보드로 인해 iOS 13.2, tvOS 13.2 또는 macOS 10.15.2 이전의 운영 체제 버전에서 더 이상 앱이 중단되지 않습니다. (56808566, 56873523)


2019 년 11 월 5 일 Apple에서 Xcode 11.2를 사용하지 않음

Xcode 11.2로 빌드 한 앱을 AppStore에 제출하려고하면 거부됩니다.

App Store Connect 작동 경고

경고 ITMS-90703 : “사용되지 않는 Xcode 빌드. 앱 아카이브 문제가 해결되어 2019 년 11 월 5 일에 Xcode 11.2가 사용되지 않습니다. Xcode 11.2.1 이상을 다운로드하고 앱을 다시 빌드 한 후 다시 제출하십시오.”

따라서 Xcode 11.2로 수행 된 모든 해결 방법은 쓸모없습니다.


Xcode 11.2의 버그이며 Xcode 11.2.1에서 수정되었습니다.

해결책

이전 엑스 코드에 롤 다시 릴리스 버전에서 : 롤백은 더 이상 옵션이 아니다 및 11.2.1는 아래의 앱 스토어는 엑스 코드와 어떤 빌드를 거부합니다 이것 좀보세요

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

참고 것을 당신은 그것을 다운로드 사파리를 사용해야하며 먼저해야한다 애플 개발자 포털에 로그인 .

https://developer.apple.com/download/more 에서 다른 모든 Xcode 버전 및 기타 리소스 링크 (릴리스 및 베타 버전 포함)를 찾을 수 있습니다.

해결 방법

이것은 매우 어렵지만 해결 방법입니다. 모든 교체 UITextView에서의 스토리 보드 의와 XIB 와의를 순수 코드 버전.


참고버그를 발견하고 애플에 의해 고정되어

결정된

또한 이전에는 Apple Staff edford버그 를 확인했습니다.

확인


iOS 13.2를 사용하는 사용자는 더 이상 Xcode 11.1을 사용할 수 없습니다.

  1. macOS를 10.15.1 이상으로 업데이트
  2. Xcode 11.2.1 이상 설치
  3. 이제 업데이트 된 장치에서 작동해야합니다.

스토리 보드를 가진 사람들을 위해 :

  1. 아강 UITextView
  2. 모든 UITextView객체에 할당
  3. 서브 클래 싱에서 손실 될 수있는 속성 변경 사항을 업데이트하는 것을 잊지 마십시오.

방법 스위 즐링 (Objc 및 동적 동작)에 익숙한 사용자

받는 사람 머리 @aftab 모하메드 칸 오브젝티브 C에 대한 대답@MikRo의 스위프트에 대한 대답은 버전을 적용

더 이상하지 마십시오 :

마지막 두 스위 즐링의 해결 방법을 사용하지 않는 경우에도 애플 전용 API를 , 그들은 거부됩니다 있기 때문에 앱 스토어에 승인하지 않습니다 애플이 11.2.1에서 엑스 코드 버전 빌드 !

그리고 다시 한번 :

2019 년 11 월 5 일 Apple에서 Xcode 11.2를 사용하지 않음


답변

이 문제는 Xcode 11.2.1에서 해결되었습니다.

편집 : 수정 프로그램이 릴리스되면 해당 Xcode 버전으로 전환 하고이 해결 방법을 주석 처리 해야합니다 . 그의 답변에서 Mojtaba Hosseini가 언급했듯이 :

…이 마지막 두 가지 해결 방법은 Apple 개인 API를 사용하며 Apple 검토에서 거부됩니다!

Apple이 수정 사항을 릴리스 할 때까지는 개발 및 테스트를 계속하는 것이 좋습니다.


Aftab Muhammed Khan의 아이디어와 John Nimis의 도움을 받아 Xcode 11.2의 경우 다음 코드를 테스트했습니다.

스토리 보드 파일을 변경할 필요가 없습니다!

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


답변

칸의 Obj-C 솔루션을 스위프트에 적용했습니다 .

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!


답변

더 빠른 수정 :

///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 .

참고 : 스토리 보드에서 생성 된 모든 속성이 손실됩니다. 이는 심각한 영향을 줄 수 있습니다 (예 : 델리게이트 설정, 크기 등).


답변

업데이트 된 솔루션 : Xcode 11.2.1로
업데이트 . iOS 11, 12 또는 13 장치에서 작동합니다.

사과의 설명서를 참조하십시오
이 업데이트로 해결을 UITextView를 사용하여 응용 프로그램 충돌을 일으킬 수있는 중요한 문제입니다.

기존 솔루션 : https://developer.apple.com/download/more/
에서 Xcode 11.1을 다운로드
했습니다. 11.2에서 11.1로 다시 전환하면 충돌이 해결되었습니다.

또한 Xcode 11.2에서도 iPhone을 13.2로 업그레이드하면 충돌이 해결되었습니다.


답변

11.2.1 GM 시드가이 문제를 해결

(App Store에 게시하는 데 사용할 수 있음)

https://developer.apple.com/download/로 이동 하십시오 . Xcode 11.2.1 GM 시드 다운로드

릴리스 정보 는이 오류가 수정되었음을 확인합니다.

여기에 이미지 설명을 입력하십시오