JS 와 APP 네 이 티 브 컨트롤 의 상호작용 에 대한 자세 한 설명

“핫 업데이트','핫 플레이 스'는 혼합 식 으로 개 발 된 어린이 신발 이 낯 설 지 않 을 것 이 라 고 믿 습 니 다.그러면 앱 은 업그레이드 할 때마다 앱 앱 앱 스토어 에서 발표 하 는 것 을 어떻게 피 할 수 있 습 니까?여기 서 혼합 식 개발 의 개념 을 사 용 했 습 니 다.전자상거래 사이트 에 특히 중요 합 니 다.매번 하나의 활동 을 발표 할 때마다 현 버 전 을 발표 할 수 없습니다.물론 안 드 로 이 드 에 게 는 괜 찮 은 편 이지 만 Ios 에 대해 서 는?애플 앱 스토어 가 매번 심사 하 는 시간 이 기본적으로 1~2 주 인 데 이 는 한 판 촉 행사 에 있어 심사 시간 이 너무 길다.그리고 혼합 식 개발 은 이 문 제 를 해결 할 수 있 습 니 다.기본 적 인 원 리 는 네 이 티 브 컨트롤 을 통 해 앱 의 주체 구 조 를 실현 하고 H5 를 통 해 해당 하 는 페이지 를 개발 합 니 다.그러면 매번 에 이 벤트 를 발표 할 때마다 서버 에서 이 벤트 를 발표 하면 모든 설치 사용자 가 업그레이드 하지 않 으 면 최신 활동 을 조회 할 수 있 습 니 다.자 바스 크 립 트 와 앱 네 이 티 브 컨트롤 의 상호작용 을 어떻게 실현 하 는 지 오늘 여러분 께 공유 해 드 리 겠 습 니 다.
1.먼저 JS 와 Android 의 상호작용 을 소개 합 니 다.먼저 Android 프로젝트 의 디 렉 터 리 구 조 를 보 여 드 리 겠 습 니 다.

JSobject.java 파일 은 JS 가 안 드 로 이 드 네 이 티 브 컨트롤 을 호출 하 는 방법 을 봉 인 했 습 니 다.MainActivity.java 는 WebView 컨트롤 을 호출 하여 웹 페이지 로 딩 을 실현 하고 컨트롤 을 JS 방법 으로 호출 하 는 패키지 입 니 다.test.html 는 우리 가 불 러 온 HTML 페이지 입 니 다.다음은 실현 을 구체 적 으로 살 펴 보 자.
MainActivity.java

package com.chinaonenet.mywebview;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.Button;
/**
 * SuppressLint      !!!
 *         ,   JS     Android     
 */
@SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends Activity {
 private Button button1,button2;
 private WebView mWebView;
 private MyWebViewClient WVClient;
 private WebSettings webSettings;
 private MyWebChromeClient chromeClient;
 //    js  Android    
 private JSObject jsobject;
 //    
 private Handler mHandler = new Handler();
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 init();
 initView();
 setButton();
 }
 private void setButton() {
 //    
 button1.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
  mHandler.post(new Runnable() {
   @Override
   public void run() {
   mWebView.loadUrl("javascript:showNoMessage()");
   }
  });
  }
 });
 //    
 button2.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
  mHandler.post(new Runnable() {
   @Override
   public void run() {
   mWebView.loadUrl("javascript:showMessage('   JS    ')");
   }
  });
  }
 });
 }
 private void init() {
 mWebView = (WebView) findViewById(R.id.webview);
 button1 = (Button)findViewById(R.id.button1);
 button2 = (Button)findViewById(R.id.button2);
 WVClient = new MyWebViewClient();
 chromeClient = new MyWebChromeClient();
 jsobject = new JSObject(MainActivity.this); 
 }
 private void initView() {
 webSettings = mWebView.getSettings();
 webSettings.setJavaScriptEnabled(true);
 webSettings.setBuiltInZoomControls(true);
 webSettings.setSavePassword(false);
 //       ,  js    
 webSettings.setUserAgentString("mac os");
 webSettings.setDefaultTextEncodingName("utf-8");
 //    js  
 mWebView.loadUrl("file:///android_asset/test.html");
 mWebView.setWebViewClient(WVClient);
 mWebView.setWebChromeClient(chromeClient);
 //       android,   JS    Android       ID   
 mWebView.addJavascriptInterface(jsobject, "android");
 }
}
페이지 설정 파일(activitymain.xml)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
tools:context="com.chinaonenet.mywebview.MainActivity" >
 <Button
 android:id="@+id/button1"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_alignParentLeft="true"
 android:text="  " />
 <Button
 android:id="@+id/button2"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_alignParentRight="true"
 android:text="  " />
 <WebView
 android:id="@+id/webview"
 android:layout_width="wrap_content"
 android:layout_height="match_parent"
 android:layout_alignParentLeft="true"
 android:layout_alignParentRight="true"
 android:layout_below="@+id/button2" />
 <TextView
 android:id="@+id/textView1"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_alignBaseline="@+id/button1"
 android:layout_alignBottom="@+id/button1"
 android:layout_centerHorizontal="true"
 android:text="js android  " />
