2016년 3월 18일 금요일

안드로이드에 addJavascriptInterface --> iOS swift ( Native와 Web javascript의 연동 방법)

미션은 다음과 같았다. 본인 인증을 하는 웹사이트에 어떤 키값을 주고 페이지 요청을 하면
본인 인증 관련 웹페이지가 처리되고 처리 결과를 네이티브 코드에서 받아서 처리 해야 한다.

iOS에서 Native와 Web간에 연동을 하기 위한 방법이 존재 할 것이다.
근데 문제는 모른다! 시간도 없다.

나에게 주어진건 안드로이드에서 Java스크립트와 연동을 하는 아주 짧은 코드!

그리고 아래와 같은 설명을 주었다.

이하 설명 —-

 mWebAppInterface = new WebAppInterface(this, this); // (컨텍스트, 콜백 인터페이스)
- 웹뷰 선언
        mWebView = (WebView) findViewById(R.id.webview);
- 웹뷰에 자바스크립트와 인터페이스 설정
        mWebView.getSettings().setJavaScriptEnabled(true);// javascript를 실행할 수 있도록 설정, 사용시 취약점 (주의)
        mWebView.addJavascriptInterface(mWebAppInterface, "Android"); //---- 여기가 중요#### 자바스크립트와 연결되는 부분

- 다음은 자바스크립트 동작에 반응 호출 연결부 클래스 파일 부분
public class WebAppInterface {
    Context mContext;
    private TaskWebCallback mWebCallback; 

    /** Instantiate the interface and set the context */
    WebAppInterface(Context c, TaskWebCallback webcallback) {
        this.mContext = c;
        this.mWebCallback = webcallback;
    }

/** Show a toast from the web page */ //다음은 인증후에 넘어오는 값
    @JavascriptInterface  
    public void showToast(String mycode, String mymsg, String requestnumber, 
    String responsenumber, String birthdate, String gender, String name, String nationalinfo) {
    //처리코드(고객idx),메시지,요청 번호,나신평응답 번호,생년월일(YYYYMMDD),성별(0:여성 / 1:남성),인증 고객 실명,국적 정보(0:내국인 / 1:외국인)

mWebCallback.mywebcallBack(mycode, mymsg, requestnumber, responsenumber, birthdate, gender, name, nationalinfo);   //이것은 웹뷰로 콜백 넘김

//나머지는 웹뷰에서 콜백으로 받아서 처리하면 끝. 
      }
}




위 내용을 안드로이드 개발자라면 팍하면 퍽하고 알아들을수 잇겠지만
난 모른다.! 난 자바도 모르고 안드로이드도 모른다.

 관련 내용은 

이런 사이트에서도 존재 하며 안드로이드와 자바 스크립트 간에 연결은 무척 쉬은듯 하다.

어째든 나의 미션은 자바 스크립트 속에 

showToast(String mycode, String mymsg, String requestnumber, 
    String responsenumber, String birthdate, String gender, String name, String nationalinfo)
의 형태의 함수가 불려지면 

네이티브에서 받아서 처리 해야 한다.

해결 방벙은 


이양반에 코드를 참고 해서 해결 하였다. 정말 고마운 분이다.
아래에 코드가 위 자바 코드에 showToast 인터페이스를 삽입하는 똑같은 모양이다.

import Foundation
import JavaScriptCore
import UIKit

@objc protocol MyExport : JSExport
{
    // 함수 이름과 함수 형태 그리고 _ 파라메터가 중요!
    func showToast(mycode :String, _ mymsg : String , _ requestnumber :String, _ responsenumber :String, _ birthdate :String, _ gender :String, _ name :String, _ nationalinfo :String)
}


class JSInterface : NSObject, MyExport
{
    func showToast(mycode: String, _ mymsg: String, _ requestnumber: String, _ responsenumber: String, _ birthdate: String, _ gender: String, _  name: String, _ nationalinfo: String) {
        print("\(mycode) \(mymsg) \(requestnumber) \(responsenumber) \(birthdate) \(gender) \(name) \(nationalinfo)”)
// 여긴 로직

}


import UIKit

class AuthViewController: UIViewController {
    
    var idx = ""  // 멤버 idx

    @IBOutlet weak var webView : KWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //노티 피케이션 등록 : 이 노티는 JSInterface에서 날리고 받으면 백 한다.
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "NotiAction", name: "AUTH_WEB_END", object: nil)


        
        let url = NSURL(string: "http://m.radeliver.co.kr/auth/app_checkplus_main.php")
        
        let request = NSMutableURLRequest(URL: url!)
        
        request.HTTPMethod = "POST"
        
        let userCredentials: String = "USERID=\(idx)"
        
        request.HTTPBody = userCredentials.dataUsingEncoding(NSUTF8StringEncoding)
        self.webView.addJavascriptInterface(JSInterface(), forKey: "Android")
        self.webView.loadRequest(request)
        
    }
}




여기에 살짝 로직을 넣어서 문제를 해결 하였다.

댓글 없음: