iOS開發-基於原生JS與OC方法互相調用並傳值(附HTML代碼)


最近項目里面有有個商品活動界面,要與web端傳值,將用戶在網頁點擊的商品id 傳給客戶端,也就是js交互,其實再說明白一點就是方法的互相調用而已。

本文敘述下如何進行原生的JavaScript交互

本文包括JS調用OC方法並傳值,OC調用JS方法並傳值

本來想把html放進服務器里面,然后訪問,但是覺得如果html在本地加載更有助於理解,特把html放進項目里

HTML代碼

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. </head>
  6. <body>
  7. <div style="margin-top: 20px">
  8. <h2>JS與OC交互</h2>
  9. <input type="button" value="喚起本地方法(call)" onclick="tianbai.call()">
  10. </div>
  11. <div>
  12. <input type="button" value="喚起getCall:(NSString *)callString傳值" onclick="call()">
  13. </div>
  14.  
  15. <script>
  16.  
  17.  
  18.  
  19. var call = function()
  20. {
  21. var callInfo = JSON.stringify({"jianshu": "http://www.jianshu.com/users/55c8fdc3c6e7/latest_articles"});
  22. tianbai.getCall(callInfo);
  23. }
  24.  
  25. var Callback = function(str)
  26. {
  27. alert(str);
  28. }
  29. var alerCallback = function()
  30. {
  31. alert( '成功');
  32. }
  33. </script>
  34. </body>
  35. </html>

上面html的代碼:建立了兩個button

第一個button綁定了 tianbai.call() 方法,這里 tianbai 是一個對象,這個對象的作用下面OC代碼中會說明, tianbai.call() 代表 tianbai 對象調用 call() 方法

第二個button綁定了 call() 的方法,調用的是下面JavaScript中的 call() 方法,在 JavaScript 的 call() 里面,定義一個 callInfo 參數,方法中 tianbai.getCall(callInfo) 代表 tianbai 對象調用 getCall 方法並傳參數 callInfo ,下面兩個方法是OC調用JavaScript方法,其中Callback傳回str,alerCallback為OC僅調用JavaScript方法!

OC代碼

demo采用原生的JavaScriptCore類

引入三個名詞:

  1. JSContext:給JavaScript提供運行的上下文環境
  2. JSValue:JavaScript和Objective-C數據和方法的橋梁
  3. JSExport:這是一個協議,如果采用協議的方法交互,自己定義的協議必須遵守此協議

ViewController.h中的代碼(代碼過長,方法說明都在注釋里)

  1. #import <UIKit/UIKit.h>
  2. //導入頭文件
  3. #import <JavaScriptCore/JavaScriptCore.h>
  4.  
  5. @protocol JSObjcDelegate <JSExport>
  6. //tianbai對象調用的JavaScript方法,必須聲明!!!
  7. - ( void)call;
  8. - ( void)getCall:(NSString *)callString;
  9.  
  10. @end
  11. @interface ViewController : UIViewController<UIWebViewDelegate,JSObjcDelegate>
  12. @property (nonatomic, strong) JSContext *jsContext;
  13. @property (strong, nonatomic) UIWebView *webView;
  14.  
  15. @end

ViewController.m中的代碼(代碼過長,方法說明都在注釋里)

JavaScriptCore中web頁面調用原生應用的方法可以用Delegate或Block兩種方法,此文以按Delegate講解。

設置webView

  1. self.webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 20, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];
  2. self.webView.delegate = self;
  3. //從本地加載html文件
  4. NSString* path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
  5. NSURL* url = [NSURL fileURLWithPath:path];
  6. NSURLRequest* request = [NSURLRequest requestWithURL:url] ;
  7. [ self.webView loadRequest:request];
  8.  
  9. [ self.view addSubview:self.webView];

JavaScript的tianbai是一個對象,充當原生應用和web頁面之間的一個橋梁。用來調用方法

webview加載完成調用代理

  1. - ( void)webViewDidFinishLoad:(UIWebView *)webView {
  2.  
  3. // 設置javaScriptContext上下文
  4. self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
  5. //將tianbai對象指向自身
  6. self.jsContext[@"tianbai"] = self;
  7. self.jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
  8. context .exception = exceptionValue;
  9. NSLog(@"異常信息:%@", exceptionValue);
  10. };
  11. }

將對象指向自身后,如果調用 tianbai.call() 會響應下面的方法,OC方法中調用js中的Callback方法,並傳值

  1. - ( void)call{
  2. NSLog(@"call");
  3. // 之后在回調JavaScript的方法Callback把內容傳出去
  4. JSValue *Callback = self.jsContext[@"Callback"];
  5. //傳值給web端
  6. [Callback callWithArguments:@[ @"喚起本地OC回調完成"]];
  7. }

將對象指向自身后,如果調用 tianbai.getCall(callInfo) 會響應下面的方法,OC方法中僅調用JavaScript中的alerCallback方法

  1. - ( void)getCall:(NSString *)callString{
  2. NSLog(@"Get:%@", callString);
  3. // 成功回調JavaScript的方法Callback
  4. JSValue *Callback = self.jsContext[@"alerCallback"];
  5. [Callback callWithArguments: nil];
  6. }

將對象指向自身后,還可以向html注入js

  1. - ( void)alert{
  2.  
  3. // 直接添加提示框
  4. NSString *str = @"alert('OC添加JS提示成功')";
  5. [ self.jsContext evaluateScript:str];
  6.  
  7. }

Demo地址:https://github.com/QuTianbai/JavaScript


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM