이 방법으로 설정이 이미 비활성화 된 것을 볼 수 있습니다. . 콜백에서 인쇄 :
이 시점에서 얻은 정보 필드가 nil이고 오류 메시지는 다음과 같습니다 :
개인적 추측 : 이것은 WKWebView의 평가 자바 스크립트 메서드가 비동기 적으로 실행되기 때문입니다.WKWebView가이 메서드를 다시 호출 할 때 이미 인스턴스 개체가 메모리에서 해제되어 콜백 오류가 발생했습니다. .
다음과 같이 유효성 검사를 수행하고 콜백 메서드에서 webView 인스턴스 객체를 출력해 보았습니다.
출력된 값은 오류가 없는 정보이고 값이 있는 WebView는 다시 정상임을 알 수 있습니다. 어떤 사람들은 이것이 문제가 되지 않는 것처럼 말합니다! 정말 그럴까요? 생각해 보세요. 웹뷰의 메서드 콜백 클로저에서 웹뷰 인스턴스를 사용하면 어떻게 될까요? 네, 순환 참조가 발생합니다! 이 시점에서 webView 인스턴스는 0이 아니므로 웹뷰 인스턴스가 정상이라면 결과가 잘못되지 않는다는 것을 확인합니다! 위의 유효성 검사를 계속하기 위해 약하게 참조합니다.
이 시점에서 정보와 webView가 모두 nil이고 오류 값은 위의 오류입니다!!!!.
이렇게 기본 유효성 검사에서 문제가 발생한 이유는 :webView가 일찍 릴리스되었기 때문인 것 같습니다!
그러나 이 설정을 추가하기 위해 웹뷰를 전역 변수로 설정하는 것은 효과가 없는 것 같습니다. 이 시점에서 웹뷰를 사용하여 페이지에서 설정하거나 대신 UIWebView를 사용할 수 있습니다.
JS가 네이티브와 상호작용할 때 다음 방법으로 주입된 프로토콜은 유효하지 않습니다.
그런 다음 js 측에서 사용할 때:여기에 매개 변수 전달 없이 그냥 쓰기만 하면 됩니다.
이것이 끝입니다, js 이벤트에 대한 응답 없음!!!!
프록시 메서드에서:
콜백을 받지 못함!!!!
실제로 주입 방식이 실패하는 것이 아니라 잘 작동하고 있습니다. 문제는 postMessage의 매개 변수에 있습니다. 매개 변수가 있는 경우 다음과 같이 작성해도 문제가 없으므로 매개 변수를 전달할 필요가 없는 경우 다음과 같이 작성할 수 있습니다.
빈 사전을 제공하면 정상적으로 상호 작용할 수 있습니다!!!!
WKWebView에서 로드한 HTML 페이지에서 길게 누르면 선택 상자가 나타나고 텍스트를 길게 누르면 UIMenuController 선택 상자가 나타납니다.
이미지를 길게 누르면 힌트 페이지가 나타납니다.
이미지를 시스템 앨범에 저장하거나(액세스할 수 있는 경우) 클립보드에 복사할 수 있습니다. 하지만 이러한 요청은 우리에게 필요한 것이 아닙니다. 이러한 동작을 비활성화하려면 어떻게 해야 할까요? 다음 두 개의 JS 문장을 실행하면 됩니다.
인젝션할 수 있습니다.
페이지가 로드된 후 프록시 방식으로 실행할 수도 있습니다.
로드된 HTML 페이지에 아무 이유 없이 광고 플로팅 박스가 나타납니다.
열리면 다음과 같이 보입니다.
모바일 4G에서만 나타납니다. 네트워크에서만 나타납니다. 사실 이것은 모바일 트래픽 하이재킹, 강제 광고 및 프로모션입니다. 현재 온라인에는 몇 가지 솔루션이 있으며 일반적으로 :
기타이 문서, iOS 클라이언트를 참조하여 운영자 하이재킹 작은 대책을 처리하십시오.
.
프론트엔드 디버깅 시 페이지 레이아웃, 디스플레이 요소, js 메서드 등 몇 가지를 변경했지만 앱이 응답하지 않았습니다!!!!
이것은 WKWebView에 캐시가 있기 때문입니다. 매번 최신 페이지가 로드되도록 하려면 로드된 링크 뒤에 타임스탬프를 추가하면 됩니다. 예를 들어 HTML 주소는 다음과 같습니다.
일반적인 사용법은 다음과 같습니다.
이 경우 캐시가 있습니다. 한 번 로드한 후에는 최신 페이지가 아닙니다. 다음과 같이 사용할 수 있습니다:
이 방식은 로드될 때마다 최신 페이지가 됩니다. 물론 단점은 매번 추가 트래픽을 소비한다는 것입니다.
페이지를 탐색하지 않을 경우 시스템은 스크롤 보기의 콘텐츠 설정을 자동으로 조정하여 보기가 항상 상태 표시줄 아래에 있도록 합니다. 그러나 스크롤 뷰의 Y 좌표를 화면 상단(상태 표시줄)에서 시작하도록 하려면 변경하는 방법을 모두 알고 있지만 WKWebView는 UIScrollView에서 상속되지 않으므로 직접 설정할 수 없습니다. 다음과 같이 작성할 수 있습니다.
이 플래시백은 JS와 상호 작용하고 다음을 사용하여 프로토콜을 등록할 때 발생합니다.
같은 이름의 프로토콜을 반복적으로 등록하면 플래시백이 발생하므로 웹뷰 사용이 끝나면 등록된 프로토콜을 삭제해야 합니다.
WKWebView는 앱 홈 페이지의 콘텐츠를 로드하는 데 사용됩니다. 시작 시 부팅 페이지/광고 페이지가 추가되면 광고 페이지가 나타날 때 화면을 탭하는 등의 제스처 동작이 있으면 플래시백되어 콘솔에 출력됨:
글로벌 중단점을 추가하고 디버깅한 결과 다음과 같은 크래시 메시지를 확인했으며, 구체적인 이유는 찾지 못했지만 광고 페이지의 정보를 초기화하는 +load 메서드와 관련이 있음을 알게 되었습니다. 정보를 초기화하는 메서드와 관련이 있다는 것을 알게 되었습니다. didFinishLaunchingWithOptions에서 초기화하면 이 문제가 발생하지 않습니다.
해결 방법: 광고/가이드 페이지 뷰의 초기화를 didFinishLaunchingWithOptions 메서드에 넣습니다.