iOS中JS和OC相互呼叫實現混合開發(JavaScriptCore)

weixin_33936401發表於2016-12-22

目前JS呼叫OC主要分為兩種情況

1.JS裡面直接呼叫方法;

2.JS裡通過物件呼叫方法;

方式1:JS裡面直接呼叫方法(使用block),該方式開發中一般不採用,故簡單代過

//網頁載入完成呼叫此方法

-(void)webViewDidFinishLoad:(UIWebView*)webView

{

       //iOS呼叫JS ,首先建立JSContext 物件(此處通過當前webView的鍵獲取到jscontext)

      JSContext*context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

      //js呼叫iOS

      //第一種情況

      //其中test1就是js的方法名稱,賦給是一個block 裡面是iOS程式碼

     //此方法最終將列印出所有接收到的引數,js引數是不固定的 我們測試一下就知道

     context[@"test1"] = ^() {

     NSArray*args = [JSContextcurrentArguments];

     for(id obj in args) {

     NSLog(@"%@",obj);

     }

};

         //首先準備一下js程式碼,來呼叫js的函式test1 然後執行

        //一個引數

         NSString*jsFunctStr=@"test1('引數1')";

        [contextevaluateScript:jsFunctStr];

        //二個引數

       NSString*jsFunctStr1=@"test1('引數a','引數b')";

       [contextevaluateScript:jsFunctStr1];

}


方式2:JS裡通過物件呼叫方法

新建IOSBridge繼承自NSObject,然後匯入JS互動類庫標頭檔案#import<JavaScriptCore/JavaScriptCore.h>

(1).首先建立一個實現了JSExport協議的協議

@protocol IOSBridgeProtocol

-(NSString*)getData:(NSString*)params;

-(NSString*)doAction:(NSString*)params;

@end

(2).定義代理屬性

@property(nonatomic, weak) id delegate;

(3).在IOSBridge.m檔案中實現方法

-(NSString*)getData:(NSString*)params

{

      TTLog(@"呼叫了getData--- %@",params);

       return @"黃文濤";

}

-(NSString*)doAction:(NSString*)params

{

     TTLog(@"呼叫了doAction--- %@",params);  

      return @"黃文濤";

}

(4).如何使用

匯入#import"IOSBridge.h"

然後,定義私有屬性

@property(nonatomic, strong) JSContext*context;

獲取JSContext

_context= [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

IOSBridge*iOSBridge = [[IOSBridge alloc] init];

self.context[@"IOSBridge"] = iOSBridge;

ok ,兩種方式都完成了,歡迎交流指正, 本人QQ:1334627194

相關文章