[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/download/more 에서 다른 모든 Xcode 버전 및 기타 리소스 링크 (릴리스 및 베타 버전 포함)를 찾을 수 있습니다.
해결 방법
이것은 매우 어렵지만 해결 방법입니다. 모든 교체 UITextView
에서의 스토리 보드 의와 XIB 와의를 순수 코드 버전.
참고 이 버그를 발견하고 애플에 의해 고정되어
또한 이전에는 Apple Staff edford 가 버그 를 확인했습니다.
iOS 13.2를 사용하는 사용자는 더 이상 Xcode 11.1을 사용할 수 없습니다.
- macOS를 10.15.1 이상으로 업데이트
- Xcode 11.2.1 이상 설치
- 이제 업데이트 된 장치에서 작동해야합니다.
스토리 보드를 가진 사람들을 위해 :
- 아강
UITextView
- 모든
UITextView
객체에 할당 - 서브 클래 싱에서 손실 될 수있는 속성 변경 사항을 업데이트하는 것을 잊지 마십시오.
방법 스위 즐링 (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 시드 다운로드