NSURLProtocol은 기본적으로 URL 로딩 시스템을 통과하는 모든 요청을 가로채기 때문에 WKWebView의 요청이 URL 로딩 시스템을 통과하는 한 가로챌 수 있습니다. 시도한 결과 WKWebView가 애플리케이션 프로세스와 독립적으로 실행되고 있으며 기본적으로 발행된 요청은 URL 로딩 시스템을 통과하지 않으므로 지원을 연결해야 한다는 사실을 발견했습니다. 구체적인 방법은 NSURLProtocol의 WKWebView 처리를 참조하세요.
NSURLProtocol은 각 URL 로딩 시스템에서 보낸 요청을 가로채고 모니터링할 수 있지만, NSURLProtocol이 가로채고 모니터링할 수 있는 것은 AFNetwoking 및 UIWebView에서도 지원하는 URL 로딩 시스템의 해당 클래스에서 보낸 요청이라는 점을 기억하세요.
WKWebView는 별도의 프로세스에서 네트워크 요청을 수행하기 때문입니다. http(들) 스키마가 등록되면 네트워크 요청이 네트워크 프로세스에서 앱 프로세스로 전송되어 NSURLProtocol이 네트워크 요청을 가로챌 수 있습니다.
그러나 프로세스 간 통신에 MessageQueue를 사용하는 WebKit2의 설계에서는 네트워크 프로세스가 요청을 메시지로 인코딩하여 IPC(프로세스 간 통신)를 통해 App 프로세스로 보냅니다. 성능상의 이유로 인코딩 중에 두 개의 필드 HTTPBody 및 HTTPBodyStream이 버려집니다(피트)
따라서 RegisterSchemeForCustomProtocol을 통해 http(s) 스키마를 등록하면 WKWebView에서 시작된 모든 http(s) 요청이 처리를 위해 IPC를 통해 주 프로세스 NSURLProtocol로 전송되어 포스트 요청 본문이 지워집니다.
설명 1 : Dan Zhang은 비공개 API를 사용하여 AppStore 감사를 통과 할 수 없습니다. 구체적인 방법(희미한 새벽)을 이해할 수 있을 것 같습니다.
주2:ATS 스위치가 켜져 있고 임의 로드 허용 옵션이 아니요로 설정되면 Comprotocol의 등록자 체계를 통해 http(들) 체계가 등록되고, WKWebView에서 시작된 모든 http(들) 웹 요청이 차단됩니다(웹 콘텐츠의 임의 로드 허용 옵션이 예로 설정된 경우에도);;
주3. IOS 11 이후에는 위의 문제를 해결하기 위해 비공개 API를 호출하지 않고 WKURLSchemeHandler로 요청 차단을 수행할 수 있습니다.
WKURLSchemeHandler는 iOS 11에서 사용자 정의 요청을 처리하기 위해 도입되었지만 Http 및 Https와 같은 일반 스킴은 처리하지 않습니다.
사용자 지정 요청의 데이터 관리는 WKURLSchemeHandler가 담당합니다. http 또는 https 요청 스키마로 데이터 관리를 지원해야 하는 경우 WKWebView의 handlesURLScheme: 메서드를 후크하고 No...를 반환해야 합니다.
조사의 결론은 다음과 같습니다: WKURLSchemeHandler는 격리, 안정성 및 일관성 측면에서 NSURLProtocol보다 낫지만 프로덕션 환경에서 사용하려면 본문 삭제 문제를 해결해야 합니다.
요약:
NSURLProtocol
단점:WKWebView 트래픽에는 비공개 메서드가 필요합니다. 키워드를 난독화 및 마스킹할 수 있지만 향후 버전 업그레이드가 계속 적용된다는 보장은 없습니다.
WKURLSchemeHandler
단점: WKWebView 인스턴스에 대해 설정해야 하며, 조각화된 WKWebView 인스턴스 시나리오는 적용되지 않습니다.
기사 인용: