2012-12-01 15 views
1

我正在從UIWebView中的服務器加載HTML文件文件。在HTML文件中,我們有打開的外部鏈接,並且編寫了一個Javascript函數來處理這些事件。我想在應用程序內的單獨新web視圖中打開該超鏈接。從javascript到objective-C的通信

有沒有什麼辦法,服務器端JavaScript方法通知Objective-C或任何回調函數將調用Objective-C,然後我可以做我的代碼someting?我已經看到了WEBViewJavaScriptBridge在JavaScript和Objective C之間進行通信的例子,但它們使用本地HTML文件來加載和通信。我的HTML文件在服務器端。如果有人能夠幫助解決這個問題,那將是非常棒的。

我在這裏推廣一個示例HTML文件。我們有兩個超鏈接「打開」和「關閉」在打開按鈕上打開一個功能被稱爲顯示警報。所以而不是警報我想通過retuen回調到客觀C代碼。

這就是: -

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<meta http-equiv="X-UA-Compatible" content="IE=edge"/> 
<meta name="viewport" content="width = device-width, initial-scale = 1.0, maximum-scale = 1.0, minimum-scale = 1.0, user-scalable=no"/> 
<meta name="HandheldFriendly" content="True"/> 
<meta name="apple-mobile-web-app-capable" content="yes" /> 
<meta name="apple-mobile-web-app-status-bar-style" content="black" /> 
<title>Test HTML</title> 
<script type="text/javascript"> 

function open(url, offset){ 
alert("Open Webview with url:"+ url + " & Offset: " + offset); 
} 

function close(url, offset){ 
alert("close webview"); 
} 

</script> 
</head> 
<body> 
<a href="javascript:open('http://www.tcm.com', '55')">Open</a><br> 
<a href="javascript:close()">Close</a> 
</body> 
</html> 
+0

我怎麼可以獎勵或者接受那些? –

+1

@SandeepDhama,點擊這些答案旁邊的勾號標記爲正確答案。如果您在同一個問題中找到更多有用的答案,您可以點擊答案旁邊的向上箭頭進行點贊。 – iDev

+0

檢查它是否在調用委託方法'webView:shouldStartLoadWithRequest:navigationType:'。如果是的話,你需要在這裏實現它。 – iDev

回答

1

我用webviewjavascriptbridge來溝通JavaScript和客觀的C代碼。

在此示例代碼中,請注意橋的全局變量。

<!doctype html> 
<html><head> 
<style type='text/css'> 
    html { font-family:Helvetica; color:#222; } 
    h1 { color:steelblue; font-size:24px; margin-top:24px; } 
    button { margin:0 3px 10px; font-size:12px; } 
    .logLine { border-bottom:1px solid #ccc; padding:4px 2px; font-family:courier; font-size:11px; } 
</style> 
</head><body> 
<h1>WebViewJavascriptBridge Demo</h1> 
<script> 
window.onerror = function(err) { 
    alert('window.onerror: ' + err) 
} 
var bridge; 
document.addEventListener('WebViewJavascriptBridgeReady', onBridgeReady, false) 
function onBridgeReady(event){ 
    alert("Onbridge ready call"); 

    bridge = event.bridge 
    var uniqueId = 1 
    function log(message, data) { 
     var log = document.getElementById('log') 
     var el = document.createElement('div') 
     el.className = 'logLine' 
     el.innerHTML = uniqueId++ + '. ' + message + (data ? ': ' + JSON.stringify(data) : '') 
     if (log.children.length) { log.insertBefore(el, log.children[0]) } 
     else { log.appendChild(el) } 
    } 
    bridge.init(function(message) { 
     log('JS got a message', message) 
    }) 

    bridge.registerHandler('open', function(data, response) { 
          log('JS handler testJavascriptHandler was called', data) 
          response.respondWith({ 'Javascript Says':'open open open!' }) 
          }) 



    bridge.registerHandler('testJavascriptHandler', function(data, response) { 
     log('JS handler testJavascriptHandler was called', data) 
     response.respondWith({ 'Javascript Says':'Right back atcha!' }) 
    }) 

    var button = document.getElementById('buttons').appendChild(document.createElement('button')) 
    button.innerHTML = 'Send message to ObjC' 
    button.ontouchstart = function(e) { 
     e.preventDefault() 
     bridge.send('Hello from JS button') 
    } 

    document.body.appendChild(document.createElement('br')) 

    var callbackButton = document.getElementById('buttons').appendChild(document.createElement('button')) 
    callbackButton.innerHTML = 'Fire testObjcCallback' 
    callbackButton.ontouchstart = function(e) { 
     e.preventDefault() 
     log("Calling handler testObjcCallback") 
     bridge.callHandler('testObjcCallback', {'foo': 'bar'}, function(response) { 
      log('Got response from testObjcCallback', response) 
     }) 
    } 

} 



function open(url, offset,e) 
{ 
    alert(bridge); 

    //alert("Open Webview with url:Yes Got it"); 



    // alert(document.getElementById(offset).href); 
    // var bridge = event.bridge; 
    // alert(bridge); 

    window.location = url+'?offset='+offset//'myapp:myaction:url:offset' 

    //requestFromObjc("buttonColor&someParam=1"); 
} 


function close() 
{ 
     alert("Open Webview with url:"+ url + " & Offset: " + offset); 
} 

function requestFromObjc(functionName, objcResult, callback) 
{ 
    if (!objcResult) 
    { 
     window.location = 'myapp:myaction:param1:param2' 
     // window.location = "myapp://objcRequest?function=" + functionName + "&callback=" + arguments.callee.name + "&callbackFunc=" + arguments.callee.caller.name; 
    } 
    else 
    { 
     window[callback](objcResult); 
    } 
} 

</script> 
<div id='buttons'></div> <div id='log'></div> 

<body> 
    <a id="55" href="javascript:open('http://www.tcm.com', '55',this)">Open</a><br> 
    <a href="javascript:close()">Close</a> 
</body> 

</body></html> 

參考:https://github.com/marcuswestin/WebViewJavascriptBridge

+0

我怎麼能把這個註冊處理程序調用到Objective c中,你能幫我嗎? –

1

您可以用HTML從以下web視圖delagate方法Objective C的溝通...

- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script 
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 

請通過這些方法的使用。 .. 我希望這可以幫助你