2017-04-11 4 views
0

私は、埋め込まれたビデオ(私はこのHTMLへのアクセス権がありません)を使って外部HTMLを読み込むオブジェクト-cでUIWebViewを持っています。この動画にはGoogle広告のプレロール広告が含まれています(ただし、今後別のプロバイダからのものも可能です)。 この広告には、ユーザーがクリックできる外部ウェブサイトへのリンクがありますが、JavaScriptのイベント(通常のアンカーではありません)によってトリガーされているようです。UIWebView - サファリでの強制ナビゲーション

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

は、誰もがSafariで開くためのWebViewにロードされたドメイン外のいずれかのナビゲーションを強制する方法を知っているでしょうか?私はこのように私はこの問題を回避することができると思います。

ありがとうございました。

答えて

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 *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)]; 
tapGesture.numberOfTouchesRequired = 1; 
tapGesture.numberOfTapsRequired = 1; 
tapGesture.delegate = self; 
[self.webView addGestureRecognizer:tapGesture]; 

ENSへのデリゲートメソッドを実装します。あなたはユーザ入力を検出するUITapGestureRecognizerを追加することができ、十分ではありませんUREあなたのタップが認識されている:

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

そして、その後の-webView:shouldStartLoadWithRequest:navigationType:方法では、あなたはself.userDidTap値を検査することができますし、それに応じて行動する:あなたの​​方法で

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

を、あなたは、一時BOOLを設定することができます:

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

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

    return YES; 
} 
+0

は、私はまた、こののにと思ったが、WebViewの中にロードされたURLは、API呼び出しによってアプリケーションに提供され、およびすることができますいつも違う。それが異なっているかどうかを知るためにクリックリクエストの瞬間にアプリにロードされている実際のドメインを知る方法はありますか? – fana

+0

APIから受け取った初期URLをプロパティとして保存し、そのホスト(NSURL-hostメソッド)を[request URL]のものと比較できますか? –

+0

私はできると思いますが、ロードされたWebviewの数は不明です。 1つのURLを返すAPIを呼び出すと、webview、または複数のURLに読み込まれる可能性があります。可能なすべての異なるURL ... – fana

関連する問題