2016-09-25 26 views
6

Hiện tại, OnShouldStartLoadWithRequest chỉ được hỗ trợ trên iOS. A PR to add support for this on Android đã bị đóng. Nếu một WebView trên Android cố mở một lược đồ URL tùy chỉnh, the app will crash - điều này cũng làm cho ứng dụng của tôi gặp sự cố.Ngăn WebView tải URL trong Android (React Native)

Ứng dụng tôi đang thực hiện cần chặn WebView đang cố gắng mở lược đồ URL tùy chỉnh và hủy nó trước khi mở URL đó (trên iOS, trả lại false trên OnShouldStartLoadWithRequest là cách tuyệt vời để làm điều đó).

Cách tốt nhất để làm điều này trên Android là gì?

Tôi muốn mã này để làm việc:

 <WebView 
      ref={WEBVIEW_REF} 
      source={{uri: INITIAL_URI}} 
      onShouldStartLoadWithRequest={this.onShouldStartLoadWithRequest} 
      style={{width, height: height - navBarHeight, backgroundColor: "#fff"}} 
     /> 

onShouldStartLoadWithRequest(navigator) { 
    if (navigator.url.indexOf(INTERCEPT_URL) === -1) { 
     return true; 
    }  
    return false; 
    } 

Tôi cá nhân okay với khá nhiều bất cứ điều gì mà làm việc - bao gồm sửa đổi ReactWebViewManager.java bằng tay. Tôi chỉ cần để có được điều này ra khỏi cửa.

Trả lời

9

Bạn có thể sử dụng onNavigationStateChange bất động sản, trong đó sẽ nhận được cùng một đối tượng navigator khi bạn nhận được trong chức năng của bạn onShouldStartLoadWithRequest.

<WebView 
     ref={WEBVIEW_REF} 
     source={{uri: INITIAL_URI}} 
     onShouldStartLoadWithRequest={this.onShouldStartLoadWithRequest} //for iOS 
     onNavigationStateChange ={this.onShouldStartLoadWithRequest} //for Android 

     style={{width, height: height - navBarHeight, backgroundColor: "#fff"}} 
    /> 

Và sau đó trong hàm

onShouldStartLoadWithRequest(navigator) { 
    if (navigator.url.indexOf(INTERCEPT_URL) === -1) { 
     return true; 
    } else { 
     this.refs[WEBVIEW_REF].stopLoading(); //Some reference to your WebView to make it stop loading that URL 
     return false; 
    }  
} 

tôi đã có yêu cầu tương tự như bạn, và đó là how've Tôi giải quyết nó.

+3

Sau khi gọi 'stopLoading()', WebView của tôi không còn xử lý các sự kiện chạm. Nếu người dùng nhấp vào một liên kết và nó sẽ mở ra trong trình duyệt của họ, sau đó họ có thể mở ứng dụng của tôi mà vẫn hiển thị WebView. Nếu họ cố bấm vào một liên kết khác trong WebView đó thì nó sẽ không làm gì cả. Bạn đã gặp phải điều này? – ckeeney

0

Nếu bạn có thể sửa đổi lược đồ, bạn có thể thêm hậu tố http vào nó để WebViewManager sẽ không cố tạo ý định với lược đồ đó và cố gắng giải quyết nó.

Như bạn có thể thấy trong ReactWebViewManager

public boolean shouldOverrideUrlLoading(WebView view, String url) { 
    if (url.startsWith("http://") || url.startsWith("https://")) { 
     return 
    } 
    ... 
} 

Nếu url bắt đầu bằng http người quản lý sẽ không đối xử với nó như một chương trình. Tôi biết đó là một cách giải quyết xấu xí nhưng hey, nó thực hiện công việc.

Các vấn đề liên quan