OC與JS通信的幾種方式

  1. 在代理方法中攔截協議
  2. 使用 JavaScriptCore
  3. WKWebView 的 WKScriptMessagehandler
  4. 使用 NSURLProtocol 攔截請求
  5. 使用第三方庫 WebViewJavascriptBridge
  6. 使用 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){
        
    }

JavaScriptCore

WKWebView

自定義 NSURLProtocol

WebViewJavascriptBridge

WebSocket

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容