目前JS調(diào)用OC主要分為兩種情況
1.JS里面直接調(diào)用方法;
2.JS里通過對象調(diào)用方法;
方式1:JS里面直接調(diào)用方法(使用block),該方式開發(fā)中一般不采用,故簡單代過
//網(wǎng)頁加載完成調(diào)用此方法
-(void)webViewDidFinishLoad:(UIWebView*)webView
{
? ? ? ?//iOS調(diào)用JS ,首先創(chuàng)建JSContext 對象(此處通過當(dāng)前webView的鍵獲取到j(luò)scontext)
? ? ? JSContext*context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
? ? ? //js調(diào)用iOS
? ? ? //第一種情況
? ? ? //其中test1就是js的方法名稱,賦給是一個block 里面是iOS代碼
? ? ?//此方法最終將打印出所有接收到的參數(shù),js參數(shù)是不固定的 我們測試一下就知道
? ? ?context[@"test1"] = ^() {
? ? ?NSArray*args = [JSContextcurrentArguments];
? ? ?for(id obj in args) {
? ? ?NSLog(@"%@",obj);
? ? ?}
};
? ? ? ? ?//首先準(zhǔn)備一下js代碼樊零,來調(diào)用js的函數(shù)test1 然后執(zhí)行
? ? ? ? //一個參數(shù)
? ? ? ? ?NSString*jsFunctStr=@"test1('參數(shù)1')";
? ? ? ? [contextevaluateScript:jsFunctStr];
? ? ? ? //二個參數(shù)
? ? ? ?NSString*jsFunctStr1=@"test1('參數(shù)a','參數(shù)b')";
? ? ? ?[contextevaluateScript:jsFunctStr1];
}
方式2:JS里通過對象調(diào)用方法
新建IOSBridge繼承自NSObject,然后導(dǎo)入JS交互類庫頭文件#import<JavaScriptCore/JavaScriptCore.h>
(1).首先創(chuàng)建一個實現(xiàn)了JSExport協(xié)議的協(xié)議
@protocol IOSBridgeProtocol
-(NSString*)getData:(NSString*)params;
-(NSString*)doAction:(NSString*)params;
@end
(2).定義代理屬性
@property(nonatomic, weak) id delegate;
(3).在IOSBridge.m文件中實現(xiàn)方法
-(NSString*)getData:(NSString*)params
{
? ? ? TTLog(@"調(diào)用了getData--- %@",params);
? ? ? ?return @"黃文濤";
}
-(NSString*)doAction:(NSString*)params
{
? ? ?TTLog(@"調(diào)用了doAction--- %@",params); ?
? ? ? return @"黃文濤";
}
(4).如何使用
導(dǎo)入#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