10分でJSとOCの相互作用ができます.

5186 ワード

JSとiOSの相互作用
JSとiOSの相互作用は、各アプリケーションに欠かせない需要であり、特にページの変動が大きい場合、ページは常に更新され、JSとiOSが相互作用して使えばとても幸せです.
原理:JavaScripptCoreを通じてJSとiOSの相互作用を解決します.
説明:JavaScript CoreはJavaScriptとObjective-Cブリッジをカプセル化したObjective-C APIであり、より少ないコードが必要であれば、JavaScriptとObjective-Cの相互呼び出しを実現することができます.iOS 7の後、アップルはJavaScripptCoreという枠組みを作り出し、ウェブページとネイティブアプリケーションを交互にすることができます.また、このフレームを使うとAndroid側とiOSが相対的に統一されます.ウェブの先端にコードを書くと、クライアントの二つのプラットフォームに適応できます.iOSとAndroidは定義方法の名称を協議してh 5に知らせてもいいです.ここではh 5の定義があります.これによって協議を減少させます.JavaScript Coreでは、ウェブページで生アプリケーションを呼び出す方法は、DelegateまたはBlockの2つの方法を使用することができます.ここでblockで方法を実現します.blockの方法はもっと簡単です.
JavaScript Coreのクラスとプロトコル:JSContext:JavaScriptに運行のコンテキスト環境を提供します.JSContextはJSの実行環境を表します.-evaluate Script:方法でJSValueを実行できます.JSValueはJSとObjCの対応するタイプをカプセル化しました.JSのAPIを呼び出します.JavaScriptとObjective-Cのデータと方法の橋梁JSMangedValue:データと方法を管理するJSVirtualMachine:処理スレッドは関連しています.少ないJSExportを使って、このプロトコルを遵守すれば、私達自身のプロトコルを定義できます.プロトコルで宣言されたAPIはいずれもJSに露出して呼び出されます.
本題に入る
一、h 5のコードを貼る

    
        
            
                
                var share = JSON.stringify({"title": "Migi000",
                                           "desc": "",
                                           "shareUrl": "http://www.jianshu.com/p/f896d73c670a"
                                           });
            
            //IOS
            function startFunction(share){
                window.android.startFunction(share)//android
            }
            
                
    
    
        

Objective-C JavaScript


注:ここの方法はheadに書いてください.PS:このコードをテストする前に、自分の方法はbodyに書いています.しかし、Androidは実現できません.その後、headに置いても実現できます.これはあまり知られていません.何故なら、大神が教えてくれます.
二、快速アクセス-block解決.mファイルは以下の通りです.
//
//  ViewController.m
//  jsTest
//
//  Created by fangpinhui on 16/5/18.
//  Copyright © 2016  Lumic. All rights reserved.
//

#import "ViewController.h"
#import 

@interface ViewController ()
@property (nonatomic)UIWebView *webView;
@property (nonatomic)JSContext *jsContext;
@property (nonnull,strong) UIButton *btn;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.webView = [[UIWebView alloc]initWithFrame:self.view.bounds];
    self.webView.delegate = self;
    [self.view addSubview:_webView];
    NSString *str = [[NSBundle mainBundle] pathForResource:@"migi" ofType:@"html"];
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:@"f"]]];
//    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://192.168.1.59:8020/Online-Booking/index.html"]]];
    
    //           ,  oc   h5   alert   
    self.btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 400, 100, 40)];
    self.btn.backgroundColor = [UIColor redColor];
    [self.btn addTarget:self action:@selector(showAlert) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:self.btn];
    
    
}
- (void)showAlert
{
    //  script alert()     string  
    NSString *alertJs=@"alert('Hello Word')";
    [_jsContext evaluateScript:alertJs];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView{
    _jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    _jsContext[@"startFunction"] =^(id obj){
////    block      h5   json  
        /*block   JSContexts
            block             ,      ,  block     context        ,         [JSContext currentContext]      JSContext:
         */
        [JSContext currentContext];
        NSData *data = [(NSString *)obj dataUsingEncoding:NSUTF8StringEncoding ];
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
        NSLog(@" data   %@   ======  ShareUrl %@",obj,dict[@"shareUrl"]);
    };
    //
    _jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
        context.exception = exceptionValue;
        //   js       ,OC       ,          
        NSLog(@"    :%@", exceptionValue);
    };
  

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
注:1.h hファイルに導入しています.ここでh 5は私達のNativeで定義されているstartFunction方法と必要なコールバックのデータフォーマットが必要ですので、ここでh 5とコミュニケーションしてください.
これは簡単なjsとocの間の相互作用で、プラットフォームの応用の中で使うことができて、下は出会う問題の総括で、もし問題があるならば、積極的に分かち合います!
問題のまとめ:問題1.コールバックを実行する時、iOSはコールバック方法を実現できますが、Androidは実現できません.両方ともコードをチェックしました.大丈夫です.h 5コードをチェックする時、発見方法はbodyに書いています.Androidはコールバックできません.
解決方法:h 5の方法はheadに書いて、実現しました.
問題2:jsとiOSのインタラクションを行う時、コードを書きました.demoの中で、私は鞥水importライブラリの導入を入れました.mファイルの中で、blockはデータを返しましたが、会社のプロジェクトで実現した時、どうしてもフィードバック方法を実行しないので、とても怪しいです.どうしても実現できません.
解决方法:ライブラリの导入を.hファイルに置いて実行します.満面にぼんやりしています教えを仰ぐ
PS:混ぜに来て、注意は必要です.いいね.❤️ はい、あげます