How to Control WebView
WebView Controlの私が担当している仕事では、グーグルの検索履歴とyoutubeの視聴履歴を消す必要があります. ユーザーはログインする限り、ビューを非表示にし、プログラムに従ってサイトを移動する必要があります. .アプリケーション内のユーザ登録データが消失した場合には、例外処理も行われる. のプログラム的な移動を共有する方法. Where Shoud I Start To Contorl WebView上半期のクラッシュは,ウェブブラウズが完了した後にクラッシュと呼ばれる. 前期のクラッシュでURLを確認し、URLを要求するように移動します. 以上のコードに示すように、GoogleアカウントのページURLであれば です.次の目的地YouTube検索記録ページをアップロードしました. 前回のクラッシュは、URLのロード時に権限を要求したときに呼び出されます. したがって,ここではURLに基づいてdecisionHandlerの値を与え,特定のURLのロードを阻止することができる. この場所はいつもネットで閲覧した場所より早く売れています. は、上述のコードのようにUIのサイズをプログラム的に縮小することができる、または非表示のビュー を縮小することができる.ユーザーはサイトの自動移動の様子を見て、なんだか反感を抱いた. scrapingはサーバ上で行うことが望ましい. アプリケーションで直接scrapingを行うため、scrapingプロセスを非表示にしたり、異常処理をしたり、動作制御をしたりすることは難しい. SWIFTUIとUIKITの2つの場所で行い、隠す過程でSWIFTUIの制限事項はずっと多い. Safariの防御ロジックがあるため、傷もスムーズではありません. たまに AHIGとは反対のものを実現すると、私の生物学的寿命が低下します. ですが安定しているのはUIKETですが、SWIFTUIはAHIGとは逆のものを実現したい場合はバグが発生します.
func webView(_ webView: WKWebView,
didFinish: WKNavigation!) {
}
// Move to search history page if url match with login finish page
if url.absoluteString.contains( GOOGLE_MYACCOUNT_PAGE) {
// Youtube
let myURL = URL(string: YOUTUBE_SEARCH_HISTORY )
let myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
}
func webView(_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
preferences: WKWebpagePreferences,
decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences) -> Void){
return decisionHandler(.allow, preferences)
}
if let url = webView.url {
if url.absoluteString.contains( GOOGLE_MYACCOUNT_PAGE) {
webView.frame(forAlignmentRect: CGRect(x: 0, y: 0, width: 0, height: 0))
webView.isHidden = true
}
}
したがって、import UIKit
import WebKit
class YoutubeScrapingViewController: UIViewController, WKNavigationDelegate {
var youtubeScrapingModel: YoutubeScrapingModel = YoutubeScrapingModel()
fileprivate let GOOGLE_LOGIN_ADDRESS = "https://accounts.google.com/ServiceLogin"
fileprivate let GOOGLE_MYACCOUNT_PAGE = "https://myaccount.google.com/"
fileprivate let GOOGLE_SEARCH_HISTORY = "https://myactivity.google.com/activitycontrols/webandapp?view=item&product=19"
fileprivate let YOUTUBE_SEARCH_HISTORY = "https://myactivity.google.com/activitycontrols/youtube"
fileprivate let GOOGLE_LOGIN_DATA_EXIST = "https://myaccount.google.com/?utm_source=sign_in_no_continue"
var webView: WKWebView!
var loginDetectedAction : () -> Void = {}
override func loadView() {
let preference = WKPreferences()
let webConfiguration = WKWebViewConfiguration()
webConfiguration.preferences = preference
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.navigationDelegate = self
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
let myURL = URL(string: GOOGLE_LOGIN_ADDRESS )
let myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
}
// 권한 요청
func webView(_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
preferences: WKWebpagePreferences,
decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences) -> Void){
print( "권한요청" )
// If login result is success, hide webview when system request auth to access new page.
if let url = webView.url {
if url.absoluteString.contains( GOOGLE_MYACCOUNT_PAGE) {
webView.frame(forAlignmentRect: CGRect(x: 0, y: 0, width: 0, height: 0))
webView.isHidden = true
}
}
return decisionHandler(.allow, preferences)
}
// 수신시작
func webView(_ : WKWebView, didCommit: WKNavigation!){
print("수신 시작")
}
// 탐색이 완료 되었음
func webView(_ webView: WKWebView,
didFinish: WKNavigation!) {
print("탐색이 완료")
print("WebView URL : \(String(describing: webView.url))")
if let url = webView.url {
// Move to search history page if url match with login finish page
if url.absoluteString.contains( GOOGLE_MYACCOUNT_PAGE) {
// Youtube
let myURL = URL(string: YOUTUBE_SEARCH_HISTORY )
let myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
}
//Scarping Youtube history data if url match with search Youtube history page
if url.absoluteString.contains( YOUTUBE_SEARCH_HISTORY ) {
let scrollPoint = CGPoint(x: 0, y: webView.scrollView.contentSize.height * 300)
webView.scrollView.setContentOffset(scrollPoint, animated: false)//Set false if you doesn't want animation
DispatchQueue.main.asyncAfter(deadline: .now() + 4.0) {
// @Escaping 예정
self.youtubeScrapingModel.insertYoutubeKeywordData(url: url)
self.dismiss(animated: false, completion: nil)
}
}
// Login Page
if url.absoluteString.contains( GOOGLE_LOGIN_ADDRESS ) {
print("LOGIN DETECTED ")
loginDetectedAction()
}
// When User have ID
if url.absoluteString.contains( GOOGLE_LOGIN_DATA_EXIST ) {
print("Google Login Data Exist")
}
}
}
// 초기 탐색 프로세스 중에 오류가 발생했음 - Error Handler
func webView(_ webView: WKWebView,
didFailProvisionalNavigation: WKNavigation!,
withError: Error) {
print("초기 탐색 프로세스 중에 오류가 발생했음")
}
// 탐색 중에 오류가 발생했음 - Error Handler
func webView(_ webView: WKWebView,
didFail navigation: WKNavigation!,
withError error: Error) {
print("탐색 중에 오류가 발생했음")
}
}
CounclusionReference
この問題について(How to Control WebView), 我々は、より多くの情報をここで見つけました https://velog.io/@kuruma-42/How-to-Control-WebViewテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol