Objective - C 와 javascript 의 상호작용
// js
-(IBAction)insertJSTouched:(id)sender {
NSString *insertString = [NSString stringWithFormat:
@"var script = document.createElement('script');"
"script.type = 'text/javascript';"
"script.text = \"function jsFunc() { "
"var a=document.getElementsByTagName('body')[0];"
"alert('%@');"
"}\";"
"document.getElementsByTagName('head')[0].appendChild(script);", self.someString];
NSLog(@"insert string %@",insertString);
[self.myWeb stringByEvaluatingJavaScriptFromString:insertString];
[self.myWeb stringByEvaluatingJavaScriptFromString:@"jsFunc();"];
}
// form
- (IBAction)submitTouched:(id)sender {
[self.myWeb stringByEvaluatingJavaScriptFromString:@"document.forms[0].submit(); "];
}
//
- (IBAction)fontTouched:(id)sender {
NSString *tempString2 = [NSString stringWithFormat:@"document.getElementsByTagName('p')[0].style.fontSize='%@';",@"19px"];
[self.myWeb stringByEvaluatingJavaScriptFromString:tempString2];
}
2. JavaScriptCore & & UIWebview > = iOS 7 iOS 7 에 JavaScriptCore. framework 프레임 워 크 가 추가 되 었 습 니 다.웹 키 트 의 자 바스 크 립 트 엔진 을 Objective - C 로 밀봉 합 니 다.이 프레임 워 크 는 Objective - C 와 JavaScript 코드 의 직접적인 상호작용 을 더욱 간단 하고 편리 하 게 한다.대화 상 대 를 적당 한 시기 에 주입 하면 UIWebView 는 언제 JScontext 환경 을 만 듭 니까?두 가지 방식 으로 나 뉜 다. 첫째, 웹 페이지 를 렌 더 링 할 때 두 번 째 는 바로 사용 방법 & lt 이다.br> [webView valueForKeyPath: @ "documentView. webView. mainFrame. javaScriptContext"] JScontext 환경 을 가 져 올 때 & lt 를 만 나 든 말 든;script 탭 은 JScontext 환경 을 만 들 고 & lt 를 만 납 니 다.script 태그 재 창조 환경 은 같 습 니 다.lt;br> JScontext 문 제 를 언제 주입 합 니까 & lt;br> 저 는 보통 - (void) webView Did FinishLoad: (UIWebView *) webView 에 상호작용 대상 을 주입 합 니 다. 그러나 이때 웹 페이지 가 아직 로드 되 지 않 았 습 니 다. 자바 스 크 립 트 쪽 에서 상호작용 방법 을 호출 했 습 니 다. 그러면 원생 응용 방법 을 바 꾸 지 못 해 문제 가 발생 할 수 있 습 니 다. <br> - (void) viewdLoad 에 상호작용 대상 을 주입 하 는 것 으로 바 뀌 었 습 니 다. 그러면 위의 문 제 를 해결 하 는 동시에 새로운 문 제 를 일 으 켰 습 니 다. 한 페이지 내부 에서 링크 를 클릭 하여 다른 페이지 로 넘 어 갈 때 두 번 째 페이지 는 상호작용 이 필요 합 니 다. 이때 JScontext 환경 은 이미 변 했 습 니 다. 그러나 - (void) viewdLoad 는 한 번 만 불 러 오고 뛰 었 을 때...상호작용 대상 을 다시 주입 하지 않 으 면 두 번 째 페이지 에서 상호작용 을 할 수 없다.물론 당신 은 - (void) view DidLoad 와 - (void) webView Did FinishLoad: (UIWebView *) webView 에 한 번 주입 할 수 있 지만, 반드시 더욱 우아 한 방법 으로 이 문 제 를 해결 할 수 있 을 것 입 니 다.lt;br> 만약 에 위의 방안 이 수 요 를 만족 시 킬 수 있다 면 이 방법 을 다시 사용 하 는 것 을 권장 합 니 다. 바로 JScontext 환경 을 만 들 때마다 우 리 는 이 상호작용 대상 에 주입 하여 위의 문 제 를 해결 하 는 것 입 니 다.구체 적 인 해결 방법 은 이 오픈 소스 라 이브 러 리 UIWebView - TS 를 참고 하 였 습 니 다.JavaScriptContext。<br> 여러 iFrame 의 JScontext 문제 & lt; /p>
<pre><code>NSArray *frames = [webView valueForKeyPath:@"documentView.webView.mainFrame.childFrames"];
[frames enumerateObjectsUsingBlock:^(id frame, NSUInteger idx, BOOL *stop) {
JSContext *context = [frame valueForKeyPath:@"javaScriptContext"];
context[@"Window"][@"prototype"][@"alert"] = ^(NSString *message) {
NSLog(@"%@", message);
};
}];
</code></pre>
<p>1. JavaScriptCore 는 Objective - C UIWebview 의 delegate & lt 를 호출 합 니 다. /p>
<pre><code>- (void)webViewDidFinishLoad:(UIWebView *)webView
{
/ / html title 로 탐색 표시 줄 title 설정
self.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
// Undocumented access to UIWebView's JSContext
self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
/ / 인쇄 이상
self.context.exceptionHandler =
^(JSContext *context, JSValue *exceptionValue)
{
context.exception = exceptionValue;
NSLog(@"%@", exceptionValue);
};
/ / JSexport 프로 토 콜 로 native 를 연결 하 는 방법
self.context[@"app"] = self;
/ / block 형식 으로 JavaScript function 연결
self.context[@"log"] =
^(NSString *str)
{
NSLog(@"%@", str);
};
/ / 다 변수
self.context[@"mutiParams"] =
^(NSString *a,NSString *b,NSString *c)
{
NSLog(@"%@ %@ %@",a,b,c);
};
}
</code></pre>
<p>2. Objective - C 에서 JavaScriptCore & lt 호출;br> Objective-C</p>
<p>js 의 쇼 Result 방법 을 호출 합 니 다. 여 기 는 하나의 매개 변수 result 입 니 다. 여러 개 는 배열 에 순서대로 기록 합 니 다 & lt; /p>
<pre><code>[self.context[@"showResult"] callWithArguments:@[result]];
</code></pre>
<p>JavaScript</p>
<pre><code>function showResult(resultNumber)
{
document.getElementById("result").innerText = resultNumber;
}
</code></pre>
<p>3. WKWebView & amp; & JavaScript >=iOS8<br> iOS 8 은 웹 키 트 라 는 새로운 프레임 워 크 를 도입 해 좋아 졌 다.웹 키 트 프레임 워 크 에는 WKWebView 가 UIKit 의 UIWebView 와 AppKit 의 WebView 를 교체 할 수 있 고 두 플랫폼 에서 일치 하 게 사용 할 수 있 는 인 터 페 이 스 를 제공 합 니 다.웹 키 트 프레임 워 크 는 개발 자가 네 이 티 브 앱 에서 Nitro 를 사용 하여 웹 페이지 의 성능 과 표현 을 향상 시 킬 수 있 도록 합 니 다. Nitro 는 Safari 의 JavaScript 엔진 WKWebView 가 JavaScriptCore 방식 을 지원 하지 않 지만 message handler 를 제공 하 는 방식 으로 JavaScript 와 Native 통신 을 제공 합 니 다. & lt; /p>
<p>1. Objective - C 호출 JavaScript & lt; /p>
<pre><code>/html 에 존재 하 는 js 방법 실행
- (IBAction)exeFuncTouched:(id)sender {
[self.myWebView evaluateJavaScript:@"showAlert('hahahha')" completionHandler:^(id item, NSError * _Nullable error) {
}];
}
</code></pre>
<ol start="2">
<li>JavaScript 호출 Objective - C & lt;br> JavaScript, 간단하게 패키지 합 니 다. 'Native' 는 Objective - C 에 미리 등록 하여 주입 한 js 대상 & lt; /li>
</ol>
<pre><code>function callOC(func,param){
var url= "func=" + func;
for(var i in param)
{
url = url + "&" + i + "=" + param[i];
}
window.webkit.messageHandlers.Native.postMessage(url);
}
</code></pre>
<p>JavaScript 호출 & lt; /p>
<pre><code><input type = "button" value = "인사 해" onclick = "callOC ('alert', {'message': '안녕하세요'})" / & lt;
</code></pre>
<p>Objective - C 구현 & lt; /p>
<pre><code>WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.userContentController = [[WKUserContentController alloc] init];
/ / JS 대상 Native 주입,
/ / 성명 WKScriptMessageHandler 프로 토 콜
[config.userContentController addScriptMessageHandler:self name:@"Native"];
self.myWebView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];
self.myWebView.UIDelegate = self;
[self.view addSubview:self.myWebView];
</code></pre>
<pre><code>-(void)userContentController:(WKUserContentController *)userContentController
didReceiveScriptMessage:(WKScriptMessage *)message {
if ([message.name isEqualToString:@"Native"]) {
NSLog(@"message.body:%@", message.body);
/ / 자신 이 정의 한 프로 토 콜 이 라면 프로 토 콜 의 방법 과 파 라 메 터 를 캡 처 하여 오류 가 없 음 을 판단 한 후 여기에서 수 동 으로 oc 방법 을 호출 합 니 다.
NSMutableDictionary *param = [self queryStringToDictionary:message.body];
NSLog(@"get param:%@",[param description]);
NSString *func = [param objectForKey:@"func"];
/ / 로 컬 함수 호출
if([func isEqualToString:@"alert"])
{
[self show Message: @ "웹 페이지 에서 온 알림" message: [param objectForKey: @ "message"];
}
}
}
</code></pre>
<p>전송 주소:http://www.skyfox.org/javascript-ios-navive-message.html</p>
</article>
</div>
</div>
</div>
<!--PC 와 WAP 자체 적응 버 전 -- & lt;
<div id="SOHUCS" sid="1201152471083360256"></div>
<script type="text/javascript" src="/views/front/js/chanyan.js">
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.