반응형

1.  웹에서 안드로이드 함수를 호출하기 위해서는 JsBridge를 이용해야한다.

    안드로이드와 Ios 와 협업해서 일을 할때는 안드로이드 JsBridge에 맞춰서 진행하는게 서로 원만하게 해결하는 방법인것 같다.


2. ios 는 예전 방식으로 스키마 형식으로 웹에서 호출하면 ios 에서 해당 스키마를 파싱해서 원하는 함수를 호출하는 형태였다. 하지만, Ios 7 이상으로는 안드로이드에서 쓰는 JsBridge와 같은 방식으로 호출이 가능해졌다. 핵심 키워드는 JSExport 가 되겠다.


3. 웹 형태는 아래와 같다.

    (아래와 같이 체크 박스를 누르면,  ios 에 존재하는 keepLogin 함수를 호출하게 된다.)


<html>


  <head>


    function check(checkBox){

JSBridge.keepLogin(checkBox .checked);

    }


  </head>

  <body>

    웹에서 ios의 keepLogin 함수를 호출합니다.  <br>

    <input type="checkbox" onClick="check(this)" />

  </body>


</html>



4. 여기서 꼭 봐두어야할 곳은 JSBridge이다. JSBridge는 ios 또는 android 간의 통신을 하기 위해 서로 협의해서 정의한 이름으로 생각하면된다.

    android와 Ios 개발자와 이야기할때 JSBridge 대신해서 들어갈 이름부터 정의부터 한뒤, 메소드 이름을 서로 맞추면된다.

   (JSBridge는 필자가 정한 이름이다.)

 


5. Ios 구조는 


    LoginViewController.h,

    LoginViewController.m 

    UIWebView

    

    으로 이루어졌다고 치고, 웹뷰는 WKWebView 를 쓰지 않고, UIWebView를 쓰도록 한다.



6. LoginViewController.h


#import <UIKit/UIKit.h>

#import <JavaScriptCore/JavaScriptCore.h>  // JSExport를 사용하기 위해서는 반드시 필요하다.


@protocol JavaScriptExportDelegate <JSExport>


- (void)keepLogin : (BOOL) checked; // 웹에서 ios 함수를 호출하기 위한 함수를 정의한다.


@end


@interface LoginViewController : UIViewController <JavaScriptExportDelegate>


@property(weak, nonatomic) IBOutlet UIWebView *webView;

@property (nonatomic, strong) JSContext *jsContext; // JSBridge 이름을 설정하는등, 중요한 변수이다.


@end


7. LoginViewController.m


#import "LoginViewController.h"


@interface LoginViewController () <UIWebViewDelegate>


@end


@implementation LoginViewController


- (void)viewDidLoad {


    [super viewDidLoad];

    

    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"로드할 웹 URL"]];


    [self.webView loadRequest:urlRequest];

    

    // 델리게이트를 등록한다.

    [self.webView setDelegate:self];

    

}



// 웹뷰 로드가 모두 끝나면, 웹과 서로 통신하기 위한 준비를 한다.

(void)webViewDidFinishLoad:(UIWebView *)webView {

    

    /** 웹에서 IOS로 함수를 호출하기 위한 준비 단계 start **/

    self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

   

    LoginViewController *model  = [[LoginViewController allocinit];

    self.jsContext[@"JSBridge"] = model;  // 이곳에 Android와 협의해서 정한 이름을 넣어준다.

    model.jsContext = self.jsContext;

    model.webView = self.webView;

    

    self.jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {

        context.exception = exceptionValue;

        NSLog(@"예외발생:%@", exceptionValue);

    };

     /** 웹에서 IOS로 함수를 호출하기 위한 준비 단계 end **/

   

    

}

// 웹에서 체크 버튼을 누르면 이 메소드가 호출된다.

- (void)keepLogin : (BOOL) checked{

    NSLog(checked ? @"Auto login : Yes" : @"Auto login : No");

}



8. 이제 로그를 확인하면,  Auto login : Yes 혹은 Auto login : No  가 호출되면 정상적으로 적용된것이다.





반응형