JavaScriptとObject-Cは相互作用します.
5941 ワード
Object-C部分
1、フレーム導入と対応するヘッダファイル
JavaScript部分
WebViewでロードされたHTMLファイルのJSコード部分
次はポイント、ポイント、ポイントです.現在、熱更新を行うために、多くのAPPはiOSのシェルプラスH 5の内容を使用し始めました.私達のプロジェクトでH 5がバックグラウンドデータを要求する時、JSとOCのインタラクションを通じて元の生態コードのいくつかのパラメータを取得する必要があります.この時重要な問題が発生しました.問題の説明:ページAとページB、両方のページはネットワーク要求が必要です.ネットワーク要求はバックグラウンドに送るパラメータは元の生態のいくつかのパラメータが必要です.ウェブビューでページAを読み込むと、データは完璧に現れます.ジャンプボタンをクリックして、ページBにジャンプします.データが現れていないことが分かりました.そして、ページAバックグラウンドで取得したデータもないことが分かりました.ページAはデータキャッシュをしていないので、ページデータは毎回、ネットワーク要求により、バックグラウンドで取得しなければならない.これは一番重要ではないです.テストした結果、データが得られない一番重要な原因は、ジャンプページB及びリターンページAはJSとOCの相互作用が必要です.JSはOCを呼び出す方法で元の生態パラメータを取得します.その後のページジャンプ及びネットワーク要求は、いずれも対象testがJSローディングに注入される前にJSコードのローディングが完了し、対象testがまだ注入されていないため、元の生態法の起動に失敗しました.解決方法:JSコードにおいて、元の生態パラメータを取得する方法及びネットワーク要求方法を遅延方法に配置する.コードの例は以下の通りです.
1、フレーム導入と対応するヘッダファイル
JavaScriptCore.framework //
#import //
2、クラスファイルを作成し、NSObject
3を継承し、クラスJSAndOCMutually.h
コード作成プロトコルJSAndOCMutuallyProtocol
を作成し、プロトコルは
に従って作成されたクラスのコードの例を以下に示す.#import
@protocol JSAndOCMutuallyProtocol <JSExport>
// JavaScript Object-C , JS
//
-(void)FunctionNoParameter;
//
-(void)FunctionOneParameter:(NSString *)message;
//
-(void)FunctionTwoParametersWithFirstParameter:(NSString *)message1 SecondParameter:(NSString *)message2;
@end
@interface JSAndOCMutually : NSObject <JSAndOCMutuallyProtocol>
@end
4、実装クラスJSAndOCMutually.h
は、プロトコルに対応する方法コードの例に従う.@implementation JSAndOCMutually
-(void)FunctionNoParameter{
NSLog(@"this is iOS FunctionNoParameter");
}
-(void)FunctionOneParameter:(NSString *)message{
NSLog(@"this is iOS FunctionOneParameter,FirstParameter=%@",message);
}
-(void)FunctionTwoParametersWithFirstParameter:(NSString *)message1 SecondParameter:(NSString *)message2{
NSLog(@"this is iOS FunctionTwoParametersWithFirstParameter,FirstParameter=%@ SecondParameter=%@",message1,message2);
}
@end
5、WebViewのエージェントに必要なコード5.1と、
に従うViewControllerに作成されたクラスヘッダファイルとヘッダファイルを導入する.#import
#import "JSAndOCMutually.h"
5.2、UIWebViewDelegate
エージェントの終了ロード方法において、以下のコードを作成し、 - (void)webViewDidFinishLoad:(UIWebView *)webView{
JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
JSAndOCMutually *jsandOC = [JSAndOCMutually new];
context[@"test"] = jsandOC; // test JavaScript
// block
// context[@"test"] = ^() {
// block , 。
// };
// JS OC
// NSString *jsStr1=@"test.TestNOParameter()";
// [context evaluateScript:jsStr1];
}
これでObject-C部分のコードは基本的に終了し、続いてJavaScriptに注入された「test」オブジェクトによって方法の呼び出しが行われます.JavaScript部分
WebViewでロードされたHTMLファイルのJSコード部分
var message1 = "MeaasgeOne";
var message2 = "MeaasgeTwo";
//
window.test.FunctionNoParameter();
//
window.test.FunctionOneParameter(message1);
//
window.test.FunctionTwoParametersWithFirstParameter SecondParameter(message1,message2);
// , 。
これで簡単なJSとOCの相互作用が終わります.次はポイント、ポイント、ポイントです.現在、熱更新を行うために、多くのAPPはiOSのシェルプラスH 5の内容を使用し始めました.私達のプロジェクトでH 5がバックグラウンドデータを要求する時、JSとOCのインタラクションを通じて元の生態コードのいくつかのパラメータを取得する必要があります.この時重要な問題が発生しました.問題の説明:ページAとページB、両方のページはネットワーク要求が必要です.ネットワーク要求はバックグラウンドに送るパラメータは元の生態のいくつかのパラメータが必要です.ウェブビューでページAを読み込むと、データは完璧に現れます.ジャンプボタンをクリックして、ページBにジャンプします.データが現れていないことが分かりました.そして、ページAバックグラウンドで取得したデータもないことが分かりました.ページAはデータキャッシュをしていないので、ページデータは毎回、ネットワーク要求により、バックグラウンドで取得しなければならない.これは一番重要ではないです.テストした結果、データが得られない一番重要な原因は、ジャンプページB及びリターンページAはJSとOCの相互作用が必要です.JSはOCを呼び出す方法で元の生態パラメータを取得します.その後のページジャンプ及びネットワーク要求は、いずれも対象testがJSローディングに注入される前にJSコードのローディングが完了し、対象testがまだ注入されていないため、元の生態法の起動に失敗しました.解決方法:JSコードにおいて、元の生態パラメータを取得する方法及びネットワーク要求方法を遅延方法に配置する.コードの例は以下の通りです.
setTimeout(function () {
window.test.TestTowParameterSecondParameter(message1,message2);
}, 100);
// 100 , , iOS JS 。
https://github.com/FlyingKuiKui/JSMutuallObjectC.git