2012-12-01 3 views
1

UIWebView 내부의 서버에서 HTML 파일을로드하고 있습니다. HTML 파일에는 외부 링크가 열리고 Javascript 함수가 해당 이벤트를 처리하도록 작성되었습니다. 응용 프로그램 내에서 별도의 새 webview 내부에서 해당 하이퍼 링크를 열고 싶습니다.javascript에서 objective-C로 통신

객관적인 C 또는 목표 - C에서 호출하고 내 코드에서 someting 할 수있는 모든 콜백 함수를 서버 쪽 자바 스크립트 메서드는 알리는 방법이 있습니까? 나는 WEBViewJavaScriptBridge의 예를 자바 스크립트와 목표 C 사이에서 의사 소통하는 것을 보았지만 로컬 HTML 파일을 사용하여로드하고 의사 소통 할 수 있습니다. 내 HTML 파일은 서버 측에 있습니다. 누군가 도움이 될 수 있다면 좋을 것 같습니다.

여기에 샘플 HTML 파일이 있습니다. 우리는 두 개의 하이퍼 링크 "열린"및 "닫기"를 테잎에 열어 놓은 버튼이 있습니다. 그래서 alert 대신 retuen 콜백을 objective-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, 정답으로 표시하려면 정답 옆의 체크 표시를 클릭하십시오. 같은 질문에서 더 유용한 답변을 찾으면 대답 옆에있는 위 화살표를 클릭하여 upvote를 할 수 있습니다. – iDev

+0

위임 메소드'webView : shouldStartLoadWithRequest : navigationType : '을 탭에서 호출하는지 확인하십시오. 그렇다면 여기서 구현해야합니다. – iDev

답변

1

자바 스크립트와 객관적인 C 코드를 전달하기 위해 webviewjavascriptbridge를 사용했습니다.

이 예제 코드에서는 bridge의 전역 변수를 확인하십시오.

<!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

다음과 같은 웹보기의 delagate 방법과 목표 C에서 HTML과 통신 할 수 있습니다 ...

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

이러한 방법의 사용을 통해 이동하십시오. .. 이게 도움이되기를 바랍니다.