JavaScriptCore - JScontext OC 와 JS 의 상호작용 실현
앞 에 적 으 십시오: 최근 프로젝트 에서 native APP 는 기본 적 인 기능 을 제공 합 니 다. 일부 업 무 는 h5 에 놓 여 있 습 니 다. 상호작용 체험 을 향상 시 키 기 위해 native 에서 작 동 하고 webview 에서 일치 하도록 Objective - C 와 javeScript 의 인 터 랙 션 인 터 페 이 스 를 제공 해 야 합 니 다. 프로젝트 지원 버 전 IOS 7 때 문 입 니 다. IOS 7 이후 javascriptcore. framework 와 h5 의 통신 도 예전 보다 훨씬 간단 해 졌 습 니 다.그렇게 많은 url shcema 를 정의 할 필요 가 없습니다. javascriptcore 를 통 해 Objective - C 와 javeScript 의 상호작용 을 직접 완성 할 수 있 습 니 다.
1. webView 에서 JScontext 의 획득 은 javascriptcore 인 터 랙 션 을 사용 하 는 핵심 은 webview 에서 현재 JScontext 를 얻 고 JScontext 에서 해당 하 는 동작 을 수행 하 는 것 입 니 다. 일반적인 경우 아래 인 터 페 이 스 를 통 해 현재 페이지 의 JScontext 를 얻 을 수 있 습 니 다.
_defaultContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
웹 뷰 에서 서로 다른 페이지 전환 이 이 루어 졌 다 면 새로운 페이지 로 딩 이 완 료 될 때마다 현재 기 록 된 JScontext 를 새로 고침 하여 JScontext 가 실시 간 으로 유효 하도록 해 야 합 니 다.
-(void)webViewDidFinishLoad:(UIWebView *)webView {
//
_defaultContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
}
2. Objective - C 에서 javeScript 를 호출 하 는 부분 은 비교적 간단 합 니 다. 두 가지 방법 으로 선택 할 수 있 습 니 다. 첫 번 째 방안 은 javeScript 가 제공 하 는 인터페이스, 전 참 을 직접 사용 할 수 있 습 니 다.
// JS login
[webView stringByEvaluatingJavaScriptFromString:@"login('username','password')"];
두 번 째 방안 은 JScontext 를 사용 하여 해당 하 는 인 터 페 이 스 를 가 져 온 후 사용
- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
또는 - (JSValue *)callWithArguments:(NSArray *)arguments;
[_defaultContext evaluateScript:@"login('username','password')"];
// JSContext JS ,
JSValue *JSfunc =_defaultContext[@"login"];
[JSfunc callWithArguments:@[@'username',@'password']];
3. javeScript 는 Objective - C 를 호출 합 니 다. 이것 은 javascriptcore 가 제공 하 는 JSexport 를 사용 해 야 합 니 다. Objective - C 에서 이 protocol 을 실현 하 는 방법 은 javeScript 에서 사용 할 수 있 는 인터페이스 입 니 다.JSexport 는 언어 간 에 제공 되 는 protocol 에 해당 합 니 다.
#include
// Protocol to list bindings
@protocol JSBridgeExport
// webview native
- (void)showTip:(NSString *)tip;
@end
@interface JSBridge : NSObject
@end
@implementation JSBridge
- (void)showTip:(NSString *)tip{
[TopWindow makeToast:tip];
}
@end
우선 현재 JScontext 에서 클래스 등록
- (JSValue )evaluateScript:(NSString )script;
을 한 다음 JS 에서 jsbridge 를 통 해 OC 가 제공 하 는 방법 인 터 페 이 스 를 호출 할 수 있 습 니 다.[_defaultContext evaluateScript:@"jsbridge.showTip(\"this is a tip from webview\")"];
존재 하 는 문제점: 첫 번 째 단계 에서 JScontext 를 새로 고침 한 것 처럼 서로 다른 페이지 를 새로 고침 한 후에 OC 를 JS 에 제공 하 는 방법 으로 등록 하여 현재 JS 환경 에서 제공 하 는 인터페이스 가 유효 하도록 확보 해 야 합 니 다.
-(void)webViewDidFinishLoad:(UIWebView *)webView {
//
// JSContext,
_defaultContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
_defaultContext[@"jsbridge"] = [[JSBridge alloc]init];
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.