- 在代理方法中攔截協議
- 使用 JavaScriptCore
- WKWebView 的 WKScriptMessagehandler
- 使用 NSURLProtocol 攔截請求
- 使用第三方庫 WebViewJavascriptBridge
- 使用 WebSocket
這里只介紹第 6 種,其它的相關資料網上有很多。
使用 WebSocket 的方式需要在應用內起一個 websocket server 服務(有很多第三方的 websocket server 庫),html 頁面通過 Websocket 連接到服務,接著就是發送消息了,剩下的就跟代理方法攔截協議類似。
// OC code, 以 PocketSocket 這個庫為例
_socketServer = [PSWebSocketServer serverWithHost:nil port:9001];
_socketServer.delegate = self;
_socketServer.delegateQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
[_socketServer start];
#pragma mark - PSWebSocketServerDelegate
- (void)serverDidStart:(PSWebSocketServer *)server {
NSLog(@"Server did start…");
}
- (void)serverDidStop:(PSWebSocketServer *)server {
NSLog(@"Server did stop…");
}
- (BOOL)server:(PSWebSocketServer *)server acceptWebSocketWithRequest:(NSURLRequest *)request {
NSLog(@"Server should accept request: %@", request);
return YES;
}
- (void)server:(PSWebSocketServer *)server webSocket:(PSWebSocket *)webSocket didReceiveMessage:(id)message {
// 在這里攔截
NSLog(@"Server websocket did receive message: %@", message);
NSString *text = message;
NSURL *url = [NSURL URLWithString:text];
if ([url.scheme isEqualToString:@"camera"]) {
......
}
}
- (void)server:(PSWebSocketServer *)server webSocketDidOpen:(PSWebSocket *)webSocket {
NSLog(@"Server websocket did open");
}
- (void)server:(PSWebSocketServer *)server didFailWithError:(NSError *)error
{
NSLog(@"Server did fail with error: %@", error);
}
- (void)server:(PSWebSocketServer *)server webSocket:(PSWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean {
NSLog(@"Server websocket did close with code: %@, reason: %@, wasClean: %@", @(code), reason, @(wasClean));
}
- (void)server:(PSWebSocketServer *)server webSocket:(PSWebSocket *)webSocket didFailWithError:(NSError *)error {
NSLog(@"Server websocket did fail with error: %@", error);
}
// JS code
var wsServer = 'ws://localhost:9001';
var websocket = new WebSocket(wsServer);
websocket.onopen = function (evt) { onOpen(evt) };
websocket.onclose = function (evt) { onClose(evt) };
websocket.onmessage = function (evt) { onMessage(evt) };
websocket.onerror = function (evt) { onError(evt) };
function onOpen(evt) {
console.log("Connected to WebSocket server.");
}
function onClose(evt) {
console.log("Disconnected");
}
function onMessage(evt) {
console.log("Recieve data: " + evt.data);
}
function onError(evt) {
console.log('Error occured: ' + evt.data);
}
// 發送消息
websocket.send("camera://openCamera?index=1&quality=high&callback=callbackFunction);
function callbackFunction(data){
}