WKWebView Native và JS Integration
Tuy nhiên, vấn đề là trang web không có sẵn object window.jsInterface
, và trong WKWebView, chúng ta chỉ có thể lắng nghe các sự kiện từ window.webkit.messageHandlers
. Do đó, cần phải tiêm thêm một object JavaScript để chuyển tiếp các sự kiện này.
Toàn game bài đổi thưởng ios bộ quá trình thực hiện được viết trong một subclass của WKWebView:
@interface YHWebView ()<WKScriptMessageHandler>
Chúng ta cần triển khai giao thức WKScriptMessageHandler
, bao gồm một hàm duy nhất:
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
Hàm trên sẽ được sử dụng để lắng nghe các sự kiện từ window.webkit.messageHandlers
.
Trên cơ sở này, chúng ta cần sử dụng cấu hình WKWebViewConfiguration để tự định nghĩa các interface (chẳng hạn như jumpToNative
). Dưới đây là đoạn mã khởi tạo:
- (id)initWithFrame:(CGRect)frame
{
self.webViewConfig = [[WKWebViewConfiguration alloc] init];
self.webViewConfig.userContentController = [[WKUserContentController alloc] init];
[self.webViewConfig.userContentController addScriptMessageHandler:self name:@"jumpToNative"];
self = [super initWithFrame:frame configuration:self.webViewConfig];
#if DEBUG
// Kích hoạt chế độ Debug Safari
[self.webViewConfig.preferences setValue:@YES forKey:@"developerExtrasEnabled"];
#endif
return self;
}
Khi JavaScript gọi hàm sau:
window.webkit.messageHandlers.jumpToNative.postMessage()
Chúng ta sẽ nhận được thông điệp trong phần triển khai của WKScriptMessageHandler
. Ví dụ, nếu JavaScript gửi dữ liệu như sau:
window.webkit.messageHandlers.jumpToNative.postMessage({body: dict}); // dict là một chuỗi JSON
Thì trong phần triển khai của đại diện (delegate), chúng ta có thể đọc dữ liệu như sau:
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
if ([message.name isEqualToString:@"jumpToNative"]) {
NSString *body = [message.body objectForKey:@"body"];
NSData *bodyData = [body dataUsingEncoding:NSUTF8StringEncoding];
NSError *error;
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:bodyData options:0 error:&error];
// Xử lý key-value bên trong body
}
}
Bước cuối cùng còn lại là tiêm object JavaScript để chuyển tất cả các hành động liên quan đến window.jsInterface
sang window.webkit.messageHandlers
. Sử dụng WKUserScript, chúng ta có thể tiêm một object như vậy trước khi trang the game w88 được tải:
NSString *jsCode = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"YHWebView" ofType:@"js"] encoding:NSUTF8StringEncoding error:NULL];
self.jsInterfaceUserScript = [[WKUserScript alloc] initWithSource:jsCode injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
[self.webViewConfig.userContentController addUserScript:self.jsInterfaceUserScript];
Nội dung của tệp YHWebView.js:
window.jsInterface = {
jumpToNative: function(dict) {
window.webkit.messageHandlers.jumpToNative.postMessage({body: dict});
}
};
Vậy là hoàn tất!
Sửa đổi lần cuối vào 2025-01-14