JavaScriptとObject-Cは相互作用します.


Object-C部分
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