2017-04-11 54 views
0

力导航我对Objective-C的一个UIWebView加载与嵌入的视频(我有这个HTML无法访问)外部HTML。此视频有来自Google广告的前贴式广告(但未来可能会由其他提供商提供)。 这则广告有一个链接到外部网站,用户可以点击,但它似乎是一个JavaScript事件(不是一个普通的锚)被触发。的UIWebView - 在Safari

我已经设置委托,以迫使在WebView中被点击的链接在Safari中打开,但是从广告这些链接保持的WebView内开幕。我认为这是因为它们是从javascript触发的。

这是我的委托:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest: 
(NSURLRequest *)request navigationType: 
(UIWebViewNavigationType)navigationType 
{ 
    if (navigationType == UIWebViewNavigationTypeLinkClicked) { 
     [[UIApplication sharedApplication] openURL:[request URL]]; 
     return NO; 
    } 
return YES; 
} 

是否的办法迫使在web视图在Safari中打开加载域之外的任何导航有谁知道?我想这样我可以绕过这个问题。

谢谢。

回答

0

假设你知道“内部”域领先的时候,你可能会迫使所有外部域在Safari中打开:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 

    if (![request.url.absoluteString containsString:@"https://www.yourinternaldomain.com"]) { 
     [[UIApplication sharedApplication] openURL:[request URL]]; 
     return NO; 
    } 

    return YES; 
} 

更新:

根据您的意见,如果以上是不够的,你可以添加一个UITapGestureRecognizer检测用户输入:

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)]; 
tapGesture.numberOfTouchesRequired = 1; 
tapGesture.numberOfTapsRequired = 1; 
tapGesture.delegate = self; 
[self.webView addGestureRecognizer:tapGesture]; 

实现委托方法ENS URE水龙头是公认:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    return YES; 
} 

在你​​方法,然后你可以设置一个临时BOOL

-(void)tapGesture:(UITapGestureRecognizer *)tapGesture { 
    self.userDidTap = YES; 
} 

然后在随后的-webView:shouldStartLoadWithRequest:navigationType:方法,你可以检查self.userDidTap价值并据此采取行动:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 

    if (self.userDidTap) { 
     [[UIApplication sharedApplication] openURL:[request URL]]; 
     return NO; 
    } 

    return YES; 
} 
+0

我也想过,虽然如此,但在网页视图中加载的URL通过API调用服务的应用程序,并能随时都会有所不同。有没有办法在点击请求时知道应用程序中加载的实际域名,以了解它是否与众不同? – fana

+0

你能存储从API接收作为属性的初始URL,并且该主机(NSURL -host方法)比较所述一个在[请求URL]? –

+0

我想我可以,但加载的webviews的数量是未知的。我打电话给一个API,可以返回一个网址加载到一个网络视图,或许多...所有可能不同的URL ... – fana

相关问题