Bí Kíp "Hack" Yêu Cầu WebView: Chặn Đứng Mọi Traffic Trên Android và iOS Cực Đơn Giản!
Lê Lân
1
Cách Chặn và Ghi Lại Mọi Yêu Cầu (Request) Từ WebView Trên Android và iOS
Mở Đầu
Bạn đã bao giờ thắc mắc làm thế nào để chặn và ghi lại mọi yêu cầu (request) mà WebView của bạn gửi đi trên cả Android và iOS chưa? Việc này tưởng chừng phức tạp nhưng thực ra lại khá đơn giản trên Android và có mẹo nhỏ thú vị cho iOS. Bài viết này sẽ giúp bạn hiểu chi tiết cách thực hiện điều đó trên cả hai nền tảng phổ biến, từ cách tạo custom WebView Client trên Android đến việc dùng WKContentRuleList trên iOS để kiểm soát yêu cầu mạng.
Chúng ta sẽ cùng khám phá từng bước hướng dẫn, kèm theo ví dụ cụ thể và giải thích chi tiết các khái niệm quan trọng. Bạn sẽ nắm được cách chặn hoặc cho phép các request dựa trên host một cách hiệu quả để đảm bảo ứng dụng hoạt động ổn định, an toàn.
Chặn Request Trong WebView Trên Android
Tạo WebView Client Tùy Chỉnh
Trên Android, việc chặn và ghi lại các request trong WebView khá dễ dàng nhờ việc kế thừa và override hàm shouldInterceptRequest.
Bạn chỉ cần tạo một lớp WebViewClient tùy chỉnh như sau:
WebView(context).apply {
webViewClient = object : WebViewClientCompat() {
overridefunshouldInterceptRequest(
view: WebView,
request: WebResourceRequest,
): WebResourceResponse? {
val requestHost = request.url.host
val isRequestAllowed = allowedHostsList.any { it.host == requestHost }
if (isRequestAllowed) {
returnnull// Cho phép request tiếp tục
}
return WebResourceResponse(
"text/html",
"utf-8",
403,
"Blocked",
emptyMap(),
ByteArrayInputStream(ByteArray(0))
)
}
}
}
Giải Thích Cách Hoạt Động
shouldInterceptRequest được gọi mỗi khi WebView chuẩn bị gửi một request.
Sử dụng request.url.host để lấy tên miền của yêu cầu.
Kiểm tra với danh sách host được phép (allowedHostsList).
Nếu request bị chặn, trả về WebResourceResponse với mã lỗi 403 và nội dung rỗng.
Nếu được phép, trả về null để WebView tiếp tục xử lý request bình thường.
Lưu ý quan trọng:request.url.host chỉ chứa phần host (ví dụ: google.com), không có protocol hay pathname. Nếu cần chi tiết hơn, hãy lấy trực tiếp từ đối tượng request.url.
Ưu Điểm và Ứng Dụng
Có thể dễ dàng chặn các request đến domain không mong muốn, tăng cường bảo mật.
Cho phép ghi lại hoặc sửa đổi request để tự động hóa hoặc thay đổi hành vi tải trang.
Phù hợp với nhu cầu kiểm soát nghiêm ngặt các tài nguyên được tải về từ WebView.
Giới Hạn Và Giải Pháp Trên iOS
Khó Khăn Khi Chặn Request Trong WKWebView
Trên iOS, WKWebView không cung cấp API trực tiếp để chặn mọi request như Android. Cụ thể:
WKNavigationDelegate chỉ giúp bạn xử lý việc điều hướng giữa các trang (navigation requests).
Các request nội bộ được tạo ra bởi JavaScript trên trang web thì không thể bị chặn trực tiếp.
Đây là điểm cần lưu ý vì việc chặn toàn bộ request có thể phức tạp hơn dường như.
Sử Dụng WKContentRuleList Để Chặn Request
Để giải quyết vấn đề này, Apple cho phép sử dụng WKContentRuleList - một danh sách luật tương tự như content blockers của trình duyệt Safari.
Cách Hoạt Động Cơ Bản
Bạn định nghĩa một list các luật (rule list) bằng JSON.
Các luật này sẽ được compile và thêm vào WKWebView.
Bạn có thể quy định chặn hoặc cho phép các URL dựa trên biểu thức chính quy (regex).
Ví dụ một danh sách luật như sau:
[
{
"trigger":{"url-filter":".*"},
"action":{"type":"block"}
},
{
"trigger":{"url-filter":"google.com"},
"action":{"type":"ignore-previous-rules"}
}
]
Ý Nghĩa Luật
Luật đầu tiên: chặn mọi URL (.* là regex khớp tất cả).
Luật thứ hai: cho phép các URL chứa google.com bằng cách bỏ qua các luật trước.
Tổng Quan So Sánh Cách Thực Hiện Trên Android và iOS
Tiêu chí
Android
iOS
API hỗ trợ chặn request
Có, qua
shouldInterceptRequest
Không trực tiếp, dùng
WKContentRuleList
Ghi lại request
Có thể
Không hỗ trợ
Tùy chỉnh phản hồi
Có thể trả về tài nguyên tùy chỉnh
Chỉ có thể chặn hoặc không chặn
Phức tạp thực hiện
Đơn giản
Phức tạp hơn, cần dùng workaround
Khả năng kiểm soát
Cao
Giới hạn
Kết Luận
Việc chặn và ghi lại mọi yêu cầu từ WebView rất quan trọng để nâng cao bảo mật và kiểm soát hiệu suất ứng dụng. Trên Android, bạn có thể dễ dàng làm điều này qua việc tạo custom WebViewClient và override hàm shouldInterceptRequest.
Trên iOS, do giới hạn API, bạn cần sử dụng WKContentRuleList như một phương pháp workaround để chặn các request không mong muốn. Mặc dù chưa thể ghi lại hoặc tuỳ chỉnh chi tiết request như Android, đây vẫn là cách khả thi nhất hiện nay.
Hy vọng trong tương lai Apple sẽ cung cấp API trực tiếp hơn để quản lý request trong WebView.
Cảm ơn bạn đã đọc! Nếu có thắc mắc hay muốn trao đổi thêm, đừng ngần ngại liên hệ.