OC & JS 互調

JS調OC函數(shù)步驟:
  • 添加庫并導入頭文件#import <JavaScriptCore/JavaScriptCore.h>;
  • 定義協(xié)議JSObjectDelegate<JSExport>類,且不能用@optional修飾(原因未知?);
// 此協(xié)議必須遵守 JSExport
// 此協(xié)議中的方法就是 web 定義的方法名
@protocol JSObjectDelegate <JSExport>
#warning 為什么添加了 @optional 下面的方法不會掉用呢 ??
//@optional
- (void)callCamera;
- (void)share:(NSString *)shareContent;
@end
  • 展示webView的類遵守JSObjectDelegate協(xié)議;
    @interface BaseWebViewController()
    <JSObjectDelegate,UIWebViewDelegate>
    @property (nonatomic, strong) UIWebView *webView;
    @property (nonatomic, strong) JSContext *jsContext;
    @end

  • -(void)webViewDidFinishLoad:(UIWebView *)webView 方法中注入OC與web的橋梁對象為self;

      - (void)webViewDidFinishLoad:(UIWebView *)webView
    {
      // 網頁加載完成
      // 首先創(chuàng)建一個 JSContext 對象,通過當前的webView的鍵值獲取
      self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScri    ptContext"];
      // Toyun 為 web 和 OC 定義的 注入橋梁對象名Toyun,
      self.jsContext[@"Toyun"] = self;
      self.jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
          NSLog(@"異常信息:%@", exceptionValue);
      };
    }
    

JSObjectDelegate 方法實現(xiàn):
#pragma mark -- JSObjectDelegate
- (void)callCamera
{
NSLog(@" /// JS Call OC callCamera ///");

// 執(zhí)行完OC代碼,,有必要則回調 JS

//    JSValue *picCallback = self.jsContext[@"picCallback"];
//    [picCallback callWithArguments:@[@"images"]];

    NSString *jsFuncStr = @"picCallback('images')";
    [self.jsContext evaluateScript:jsFuncStr];
}

- (void)share:(NSString *)shareContent
{
    NSLog(@" /// JS Call OC Share: %@",shareContent);

   // 執(zhí)行完OC代碼,,有必要則回調 JS

//    JSValue *shareCallback = self.jsContext[@"shareCallback"];
//    [shareCallback callWithArguments:nil];

    NSString *jsFuncstr2 = @"shareCallback()";
    [self.jsContext evaluateScript:jsFuncstr2];  
}
OC回調JS的兩種方法:

1、 讀取回調web頁面的方法轉化為string,用jsContext調用:

NSString *jsFuncStr = @"picCallback('images')";
[self.jsContext evaluateScript:jsFuncStr];

2、將web頁面的方法名轉化為JSValue,再調用:

JSValue *picCallback = self.jsContext[@"picCallback"];
[picCallback callWithArguments:@[@"images"]];
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 隨著H5技術的興起,在iOS開發(fā)過程中,難免會遇到原生應用需要和H5頁面交互的問題。其中會涉及方法調用及參數(shù)傳值等...
    Chris_js閱讀 3,245評論 1 8
  • OC與JS交互之JavaScriptCore 本文摘抄自:https://hjgitbook.gitbooks.i...
    大沖哥閱讀 1,116評論 0 1
  • 本博客主要分以下幾個方面來介紹iOS中的JavaScriptCore JavaScriptCore簡介 JavaS...
    dullgrass閱讀 4,426評論 1 38
  • 跟原生開發(fā)相比,H5的開發(fā)相對來一個成熟的框架和團隊來講在開發(fā)速度和開發(fā)效率上有著比原生很大的優(yōu)勢,至少不用等待審...
    大沖哥閱讀 1,904評論 0 7
  • 這套協(xié)議在OC的Webview里面主要采用delegate的寫法,一般與前端交互不使用第三方框架的情況下,...
    沒有方向的石頭閱讀 2,799評論 2 1

友情鏈接更多精彩內容