Как обнаружить AVplayer и получить URL текущего видео из WKWebView? - PullRequest
7 голосов
/ 27 марта 2019

Я использую приведенный ниже код для извлечения url из UIWebView : он работает нормально, но этот же код, используемый для 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:

https://r2 --- sn-po4g5uxa-5hql.googlevideo.com/videoplayback?txp=5531432&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn% 2Cms% 2Cmv% 2Cpcm2% 2Cpl% 2Cratebypass% 2Crequiressl% 2Csource% 2Cexpire & ф = 103.37.181.55 & ratebypass = да & ID = о-AM9UWIaxopyYZX4gikGuswG8EMi3dhH_PPBMIqY5cbXj & истекают = 1554400796 & с = MWEB & fvip = 4 & initcwndbps = 481250 & ipbits = 0 & мим = видео% 2Fmp4 & дур = 60,093 & LMT = 1554142002789460 & ключ = yt6 & т =1554379078 & ITAG = 18 & источник = YouTube & гир = да & RequireSSL = да и подпись = 6C68366FC249958BB8E95A5D88074FF8BCB99745.DA113E66DD0B46863BAE52DAA3CAB31FD141F0E5 & Clen = 2708520 & мм = 31% 2C29 & Mn = СН-po4g5uxa-5hql% 2Csn-cvh7knek & е = vPGlXPOWHIWD8QOO1KBo & мс = аи% 2Crdu & pcm2 = нет & пл = 24 & мв = м & КПН = I9d32bNmeq3kf0jn & cver = 2,20190403 & ПТК = youtube_none & pltype = contentugc

Это URL видео , а не URL веб-страницы, поэтому, плс легкостью, помогите мне, как получить это.Спасибо.

Ответы [ 5 ]

8 голосов
/ 31 марта 2019

Это что-то вроде хака, но я нашел единственный способ это сделать.

Сначала установите себя в качестве делегата 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-адрес видео нового видимого экрана).

Вы можете сделать это, прослушав UIWindowDidBecomeVisibleNotification уведомление:

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")
            }
        }
    }
2 голосов
/ 04 апреля 2019

Использование Swift

Вы можете получить html-контент из URL веб-сайта, используя код ниже

let docString = webView.stringByEvaluatingJavaScriptFromString("document.documentElement.outerHTML")

В этом случае вы получите весь HTML-контент,

Затем найдите ссылки href внутри строки html

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)
}

Проверьте, если это URL-адрес YouTube, используя

Регулярное выражение: "@https?: // (www.)? Youtube.com/. [^ \ S.," \ '] + @ I "

Еще один способ добиться этого

Думай нестандартно!

Вы можете сделать вызов API, чтобы получить URL. Это кажется довольно простым, используя веб-языки, такие как php, .net и т. Д.

Код для получения всех URL-адресов внутри веб-страницы в PHP (используйте любой язык, который вам подходит)

$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";
    }
}

Чтобы проверить один за другим, если это URL-адрес YouTube.

$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);

Если вы хотите проверить, используют ли образцы приложений тот же метод, найдите прокси-сервер для отладки в Интернете и найдите его

Многие из приведенных выше объяснений взяты с других сайтов.

Надеюсь, это подойдет вам! Удачного кодирования!

2 голосов
/ 03 апреля 2019

извлекает полный URL-адрес из свойства запроса действия навигации в веб-представлении (_: solvePolicyFor: SolutionHandler :) метода WKNavigationDelegate.

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
2 голосов
/ 31 марта 2019

Вы можете попробовать ввести JS в ваш WKWebView, как показано здесь: https://paulofierro.com/blog/2015/10/12/listening-for-video-playback-within-a-wkwebview

1 голос
/ 05 апреля 2019

Попробуйте это в вашем ViewController, чтобы добавить URL-наблюдатель в WKWebView:

override func loadView() {
    let webConfig = WKWebViewConfiguration()
    webView = WKWebView(frame: .zero, configuration: webConfig)
    webView.addObserver(self, forKeyPath: "URL", options: .new, context: nil)
    view = webView
}

Переопределение наблюдающего значения для получения 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 Observer:

deinit { webView.removeObserver(self, forKeyPath: "URL") }
...