J'utilise le code ci-dessous pour extraire l'url de UIWebView : cela fonctionne très bien mais, ce même code utilisant pour WKWebView cela ne fonctionne plus. Quelqu'un peut-il m'aider? La vidéo lue dans WKWebView est Inlineplacyback pas en plein écran.
Mon code est:
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 de réponse:
Il s'agit de l'URL de la vidéo et non de l'URL de la page Web, alors aidez-moi à l'obtenir. Merci.
C'est une sorte de piratage, mais le seul moyen que j'ai trouvé pour y parvenir.
Définissez-vous d'abord comme délégué de navigation WKWebView:
self.webView?.navigationDelegate = self
Écoutez maintenant toutes les modifications de navigation et enregistrez l'url demandée:
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)
}
Maintenant, il vous suffit de savoir quand le nouvel écran devient visible et d'utiliser l'URL que vous avez enregistrée (pour connaître l'URL vidéo du nouvel écran visible).
Vous pouvez le faire en écoutant IWindowDidBecomeVisibleNotification notification:
NotificationCenter.default.addObserver(self, selector: #selector(windowDidBecomeVisibleNotification(notif:)), name: NSNotification.Name("UIWindowDidBecomeVisibleNotification"), object: nil)
Vérifiez ensuite si la fenêtre de navigation n'est pas la vôtre, et cela signifie qu'un nouvel écran s'est ouvert:
@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")
}
}
}
récupère l'URL complète dans la propriété request de l'action de navigation dans la méthode WKNavigationDelegate de la vue Web (_: decidePolicyFor: decisionHandler :).
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if let urlStr = navigationAction.request.url?.absoluteString {
//urlStr is your URL
}
decisionHandler(.allow)
}
n'oubliez pas non plus de se conformer au protocole
webView.navigationDelegate = self
Vous pouvez essayer d'injecter JS dans votre WKWebView
comme indiqué ici: https://paulofierro.com/blog/2015/10/12/listening-for-video-playback-within-a- wkwebview
Vous pouvez obtenir le contenu html à partir de l'URL de la vue Web en utilisant le code ci-dessous
let docString = webView.stringByEvaluatingJavaScriptFromString("document.documentElement.outerHTML")
Dans ce cas, vous obtiendrez tout le contenu html,
Recherchez ensuite les liens href à l'intérieur de la chaîne 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)
}
Vérifiez s'il s'agit d'une URL YouTube en utilisant
Expression régulière: "@https?: // (www.)? Youtube.com/. [^\S.,"\'] + @ I "
Sortez des sentiers battus!
Vous pouvez effectuer un appel API pour obtenir l'URL. Cela semble assez facile en utilisant les langages web comme php, .net etc.
Le code pour obtenir toutes les URL dans une page Web en PHP (Utilisez la langue qui vous convient)
$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";
}
}
Pour vérifier un par un s'il s'agit d'une 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);
Si vous vouliez vérifier si les exemples d'applications utilisent la même méthode, obtenez un proxy de débogage Web et creusez dessus
Beaucoup des explications ci-dessus sont tirées d'autres sites.
J'espère que cela résume votre besoin! Bon codage!
Essayez ceci dans votre ViewController, pour ajouter un observateur d'URL sur WKWebView:
override func loadView() {
let webConfig = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfig)
webView.addObserver(self, forKeyPath: "URL", options: .new, context: nil)
view = webView
}
Substitution de la valeur observeValue pour obtenir la demande d'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)
}
}
Enfin ... déinit l'Observateur:
deinit { webView.removeObserver(self, forKeyPath: "URL") }