ocとjsの原生は交互に働きます.
6254 ワード
参照
総評価:
ocとjsのインタラクション、1.元の方式があって、oc調jsは簡単で、js調ocは面倒です.
2.iOS 7の前に、アップルはJavaScript Coreを出さない前に、業界では一般的にオープンソースライブラリWebView JavascriptBridgeとEasyJSWEbViewを採用して解決しています.原理はすべてブロックプロトコルによるパッケージです.
3.iOS 7の後、アップルはJavaScriptに対して公式のライブラリJavaScript Coreを出しました.Objective-CはWebKitのJavaScriptエンジンをカプセル化しました.WebViewから離れてJSコードを実行できます.だからiOS 7の後でインタラクションを実現したいです.JavaScripptCoreを採用するのもいい選択です.OST 7は互換性が必要ないという前提です.(今はiOS 7との互換性を強調していないと思いますが)
4.iOS 8が発表された時、アップルはまたWKWebViewを発売しました.以前のUICWebViewに対して脱皮した再構築を行いました.機能もより完備していて、安定性と性能も明らかに向上しました.
一つは、方法の相互調整(まず、どのような相互変調があっても、双方の協力が必要であり、バックグラウンドとの相互作用に似ている).
1.1 oc呼出js方法
対応するjs:
jsは面倒ではないです.リンクも入れます.
面倒なのは、oc側(つまり、jsから伝えられたurlを処理して、方法名とパラメータを分解し、OCでセレクタ方式を実行することで実現しますが、このような方式は最大でパラメータの個数が2つしか伝達できません.複数のパラメータが必要なら、データ構造の組織から入手できます.)
今まで知っていたように、ocはwebviewの内容を直接修正するのが便利ですが、jsは直接にocのインタフェースの内容を修正したいです.
2.1 oc修正webViewの内容
これらの操作は、このdelegateで行われているようです.
まず強調しなければならないのは、ウェブページが一つしかないような唯一のラベルがない限りです.
総評価:
ocとjsのインタラクション、1.元の方式があって、oc調jsは簡単で、js調ocは面倒です.
2.iOS 7の前に、アップルはJavaScript Coreを出さない前に、業界では一般的にオープンソースライブラリWebView JavascriptBridgeとEasyJSWEbViewを採用して解決しています.原理はすべてブロックプロトコルによるパッケージです.
3.iOS 7の後、アップルはJavaScriptに対して公式のライブラリJavaScript Coreを出しました.Objective-CはWebKitのJavaScriptエンジンをカプセル化しました.WebViewから離れてJSコードを実行できます.だからiOS 7の後でインタラクションを実現したいです.JavaScripptCoreを採用するのもいい選択です.OST 7は互換性が必要ないという前提です.(今はiOS 7との互換性を強調していないと思いますが)
4.iOS 8が発表された時、アップルはまたWKWebViewを発売しました.以前のUICWebViewに対して脱皮した再構築を行いました.機能もより完備していて、安定性と性能も明らかに向上しました.
一つは、方法の相互調整(まず、どのような相互変調があっても、双方の協力が必要であり、バックグラウンドとの相互作用に似ている).
1.1 oc呼出js方法
- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
例:if (sender.tag == 234) {
[self.webView stringByEvaluatingJavaScriptFromString:@"alertSendMsg('18870707070',' ')"];
}
//
直接ocはjsの関数コードを呼び出して、強いです!対応するjs:
// OC JS
function alertSendMsg(num,msg) {
alert(' :' + num + ',' + msg + '!!')
}
1.2 js ocを呼び出す方法(じゃ、お願いします.)jsは面倒ではないです.リンクも入れます.
//JS
function btnClick3() {
location.href = "rrcc://showSendNumber_msg_?13300001111&go climbing this weekend"
}
ps:「_」はOCメソッド名のコロンの置き換えとして使われます.面倒なのは、oc側(つまり、jsから伝えられたurlを処理して、方法名とパラメータを分解し、OCでセレクタ方式を実行することで実現しますが、このような方式は最大でパラメータの個数が2つしか伝達できません.複数のパラメータが必要なら、データ構造の組織から入手できます.)
#pragma mark - UIWebViewDelegate
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSLog(@"%@",NSStringFromSelector(_cmd));
//OC JS
NSString *absolutePath = request.URL.absoluteString;
NSString *scheme = @"rrcc://";
if ([absolutePath hasPrefix:scheme]) {
NSString *subPath = [absolutePath substringFromIndex:scheme.length];
if ([subPath containsString:@"?"]) {//1
if ([subPath containsString:@"&"]) {//
NSArray *components = [subPath componentsSeparatedByString:@"?"];
NSString *methodName = [components firstObject];
methodName = [methodName stringByReplacingOccurrencesOfString:@"_" withString:@":"];
// methodName @"showSendNumber:msg:"( OC (selector) , )
SEL sel = NSSelectorFromString(methodName);
NSString *parameter = [components lastObject];
NSArray *params = [parameter componentsSeparatedByString:@"&"];
if (params.count == 2) {
if ([self respondsToSelector:sel]) {
//OC (selector)
[self performSelector:sel withObject:[params firstObject] withObject:[params lastObject]];
}
}
} else {//1
NSArray *components = [subPath componentsSeparatedByString:@"?"];
NSString *methodName = [components firstObject];
methodName = [methodName stringByReplacingOccurrencesOfString:@"_" withString:@":"];
SEL sel = NSSelectorFromString(methodName);
NSString *parameter = [components lastObject];
if ([self respondsToSelector:sel]) {
[self performSelector:sel withObject:parameter];
}
}
} else {//
NSString *methodName = [subPath stringByReplacingOccurrencesOfString:@"_" withString:@":"];
SEL sel = NSSelectorFromString(methodName);
if ([self respondsToSelector:sel]) {
[self performSelector:sel];
}
}
}
return YES;
}
二,内容上の相互作用今まで知っていたように、ocはwebviewの内容を直接修正するのが便利ですが、jsは直接にocのインタフェースの内容を修正したいです.
2.1 oc修正webViewの内容
これらの操作は、このdelegateで行われているようです.
//
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
}
2.1.1を取るまず強調しなければならないのは、ウェブページが一つしかないような唯一のラベルがない限りです.
では、直接
を持ってきてもいいです.
<pre><code>NSString*title=[webView stingByEveraluating JavaScript FroomString:@「document.title」;
<pre><code>/取得URL
NSString*cur URL=[webView strigByEveraluating]@
がいくつも表示されていません.取れないです.
<h 1>2.1.2改
<pre><code>/属性値の変更
NSString*jsture sult=[webView streingByEveraluating JavaScript FroomString:@"document.getElements ByName('0)[0].カラー=red';;;;
<h 1>2.1.3削除
<pre><code>NSString*str=@「document.getElements ByClass Name('detail惼2')[0].remove()」;
[webView strigByEveraluting JavaScript FroomString:str]
<h 1>2.1.2改
<pre><code>/属性値の変更
NSString*jsture sult=[webView streingByEveraluating JavaScript FroomString:@"document.getElements ByName('0)[0].カラー=red';;;;
<h 1>2.1.3削除
<pre><code>NSString*str=@「document.getElements ByClass Name('detail惼2')[0].remove()」;
[webView strigByEveraluting JavaScript FroomString:str]
2.1.4
「増」と「調査」が見つからないようです.
<hr/>
最後の
パッケージのライブラリもありますが、アップルで提供するのがオススメですよね.