UIWebViewからURLを抽出するために以下のコードを使用しています:正常に機能していますが、この同じコードでを使用していますWKWebView機能しなくなりました。誰か助けてもらえますか? WKWebViewで再生されるビデオは、フルスクリーンではなくInlineplacybackです。
私のコードは:
NotificationCenter.default.addObserver(self, selector: #selector(self.playerItemBecameCurrent(_:)), name: NSNotification.Name("AVPlayerItemBecameCurrentNotification"), object: nil)
@objc func playerItemBecameCurrent(_ sender : NSNotification){
let playerItem: AVPlayerItem? = sender.object as? AVPlayerItem
if playerItem == nil {
print("player item nil")
return
}
// Break down the AVPlayerItem to get to the path
let asset = playerItem?.asset as? AVURLAsset
let url: URL? = asset?.url
let path = url?.absoluteString
print(path!,"video url")
}
応答URL:
動画URLはWebページのURLではないので、取得方法を教えてください。ありがとう。
これは一種のハックですが、これを達成するために私が見つけた唯一の方法です。
まず、自分をWKWebViewナビゲーションデリゲートとして設定します:
self.webView?.navigationDelegate = self
これで、すべてのナビゲーションの変更をリッスンし、要求されたURLを保存します:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if let urlStr = navigationAction.request.url?.absoluteString {
//Save presented URL
//Full path can be accessed via self.webview.url
}
decisionHandler(.allow)
}
ここで必要になるのは、新しい画面がいつ表示されるようになるかを知り、保存したURLを使用することだけです(新しい表示画面のビデオURLを知るため)。
IWindowDidBecomeVisibleNotification通知を聞くことでこれを行うことができます:
NotificationCenter.default.addObserver(self, selector: #selector(windowDidBecomeVisibleNotification(notif:)), name: NSNotification.Name("UIWindowDidBecomeVisibleNotification"), object: nil)
次に、ナビゲーションウィンドウが自分のウィンドウでないかどうかを確認します。これは、新しい画面が開いたことを意味します。
@objc func windowDidBecomeVisibleNotification(notif: Notification) {
if let isWindow = notif.object as? UIWindow {
if (isWindow !== self.view.window) {
print("New window did open, check what is the currect URL")
}
}
}
wKNavigationDelegateのwebView(_:decidePolicyFor:decisionHandler :)メソッドのナビゲーションアクションのリクエストプロパティから完全なURLを取得します。
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if let urlStr = navigationAction.request.url?.absoluteString {
//urlStr is your URL
}
decisionHandler(.allow)
}
また、プロトコルに準拠することを忘れないでください
webView.navigationDelegate = self
ここに示すように、WKWebView
にJSを挿入することを試みることができます: https://paulofierro.com/blog/2015/10/12/listening-for-video-playback-within-a- wkwebview
以下のコードを使用して、webviewのURLからhtmlコンテンツを取得できます
let docString = webView.stringByEvaluatingJavaScriptFromString("document.documentElement.outerHTML")
この場合、HTMLコンテンツ全体が取得されます。
次に、html文字列内のhrefリンクを探します
let regex = try! NSRegularExpression(pattern: "<a[^>]+href=\"(.*?)\"[^>]*>")
let range = NSMakeRange(0, docString.characters.count)
let matches = regex.matches(in: docString, range: range)
for match in matches {
let htmlLessString = (docString as NSString).substring(with: match.rangeAt(1))
print(htmlLessString)
}
使用してYouTubeのURLかどうかを確認してください
正規表現: "@https?://(www。)?youtube.com/。[^\s。、"\'] + @ i "
ボックスの外側を考えてください!
Apiを呼び出してURLを取得できます。これは、php、.netなどのWeb言語を使用するとかなり簡単に思えます。
PHPでWebページ内のすべてのURLを取得するためのコード(必要な言語を使用してください)
$url="http://wwww.somewhere.com";
$data=file_get_contents($url);
$data = strip_tags($data,"<a>");
$d = preg_split("/<\/a>/",$data);
foreach ( $d as $k=>$u ){
if( strpos($u, "<a href=") !== FALSE ){
$u = preg_replace("/.*<a\s+href=\"/sm","",$u);
$u = preg_replace("/\".*/","",$u);
print $u."\n";
}
}
YoutubeのURLなら一つずつチェックする。
$sText = "Check out my latest video here http://www.youtube.com/?123";
preg_match_all('@https?://(www\.)?youtube.com/.[^\s.,"\']+@i', $sText, $aMatches);
var_dump($aMatches);
サンプルアプリが同じメソッドを使用しているかどうかを確認したい場合は、Webデバッグプロキシを入手して、Digを実行します
上記の説明の多くは他のサイトからのものです。
私はそれがあなたの必要性を要約することを願っています!幸せなコーディング!
これをViewControllerで試して、WKWebViewにURL Observerを追加します。
override func loadView() {
let webConfig = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfig)
webView.addObserver(self, forKeyPath: "URL", options: .new, context: nil)
view = webView
}
ObserveValueをオーバーライドしてURLリクエストを取得します。
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == #keyPath(WKWebView.url) {
let urlRequest:String = webView.url?.absoluteString ?? ""
print(urlRequest)
}
}
最後に...オブザーバーを終了します:
deinit { webView.removeObserver(self, forKeyPath: "URL") }