JSとOCの簡単なインタラクション

9842 ワード

一、説明
最近はプロジェクトでこの内容が使われていて、その中のインタラクションを理解するのは難しくありませんが、初めての接触は大変です.后で开発するために更に简単で、今日特に自分の理解と认识を记录して、ハハハ、大神は喷かないでください!
二、XcodeでHTML 5ファイルを新規作成し、簡単なラベル言語を書く



    
          
    


    
    
        var  btn = document.getElementsByTagName("button")[0]
        btn.onclick = function jump() {
            //message             ,   NSNumber, NSString, NSDate, NSArray,NSDictionary, and NSNull  。
            var message = {"method":"H5       "};
            
            //message             ,   NSNumber, NSString, NSDate, NSArray,NSDictionary, and NSNull  。
            window.webkit.messageHandlers.Weixin.postMessage(message);
            // window.webkit.messageHandlers.app      .postMessage(  )
            //webApp app      , html5 ios     ,     
     }
    function insertimage(imagePath) {
        var imageElement = document.createElement('img');
        imageElement.setAttribute('src', imagePath);
        document.body.appendChild(imageElement)
        return imagePath;
    }
    




三、新しいHTML 5ファイルをロードする
#import "ViewController.h"
#import 
@interface ViewController (){
    WKWebView*webview;
}
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
       UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    btn.backgroundColor=[UIColor yellowColor];
    [btn setTitle:@"  " forState:UIControlStateNormal];
    [btn sizeToFit];
    [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(chooseiamge) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *item=[[UIBarButtonItem alloc]initWithCustomView:btn];
    self.navigationItem.rightBarButtonItem=item;
    
    
    self.title=@"    H5  ";
    
   //1.   webview     ,   wkwebview     ,          webview   
    WKWebViewConfiguration *config =[[WKWebViewConfiguration alloc]init];
    
    //2.      hybridDemo handler  ,    js   。
    [config.userContentController addScriptMessageHandler:self name:@"Weixin"];
    /* js  :window.webkit.messageHandlers.Weixin.postMessage(message)  webApp    name  ,
     */
    
    //3.     webview
    webview=[[WKWebView alloc]initWithFrame:CGRectMake(0, 0, 375, 667) configuration:config];
    webview.navigationDelegate=self;
    webview.UIDelegate=self;
    [self.view addSubview:webview];
 
   // [webview loadHTMLString:@"" baseURL:@""];
    
    //    html    
   //[webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:63342/untitled1/www.html?_ijt=bkn71lf5uie4574aclhomlufoa"]]];
    
    [webview loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle]URLForResource:@"HLT" withExtension:@"htm"]]];
    

この时に运転して、あなたはとても丑い1つのホームページを见ることができて、ははは、十分に使えばいいです.
四、インタラクションの開始
4.1、JS呼び出しOC
簡単:Webページの赤いボタンをクリックして次のインタフェースにジャンプする必要があります
a.JS側の操作:上記HTML 5 function jump(){}に以下のコードを追加する:window.webkit.messageHandlers.webApp.postMessage(message);
!-- WKwebview JS   app-->
   
      btn.onclick = function jump() {
            //message             ,   NSNumber, NSString, NSDate, NSArray,NSDictionary, and NSNull  。
            var message = {"method":"H5       "};
            
            //message             ,   NSNumber, NSString, NSDate, NSArray,NSDictionary, and NSNull  。
            window.webkit.messageHandlers.Weixin.postMessage(message);
            // window.webkit.messageHandlers.app      .postMessage(  )
            //webApp app      , html5 ios     ,     
     }
     

以上のコードの意味は、赤いボタンをクリックした後、webkitにパラメータ付きのメッセージを送信し、ios側にいくつかのことを実行するように通知することです.
b.IOS側の操作:ホームページのボタンのクリックを傍受し、ローカルの方法を呼び出して傍受を登録する

#import "ViewController.h"
#import "SecViewController.h"
#import 
@interface ViewController (){
    WKWebView*webview;
}
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    self.title=@"    H5  ";
   //1.   webview     ,   wkwebview     ,          webview   
    WKWebViewConfiguration *config =[[WKWebViewConfiguration alloc]init];
    
    //2.      hybridDemo handler  ,    js   。
    [config.userContentController addScriptMessageHandler:self name:@"@"Weixin"];
    /* js  :window.webkit.messageHandlers.webApp.postMessage(message)  webApp    name  ,
     */
    //3.          webview
    webview=[[WKWebView alloc]initWithFrame:CGRectMake(0, 0, 375, 667) configuration:config ];
    [self.view addSubview:webview];
    
    //4.  webview
     [webview loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle]URLForResource:@"HLT" withExtension:@"htm"]]];
}

メソッド実装
//  js   
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
    
    NSDictionary *dic = message.body;
    
    NSString *method = [dic objectForKey:@"method"];
    if ([method isEqualToString:@"H5       "]) {
        SecViewController *secontoller=[[SecViewController alloc]init];
        [self.navigationController pushViewController:secontoller animated:YES];
    }
}

js側がメッセージを送信する限り,この方法を実装するとメッセージを受信し,異なるパラメータ値に基づいて異なる方法を実装し,両者のインタラクションを実現することができる.
4.2、OC呼び出しjs
OC  js    ,      - (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError * _Nullable error))completionHandler;
#pragma mark -     
- (void)chooseiamge{
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]){
        picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        picker.delegate = self;
        [self presentViewController:picker animated:YES completion:nil];
    }
}
#pragma mark - OC  JS
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSLog(@"        ");
    NSString *urlstring=[info objectForKey:@"UIImagePickerControllerImageURL"];
    NSString *javascripstring=[NSString stringWithFormat:@"insertimage('%@')",urlstring];

   //oc    js   
    [webview evaluateJavaScript:javascripstring completionHandler:^(id _Nullable response, NSError * _Nullable error) {
        NSLog(@"%@",response);
    }];
    [picker dismissViewControllerAnimated:YES completion:nil];
}


4.3 wkwebviewポップアッププロンプトボックス
wkwebviewがロードするページは、html 5のプロンプトボックス(alter,confirm,prompt)に対して直接表示することはできませんが、必要に応じて以下の3つのエージェント方法を実現し、messageを傍受し、オリジナルのUIで表示し、WKUIdelegateプロトコル、webviewを遵守することに注意する必要があります.UIDelegate=self;
#pragma mark -   js  alter()
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler{
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"  " message:message?:@"" preferredStyle:UIAlertControllerStyleAlert];
    [alertController addAction:([UIAlertAction actionWithTitle:@"  " style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"  ");
        completionHandler();
    }])];
    [self presentViewController:alertController animated:YES completion:nil];
    
}

#pragma mark -   js  confirm()
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler{
    //    DLOG(@"msg = %@ frmae = %@",message,frame);
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"  " message:message?:@"" preferredStyle:UIAlertControllerStyleAlert];
    [alertController addAction:([UIAlertAction actionWithTitle:@"  " style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        completionHandler(NO);
    }])];
    [alertController addAction:([UIAlertAction actionWithTitle:@"  " style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        completionHandler(YES);
    }])];
    [self presentViewController:alertController animated:YES completion:nil];
}


#pragma mark -   js prompt()
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable))completionHandler{
    
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:prompt message:@"" preferredStyle:UIAlertControllerStyleAlert];
    
    [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        
        textField.text = defaultText;
        
    }];
    
    [alertController addAction:([UIAlertAction actionWithTitle:@"  " style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        
        completionHandler(alertController.textFields[0].text?:@"");
        
    }])];
    
    [self presentViewController:alertController animated:YES completion:nil];
    
}