#macos #iframe #webview
#macos #iframe #webview
Вопрос:
У меня есть iframe проигрывателя youtube в моем приложении webview macos, и большинство ссылок ( <a>
элементов) внутри iframe не запускают decidePolicyForNewWindowAction
делегат.
Единственным рабочим <a>
элементом является ссылка на канал, другие, такие как заголовок видео, значок youtube, все молчат, и я не могу определить различия между ними <a>
.
Итак, почему некоторые ссылки не могут запускаться decidePolicyForNewWindowAction
?
Документация делегата: https://developer.apple.com/documentation/webkit/webpolicydelegate/1536381-webview ?язык = objc
Документация проигрывателя iframe youtube: https://developers.google.com/youtube/iframe_api_reference
Ответ №1:
Для кого-то, может быть, интересно:
Оказывается, это не iframe
проблема, это потому, что некоторые <a>
не меняют URL напрямую, он вызывает некоторый javascript для выполнения этой работы. Это было проверено из стека вызовов.
В таком случае первым делом необходимо подключить еще одного делегата, createWebViewWithRequest
. Этот делегат возвращается nil
по умолчанию. Поэтому измените его следующим образом:
- (WebView*)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request
{
return sender;
}
Ничего особенного, но пусть следующие коды продолжаются.
Во-вторых, вместо этого отправляется запрос URL-адреса javascript decidePolicyForNavigationAction
. Так что все еще не срабатывает decidePolicyForNewWindowAction
, но, по крайней мере, есть шанс узнать это.
В моем случае я добавляю некоторое условие внутри decidePolicyForNavigationAction
, чтобы различать мой запрос и запрос iframe, например:
- (void) webView: (WebView*) sender decidePolicyForNavigationAction: (NSDictionary*) actionInformation
request: (NSURLRequest*) request
frame: (WebFrame*) frame
decisionListener: (id <WebPolicyDecisionListener>) listener
{
NSString* mainDocumentURL = [[request mainDocumentURL] absoluteString];
NSString* fromYT = @"https://www.youtube.com";
if ([mainDocumentURL hasPrefix:fromYT]) {
[[NSWorkspace sharedWorkspace] openURL:url]; // fires Safari
[listener ignore];
return;
}
// normal flow here, you could open it inside the webview or something
}