</RelativeLayout>
JSObject.java

package com.chinaonenet.mywebview;
import org.json.JSONArray;
import org.json.JSONException;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.webkit.JavascriptInterface;
import android.widget.Toast;
/**
 * JS  android   
 * @JavascriptInterface      
 */
public class JSObject {
 private Context context;
 public JSObject(Context context){
 this.context = context;
 }
 //js      
 @JavascriptInterface
 public void callNull(){
 Toast.makeText(context, "JsCallAndroid", Toast.LENGTH_SHORT).show();
 }
 //js      
 @JavascriptInterface
 public void callMessage(String data){
 Toast.makeText(context, data, Toast.LENGTH_SHORT).show();
 }
 //js      ,    :JSON
 @JavascriptInterface
 public void callJson(String data) throws JSONException{
 JSONArray jsonArray = new JSONArray(data);
 Toast.makeText(context, jsonArray.toString(), Toast.LENGTH_SHORT).show();
 }
 //js      ,    :JSON,        
 @JavascriptInterface
 public void callPhone(String data){
 context.startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + data)));
 }
}
불 러 온 HTML 페이지:

<style>
 .main-wrap ul {
 width: 100%;
 display: inline-block;
 padding-top: 20px;
 }
 .main-wrap ul li {
  float: left;
  width: 100%;
  height: 40px;
  line-height: 40px;
  font-size: 14px;
  margin-bottom: 20px;
  background-color: #00D000;
  color: #fff;
  text-align: center;
  cursor: pointer;
 }
  .main-wrap ul li:active {
  opacity: 0.8;
  }
</style>
<div class="main-wrap">
 <ul class="postAndroid">
 <li onclick="jsCallAndroid('1')">          </li>
 <li onclick="jsCallAndroid('2')">         </li>
 <li onclick="jsCallAndroid('3')"> JSON           </li>
 <li onclick="jsCallAndroid('4')">       </li>
 </ul>
</div>
<script>
 function jsCallAndroid(rel) {
 switch(rel){
  case "1":
  android.callNull();
  break;
  case "2":
  android.callMessage("javaScript  Android  ");
  break;
  case "3":
  var json = "[{\"name\":\"   \", \"phone\":\"4008366069\"}]";
  android.callJson(json);
  break;
  case "4":
  android.callPhone("4008366069");
  break;
 }
 }
 function showNoMessage() {
 alert("Android    ");
 }
 function showMessage(data) {
 alert("Android    -data:" + data);
 }
</script>
전 화 를 걸 수 있 는 기능 이 필요 하기 때문에 AndroidManifest.xml 파일 에 전 화 를 걸 수 있 는 권한 을 추가 해 야 합 니 다.<uses-permission android:name="android.permission.CALL_PHONE" />물론 이 페이지 는 로 컬 페이지 입 니 다.네트워크 페이지 를 불 러 올 때 요청 네트워크 권한 을 추가 해 야 합 니 다.<uses-permission android:name="android.permission.INTERNET" />JS 와 Android 네 이 티 브 컨트롤 이 서로 호출 되 는 것 에 대한 지식 을 소개 하고 마지막 으로 DEML 다운로드 주 소 를 첨부 합 니 다.http://pan.baidu.com/s/1eSza8Pc
2.JS 와 IOS 의 네 이 티 브 상호작용 은 여기 서 개발 언어 는 Swift 언어 를 사용 하고 버 전 은 2.2 입 니 다.우선 프로젝트 디 렉 터 리 구조:

ViewController.swift

