Xcode 9 GM - WKWebView 이전 버전에서는 코딩 지원이 중단되었습니다.
Xcode 9 GM으로 이 오류를 해결하는 방법을 아는 사람이 있습니까?저는 Xcode 8.3으로 만든 앱을 개발하고 있으며, 배포 대상은 iOS 9.3이며 이전에는 이런 문제가 없었습니다.아직 여기나 애플 포럼에서 어떤 정보도 찾을 수 없습니다 :(
편집: 이 오류는 프로그래밍 방식으로 사용하는 경우가 아니라 WKWebView를 인터페이스 작성기에 넣었을 때 발생했습니다.
편집 2: 마침내 버그가 아닙니다. 이 동작에 대한 자세한 내용은 아래 Quinn의 답변을 참조하십시오.그의 설명에 감사드립니다.
오류는 Xcode 9의 버그가 아닌 올바른 동작입니다.8에 되었지만, WKWebView, iOS 8에 .-[WKWebView initWithCoder:]
이것은 iOS 11에서만 수정되었으며, 항상 런타임에 충돌하여 인터페이스 빌더 내에서 구성할 수 없었습니다.
https://bugs.webkit.org/show_bug.cgi?id=137160
개발자들이 IB에서 런타임에 손상될 수 있는 무언가를 구축하는 것을 허용하는 것이 아니라, 그것은 빌드 오류입니다.iOS 11이 출시된 지 얼마 되지 않아 불편한 제한 사항이지만, 다른 좋은 옵션은 정말 없습니다.
@fahad-ashraf가 답변에서 이미 설명했듯이 이전 배포 대상에 대한 해결 방법은 코드에 WKWebView를 계속 추가하는 것입니다.
https://developer.apple.com/documentation/webkit/wkwebview
이것은 Xcode 9의 버그로 보이며 베타에도 존재했습니다.스토리보드를 통해 WKWebView를 작성하는 경우에만 빌드 오류가 발생합니다.해당 ViewController 클래스 파일에서 WKWebView를 프로그래밍 방식으로 생성하는 경우 iOS 11 이하의 iOS 버전에서 빌드할 수 있어야 합니다.다음은 Apple의 웹 사이트에서 제공하는 방법입니다.
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {
var webView: WKWebView!
override func loadView() {
super.loadView()
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.uiDelegate = self
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
let myURL = URL(string: "https://www.apple.com")
let myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
}}
그런 다음 일반적인 방법으로 WKWebView 기능을 구현할 수 있어야 합니다.
출처: https://developer.apple.com/documentation/webkit/wkwebview
다른 구성 요소와 함께 사용자 정의를 실현하려면 예를 들어 스토리보드를 통해 "컨테이너"를 만들 수 있습니다.webViewContainer
:
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {
@IBOutlet weak var webViewContainer: UIView!
var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
let webConfiguration = WKWebViewConfiguration()
let customFrame = CGRect.init(origin: CGPoint.zero, size: CGSize.init(width: self.webViewContainer.frame.size.width, height: self.webViewContainer.frame.size.height))
self.webView = WKWebView (frame: customFrame , configuration: webConfiguration)
webView.translatesAutoresizingMaskIntoConstraints = false
self.webViewContainer.addSubview(webView)
webView.topAnchor.constraint(equalTo: webViewContainer.topAnchor).isActive = true
webView.rightAnchor.constraint(equalTo: webViewContainer.rightAnchor).isActive = true
webView.leftAnchor.constraint(equalTo: webViewContainer.leftAnchor).isActive = true
webView.bottomAnchor.constraint(equalTo: webViewContainer.bottomAnchor).isActive = true
webView.heightAnchor.constraint(equalTo: webViewContainer.heightAnchor).isActive = true
webView.uiDelegate = self
let myURL = URL(string: "https://www.apple.com")
let myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
}
이전 대상에서 iOS 11.0으로 이동했는데도 여전히 이 오류가 발생한다면 아래 솔루션을 사용하십시오.
- 스토리보드(메인 스토리보드)로 이동하여 장면을 클릭합니다.
- Xcode의 오른쪽 속성 창인 'File Inspector'를 선택합니다.
- 'Builds for' 값을 'iOS 11.0 이상'으로 변경합니다.
- 컴파일 및 빌드
저도 같은 문제에 직면했지만 WKWebView를 프로그래밍 방식으로 추가하면 문제가 해결될 수 있습니다.
스토리보드에서 만들고 싶은 디자인은 무엇이든 하되, WKwebView를 위해 공간을 남겨두십시오. 해당 영역에서 보기를 드래그 앤 드롭하여 webViewContainer로 이름을 지정하고 이 두 가지 속성을 선언합니다.
@property (weak, nonatomic) IBOutlet UIView *webViewContainer; @property(nonatomic, strong)WKWebView *webView;
이제 다음과 같은 webView를 만들고 추가합니다.
-(instancetype)initWithCoder:(NSCoder *)aDecoder { self.webView = [self createWebView]; self = [super initWithCoder:aDecoder]; return self; }
createWebView 함수는 다음과 같이 선언됩니다.
-(WKWebView *)createWebView { WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; return [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration]; }
이제 새로 생성된 webView를 컨테이너에 추가합니다.View는 다음과 같습니다.
-(void)addWebView:(UIView *)view { [view addSubview:self.webView]; [self.webView setTranslatesAutoresizingMaskIntoConstraints:false]; self.webView.frame = view.frame; }
마지막으로, 당신의 URL을 이렇게 로드하면 됩니다.
-(void)webViewLoadUrl:(NSString *)stringUrl { NSURL *url = [NSURL URLWithString:stringUrl]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [self.webView loadRequest:request]; }
읽어주셔서 감사합니다.
웹킷은 iOS 8에 도입되었지만 런타임 충돌을 야기하는 오류와 함께 릴리스되었습니다. Xcode 9/10을 사용하는 경우 프로젝트 구성이 iOS 11보다 지원되지 않으며 인터페이스 빌더를 사용하여 WKebView를 추가하려고 하는 경우.Xcode는 컴파일 시간 오류를 즉시 표시합니다.
iOS 11.0 이전 버전의 WKWebView(N코딩 지원은 이전 버전에서 중단됨)
WK WebView는 iOS 8에 도입되었지만 -[WK WebView initWithCoder:]에는 iOS 11에서만 수정된 버그가 있었습니다.
문제는 코드를 통해 WKWebView를 추가해야 한다는 것입니다(iOS 11 이하를 지원하는 경우에만 해당).정말 이상하게 들리네요.
또 다른 해결책은 옵션에 대한 인터페이스 작성기 문서 빌드를 iOS 11 이상으로 변경하는 것입니다(이전 대상에서 iOS 11로 마이그레이션하는 경우에도 동일한 오류가 발생하는 경우).
//스위프트용
import WebKit
class ViewController: UIViewController {
var webView: WKWebView!
// MARK:- WebView Configure
override func loadView() {
let webConfig = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfig)
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
// call urlrequest fun
loadURLRequest()
}
//MARK:- Webview URLRequest
func loadURLRequest() {
let urlString = "https://www.google.com"
let url = URL(string: urlString)
let urlRequest = URLRequest(url: url!)
webView.load(urlRequest)
}
}
목표 C의 경우
#import <WebKit/WebKit.h>
@interface ViewController ()<WKNavigationDelegate,WKUIDelegate>{
WKWebView *webView;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSURL *url = [[NSURL alloc] initWithString: @"https://www.google.com"];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL: url];
[webView loadRequest: request];
}
- (void)loadView {
[super loadView];
WKWebViewConfiguration *configu = [[WKWebViewConfiguration alloc] init];
webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configu];
webView.UIDelegate = self;
self.view = webView;
}
@end
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {
@IBOutlet weak var webViewContainer: UIView!
private var webView: WKWebView?
override func viewDidLoad() {
super.viewDidLoad()
addWebView()
let myURL = URL(string: "https://www.apple.com")
if let myURL = myURL {
let myRequest = URLRequest(url: myURL)
webView?.load(myRequest)
}
}
private func addWebView() {
let webConfiguration = WKWebViewConfiguration()
let size = CGSize.init(width: 0.0, height: self.webViewContainer.frame.size.height)
let customFrame = CGRect.init(origin: CGPoint.zero, size: size)
self.webView = WKWebView (frame: customFrame, configuration: webConfiguration)
if let webView = self.webView {
webView.translatesAutoresizingMaskIntoConstraints = false
self.webViewContainer.addSubview(webView)
webView.topAnchor.constraint(equalTo: webViewContainer.topAnchor).isActive = true
webView.rightAnchor.constraint(equalTo: webViewContainer.rightAnchor).isActive = true
webView.leftAnchor.constraint(equalTo: webViewContainer.leftAnchor).isActive = true
webView.bottomAnchor.constraint(equalTo: webViewContainer.bottomAnchor).isActive = true
webView.heightAnchor.constraint(equalTo: webViewContainer.heightAnchor).isActive = true
webView.uiDelegate = self
}
}
}
설정할 수 있습니다.IPHONEOS_DEPLOYMENT_TARGET
>= 11
UI WebView는 iOS11에서 더 이상 사용되지 않으며 WKWebView는 iOS11에서만 작동합니다. 이는 Xcode GM의 버그처럼 들립니다.
언급URL : https://stackoverflow.com/questions/46221577/xcode-9-gm-wkwebview-nscoding-support-was-broken-in-previous-versions
'programing' 카테고리의 다른 글
Twitter 부트스트랩 원격 모달이 매번 동일한 콘텐츠를 표시함 (0) | 2023.05.28 |
---|---|
iOS 7: 상태 표시줄 아래에 UITableView 표시 (0) | 2023.05.28 |
git format-patch로 생성된 패치를 적용하는 방법은 무엇입니까? (0) | 2023.05.28 |
다른 스토리보드에 세그? (0) | 2023.05.28 |
깃 저장소를 특정 커밋으로 롤백하려면 어떻게 해야 합니까? (0) | 2023.05.28 |