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