import UIKit
import JavaScriptCore
class ViewController: UIViewController {
 var context = JSContext()
 var jsContext: JSContext?
 @IBOutlet weak var webView: UIWebView!
 override func viewDidLoad() {
 super.viewDidLoad()
 webView.delegate = self//   webView
 loadJS()
 }
 /**
 *  html  
 */
 func loadJS() {
 let str = NSBundle.mainBundle().pathForResource("test", ofType: "html")
 let request = NSURLRequest(URL: NSURL(string: str!)!)
 webView.loadRequest(request)
 }
 //Swift   JS    (   )
 @IBAction func swift_js_pargram(sender: AnyObject) {
 self.context.evaluateScript("Swift_JS1()")
 //self.webView.stringByEvaluatingJavaScriptFromString("Swift_JS1()") //      
 }
 //Swift   JS    (   )
 @IBAction func swift_js_nopargam(sender: AnyObject) {
 self.context.evaluateScript("Swift_JS2('Ios' ,'Swift')")
 //self.webView.stringByEvaluatingJavaScriptFromString("Swift_JS2('oc','swift')") //      
 }
 //js  Swift  (  )
 func menthod1() {
 print("JS      swift  ")
 let title = "    ";
 let msg = "JS      swift  ";
 //      
 let alert = UIAlertController(title: title, message: msg, preferredStyle: .Alert)
 //    
 alert.addAction(UIAlertAction(title: "ok", style: .Default, handler: nil))
 //     
 self.presentViewController(alert, animated: true, completion: nil)
 }
 //js  Swift  (   )
 func menthod2(str1: String, str2: String) {
 print("JS      swift  :   \(str1),\(str2)")
 //      
 let alert = UIAlertController(title: str1, message: str2, preferredStyle: .Alert)
 //    
 alert.addAction(UIAlertAction(title: "ok", style: .Default, handler: nil))
 //     
 self.presentViewController(alert, animated: true, completion: nil)
 }
 func webView(webView: UIWebView, didFailLoadWithError error: NSError) {
 print(error)
 }
}
//js  Swift    
extension ViewController: UIWebViewDelegate {
 func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
 let str = NSBundle.mainBundle().pathForResource("test", ofType: "html")
 let request = NSURLRequest(URL: NSURL(string: str!)!)
 let connecntion = NSURLConnection(request: request, delegate: self)
 connecntion?.start()
 return true
 }
 func webViewDidStartLoad(webView: UIWebView) {
 print("webViewDidStartLoad----")
 }
 func webViewDidFinishLoad(webView: UIWebView) {
 self.context = webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") as! JSContext
 //JS      swift  ---menthod1
 let temp1: @convention(block) () ->() = {
  self.menthod1()
 }
 //forKeyedSubscript:   JS     
 self.context.setObject(unsafeBitCast(temp1, AnyObject.self), forKeyedSubscript: "test1")
 //JS      swift  ---menthod2
 let temp2: @convention(block) () ->() = {
  let array = JSContext.currentArguments()//     array     JSValue  
  for object in array {
  print("  :" + object.toString())
  }
  self.menthod2(array[0].toString(), str2: array[1].toString())
 }
 //forKeyedSubscript:   JS     
 self.context.setObject(unsafeBitCast(temp2, AnyObject.self), forKeyedSubscript: "test2")
 //       
 let model = JSObjCModel()
 model.controller = self
 model.jsContext = context
 self.jsContext = context
 //     OCModel       JS ,JS     OCModel           。
 self.jsContext?.setObject(model, forKeyedSubscript: "OCModel")
 let url = NSBundle.mainBundle().URLForResource("test", withExtension: "html")
 self.jsContext?.evaluateScript(try? String(contentsOfURL: url!, encoding: NSUTF8StringEncoding));
 self.jsContext?.exceptionHandler = {
  (context, exception) in
  print("exception @", exception)
 }
 }
}
@objc protocol JavaScriptSwiftDelegate: JSExport {
 func callSystemCamera()
 func showAlert(title: String, msg: String)
 func callWithDict(dict: [String: AnyObject])
 func jsCallObjcAndObjcCallJsWithDict(dict: [String: AnyObject])
}
//js  Swift    
@objc class JSObjCModel: NSObject, JavaScriptSwiftDelegate {
 weak var controller: UIViewController?
 weak var jsContext: JSContext?
 //JS    Swift         
 func callSystemCamera() {
 print("js call objc method: callSystemCamera");
 let jsFunc = self.jsContext?.objectForKeyedSubscript("jsFunc");
 jsFunc?.callWithArguments([]);
 }
 //JS    Swift  
 func showAlert(title: String, msg: String) {
 print("js call objc method: showAlert, title: %@", title, " msg: %@", msg)
 dispatch_async(dispatch_get_main_queue()) { () -> Void in
  let alert = UIAlertController(title: title, message: msg, preferredStyle: .Alert)
  alert.addAction(UIAlertAction(title: "ok", style: .Default, handler: nil))
  self.controller?.presentViewController(alert, animated: true, completion: nil)
 }
 }
 //JS    Swift  
 func callWithDict(dict: [String : AnyObject]) {
 print("js call objc method: callWithDict, args: %@", dict)
 let alert = UIAlertController(title: "    ", message: "         ", preferredStyle: .Alert)
 alert.addAction(UIAlertAction(title: "ok", style: .Default, handler: nil))
 self.controller?.presentViewController(alert, animated: true, completion: nil)
 }
 //JS    Swift         
 func jsCallObjcAndObjcCallJsWithDict(dict: [String : AnyObject]) {
 print("js call objc method: jsCallObjcAndObjcCallJsWithDict, args: %@", dict)
 let jsParamFunc = self.jsContext?.objectForKeyedSubscript("jsParamFunc");
 let dict = NSDictionary(dictionary: ["age": 2, "height": 178, "name": "   "])
 jsParamFunc?.callWithArguments([dict])
 }
}
extension ViewController: NSURLConnectionDelegate,NSURLConnectionDataDelegate {
 func connection(connection: NSURLConnection, didReceiveData data: NSData) {
 print("didReceiveData\(data)")
 }
 func connection(connection: NSURLConnection, willSendRequest request: NSURLRequest, redirectResponse response: NSURLResponse?) -> NSURLRequest? {
 print("request:\(request)response:\(response)")
 return request
 }
 func connection(connection: NSURLConnection, didFailWithError error: NSError) {
 
 }
}
//MARK: - allowsAnyHTTPSCertificateForHost
extension NSURLRequest {
 static func allowsAnyHTTPSCertificateForHost(host: String) -> Bool {
 return true
 }
}
test.html

