IOS 와 웹 페이지 JS 의 상호작용 상세 설명 및 실례
모 바 일 앱 의 빠 른 교체 개발 추세 에 따라 점점 더 많은 앱 에 html 페이지 가 삽입 되 었 지만 일부 중대 형 앱 에서 특히 전자상거래 앱 은 html 페이지 가 전시 기능 만 만족 시 키 는 것 이 아니 라 이때 html 는 네 이 티 브 언어 와 상호작용 을 하고 서로 전달 할 수 있 도록 요구한다.예 를 들 어 앱 에서 인기 관광지 의 홈 페이지 에서 특정한 관광 지 를 클릭 하면 원생 중의 해당 관광지 상세 페이지 컨트롤 러 로 이동 할 수 있다.
이 를 위해 저 는 가장 자주 사용 하 는 가장 편리 하고 효과 적 인 OC 와 JS 의 상호작용 방식 세 가 지 를 정리 하여 여러분 들 이 교 류 를 배 울 수 있 도록 했 습 니 다.
첫 번 째:JS 는 OC 에 값 을 전달한다.
1.기술 방안:JavaScriptCore.framework 프레임 워 크 사용
2.장면 사용:웹 페이지 의 코드 중의 한 방법,예 를 들 어 이벤트 방법 을 클릭 하여 이 방법의 매개 변 수 를 OC 에 전달 하여 OC 에 사용 하도록 한다.
예 를 들 어 앱 에서 인기 관광지 의 홈 페이지 에 인기 관광지 가 많 습 니 다.특정한 관광지 의 사진 이나 이름 을 클릭 하면 원생 중의 해당 관광지 상세 페이지 컨트롤 러 로 이동 할 수 있 습 니 다.
3.코드 는 다음 과 같다.
OC 에서 구현 할 코드:
JavaScriptCore.framework 정적 라 이브 러 리 에 끌 어 다 놓 고 UIWebView Delegate 프 록 시 프로 토 콜 을 준수 합 니 다.
-webView Did Finish Load:방법 에 다음 코드 를 작성 합 니 다:
- (void)webViewDidFinishLoad:(UIWebView *)webView{
JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
context[@"passValue"] = ^{
NSArray *arg = [JSContext currentArguments];
for (id obj in arg) {
NSLog(@"%@", obj);
}
};
}
그 중에서 passValue 는 JS 의 함수 명 으로 얻 은 arg 배열 에서 JS 인 passValue 함수 의 매개 변수,즉 JS 가 OC 에 전달 할 매개 변수 입 니 다.JS 에서 구현 할 코드:
function testClick()
{
var str1=document.getElementById("text1").value;
var str2=document.getElementById("text2").value;
passValue(str1,str2);
}
OC 에 값 을 전달 해 야 하 는 함수(예:testClick()에서 passValue()함 수 를 직접 호출 하여 값 을 전달 하면 됩 니 다.두 번 째:JS 는 OC 에 값 을 전달한다.
1.기술 방안:사용자 정의 url 방법 을 사용 하여 웹 페이지 를 클릭 할 때마다
2.장면 사용:웹 페이지 의 코드 중의 한 방법,예 를 들 어 이벤트 방법 을 클릭 하여 이 방법의 매개 변 수 를 OC 에 전달 하여 OC 에 사용 하도록 한다.
예 를 들 어 앱 에서 인기 관광지 의 홈 페이지 에 인기 관광지 가 많 습 니 다.특정한 관광지 의 사진 이나 이름 을 클릭 하면 원생 중의 해당 관광지 상세 페이지 컨트롤 러 로 이동 할 수 있 습 니 다.
3.코드 는 다음 과 같다.
JS 에서 구현 할 코드:
function testClick()
{
var str1=document.getElementById("text1").value;
var str2=document.getElementById("text2").value;
// "objc://" ;
// str1&str2 OC , ":/"
window.location.href="objc://"+":/"+str1+":/"+str2;
}
OC 에 값 을 전달 해 야 하 는 함수 에(예:testClick()위 와 같은 형식의 코드 를 쓰 십시오.그 중에서 obj c:/는 사용자 정의 프로 토 콜 헤드 이 고 str1 과 str2 는 JS 가 OC 에 전달 할 값 입 니 다.
OC 에서 구현 할 코드:
// UIWebViewDelegate 。
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
// url
NSString *requestStr = [[request.URL absoluteString] stringByRemovingPercentEncoding];
// url "objc://"
if ([requestStr hasPrefix:@"objc://"]) {
// "://" url , arr
NSArray *arr = [requestStr componentsSeparatedByString:@"://"];
NSLog(@"%@",arr);
//
NSString *paramStr = arr[1];
NSLog(@"%@",paramStr);
// ":/" url , arr2, arr2[0] ,arr2[1] ,arr2[2] ,
NSArray *arr2 = [paramStr componentsSeparatedByString:@":/"];
NSLog(@"%@",arr2);
// ,
if (arr2.count) {
NSLog(@" ");
[self doSomeThingWithParamA:arr2[1] andParamB:arr2[2]];
}else{
NSLog(@" ");
}
return NO;
}
return YES;
}
// JS
- (void)doSomeThingWithParamA:(id)paramA andParamB:(id)paramB{
NSLog(@"%@ %@", paramA, paramB);
}
세 번 째:제3자 라 이브 러 리 를 이용 하여 JS 와 OC 의 상호 전 가 를 실현 한다.1.기술 방안:WebViewJavascriptBridge 3 자 라 이브 러 리 사용
2.장면 사용:웹 페이지 의 코드 중의 한 방법,예 를 들 어 이벤트 방법 을 클릭 하여 이 방법의 매개 변 수 를 OC 에 전달 하여 OC 에 사용 하도록 한다.
예 를 들 어 앱 에서 인기 관광지 의 홈 페이지 에 인기 관광지 가 많 습 니 다.특정한 관광지 의 사진 이나 이름 을 클릭 하면 원생 중의 해당 관광지 상세 페이지 컨트롤 러 로 이동 할 수 있 습 니 다.
또는 원생 중의 사용자 정 보 를 웹 페이지 에 전달 하여 개성 화 된 전시 로 한다.
3.코드 는 다음 과 같다.
OC 패스 JS
JS 에서 구현 해 야 할 코드:
function setupWebViewJavascriptBridge(callback) {
if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
window.WVJBCallbacks = [callback];
var WVJBIframe = document.createElement('iframe');
WVJBIframe.style.display = 'none';
WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
document.documentElement.appendChild(WVJBIframe);
setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
}
//
setupWebViewJavascriptBridge(function (bridge){
//OC JS 'testJavascriptHandler' ;'data' OC ;'responseCallback' JS OC
bridge.registerHandler('testJavascriptHandler', function(data, responseCallback) {
// OC
log('ObjC called testJavascriptHandler with', data)
var responseData = { 'Javascript Says':'Right back atcha!' }
log('JS responding with', responseData)
// OC
responseCallback(responseData)
})
OC 에서 구현 해 야 할 코드:제3자 라 이브 러 리 WebViewJavascriptBridge 가 져 오기;UIWebViewDelegate 준수;
// Bridge
[WebViewJavascriptBridge enableLogging];
// webView bridge
_bridge = [WebViewJavascriptBridge bridgeForWebView:web];
[_bridge setWebViewDelegate:self];
//OC JS , 'testJavascriptHandler';data
[_bridge callHandler:@"testJavascriptHandler" data:@{@" ":@"20"}];
JS 는 OC 에 값 을 전달한다JS 에서 구현 해 야 할 코드:
//
callbackBt.onclick = function()
{
var str1=document.getElementById("text1").value;
var str2=document.getElementById("text2").value;
//JS OC 。'passValue' ;'str1'&'str2' ; response OC JS
bridge.callHandler('passValue', {str1,str2}, function(response) {
})
}
OC 에서 구현 해 야 할 코드:제3자 라 이브 러 리 WebViewJavascriptBridge 가 져 오기;UIWebViewDelegate 준수;
// Bridge
[WebViewJavascriptBridge enableLogging];
// webView bridge
_bridge = [WebViewJavascriptBridge bridgeForWebView:web];
[_bridge setWebViewDelegate:self];
//js oc .'passValue' ;'data' JS ;'responseCallback' OC JS
[_bridge registerHandler:@"passValue" handler:^(id data, WVJBResponseCallback responseCallback) {
// js
NSLog(@"%@", data);
// js
responseCallback(@" ");
}];
주의해 야 할 것 은 어느 쪽 이 어느 쪽 에 값 을 전달 하든지 간 에 값 을 전달 하 는 방법의 명칭 과 대응 하 는 수신 값 의 방법의 명칭 은 일치 해 야 한 다 는 것 이다.읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
IOS에서 ReplayKit 및 RTC 사용 방법응용된 소리와 아나운서의 소리를 포함한다.이 두 가지 수요를 감안하여 우리는 스크린 공유를 하는 생방송에 필요한 미디어 흐름을 간단하게 분석할 수 있다. 만약 우리가 Audio App과 Audio Mic를 두 개의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.