<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 <title>JSAndIos</title>
 </head>
 <style>
 .main-wrap ul {
  width: 100%;
  display: inline-block;
  padding-top: 20px;
 }
 .main-wrap ul li {
  float: left;
  width: 100%;
  height: 40px;
  line-height: 40px;
  font-size: 14px;
  margin-bottom: 20px;
  background-color: #00D000;
  color: #fff;
  text-align: center;
  cursor: pointer;
 }
 .main-wrap ul li:active {
  opacity: 0.8;
 }
 </style>
 <body bgcolor="#dddd">
  <div class="main-wrap">
  <ul class="postAndroid">
   <li onclick="JS_Swift1()">          (    )</li>
   <li onclick="JS_Swift2()">         (    )</li>
   <li onclick="JS_Swift3()">          ,       (    )</li>
   <li onclick="JS_Swift4()">         (    )</li>
   <li onclick="JS_Swift5()">             (    )</li>
   <li onclick="JS_Swift6()">             ,       (    )</li>
  </ul>
  </div>
  <script>
  function Swift_JS1() {
  alert("Swift  Js    ");
  }
  function Swift_JS2(name,msg) {
  alert("Swift  Js    ,name:"+name+";mes:"+msg);
  }
  function JS_Swift1() {
  test1();
  }
  function JS_Swift2() {
  test2('JsCallSwift', 'Js  Swift  ');
  }
  function JS_Swift3() {
  OCModel.callSystemCamera();
  }
  //js  Swift  ,      
  function jsFunc() {
  alert('JS  Swift  ,        ');
  }
  function JS_Swift4() {
  OCModel.showAlertMsg('js send title', 'js send message');
  }
  function JS_Swift5() {
  OCModel.callWithDict({ 'name': 'testname', 'age': 10, 'height': 170 });
  }
  function JS_Swift6() {
OCModel.jsCallObjcAndObjcCallJsWithDict({ 'name': 'testname', 'age': 10, 'height': 170 });
  }
  //   ,  JS  ,   OC  JS   ,     。
  function jsParamFunc (argument) {
  alert("JS  Swift  ,        ---name:"+argument['name'] + " age:" + argument['age']);
  }
  </script>
 </body>
</html>
자,JS 와 Ios 네 이 티 브 컨트롤 간 에 서로 호출 되 는 주요 내용 을 공유 하 였 습 니 다.DEML 다운로드 주소:https://pan.baidu.com/s/1gfJXr83
JS 와 Android,IOS 네 이 티 브 컨트롤 이 서로 호출 되 는 것 에 대한 지식 을 공유 하 겠 습 니 다.댓 글 토론 을 환영 하고 서로 공부 하 겠 습 니 다.
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

좋은 웹페이지 즐겨찾기