OC-UICWebViewのJSとOCの相互作用、Cookieの管理
7146 ワード
完全抄録:iOSのUICbViewとWKWebView、JavaScriptとOCがインタラクティブで、Cookie管理は私が十分に深入りします.JavaScript Core JavaScript Coreの枠組みを詳しく解説します.
UICWebView OCはJSを呼び出します.
1、strigByEveraluting JavaScript FroomString JavaScripptCore(iOS 7.0+) Custom URL Scheme
短所:今回のインタラクションの戻り値を直接取得することができません.一方通行の方が適しています.また、逆転に関心がない場合、例えばh 5ページがnativeページにジャンプするなどです. JavaScripptCore(iOS 7.0+) OC現実JSの方法JSコード
UICWebViewのCookie管理は簡単で、普通は私達が手動でCookieを操作する必要はありません.すべてのCookieは「NSHTTPCookie Storrage sharedHTTPCookie Storrage」によって管理されます.この単独の例は管理して、しかもUICWebViewは自動的にCookie StorrageのCookieを同期させますので、Native端にいる限り、正常にログインして終了します.h 5は適切な時に更新すれば、登録状態を正確に維持できます.余分な操作は必要ありません.
いくつかの場合がありますが、私たちはあるリンクにアクセスする際に、固定のCookieを追加して区分をする必要があります.それならheaderを通じて実現できます.
UICWebView OCはJSを呼び出します.
1、strigByEveraluting JavaScript FroomString
/*
1、 , nil,js nil
2、 NSString,
*/
- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
self.navigationItem.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
// ,
//self.navigationItem.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
// UIWebView javascript
JSContext *jsContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 。
JSValue *value = [self.jsContext evaluateScript:@"document.title"];
//
self.navigationItem.title = value.toString;
}
// ,
[self.jsContext setExceptionHandler:^(JSContext *context, JSValue *exception){
NSLog(@"%@", exception);
}];
//
JSValue *value = [self.jsContext evaluateScript:@"document.titlexxxx"];
UICWebView JSはOCを呼び出します.- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
// URL scheme、host、port、path、query、fragment
NSURL *URL = request.URL;
if ([URL.scheme isEqualToString:@"darkangel"]) {
if ([URL.host isEqualToString:@"smsLogin"]) {
NSLog(@" , %@", URL.query);
return NO;// NO( )
}
}
return YES;
}
利点:泛用性が強く、h 5に協力してページの動的化が可能です.例えば、画面の一つの活動が活動詳細ページにリンクされています.nativeがまだ開発されていない場合、リンクはh 5リンクとなります.nativeが開発されるまで、この方法でnativeページにジャンプして、ページの動的化が可能です.また、この方式はAndroidとiOSに適用され、汎用性が高いです.短所:今回のインタラクションの戻り値を直接取得することができません.一方通行の方が適しています.また、逆転に関心がない場合、例えばh 5ページがnativeページにジャンプするなどです.
function share(title, imgUrl, link) {
// OC
}
OCコード- (void)webViewDidFinishLoad:(UIWebView *)webView
{
// js function OC
[self convertJSFunctionsToOCMethods];
}
- (void)convertJSFunctionsToOCMethods
{
// UIWebview javascript
//self jsContext
self.jsContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//js oc
// share js , block oc
// ,js
// ja "share", , 。
self.jsContext[@"share"] = ^() {
NSArray *args = [JSContext currentArguments];// share
//args JSValue, OC
NSMutableArray *messages = [NSMutableArray array];
for (JSValue *obj in args) {
[messages addObject:[obj toObject]];
}
NSLog(@" js :
%@", messages);
};
}
一つは二つのパラメータがあります.一つは戻り値のjs方法JSです.// , ,
function testAddMethod(a, b) {
// OC a+b,
return a + b;
}
console.log(testAddMethod(1, 5)); //output 6
OCはこの方法を直接置換する.self.jsContext[@"testAddMethod"] = ^NSInteger(NSInteger a, NSInteger b) {
return a + b;
};
JS呼び出しconsole.log(testAddMethod(1, 5)); //output 6, a + b
OCはこの方法を2つの数の相乗に置き換える.self.jsContext[@"testAddMethod"] = ^NSInteger(NSInteger a, NSInteger b) {
return a * b;
};
JS呼び出しconsole.log(testAddMethod(1, 5)); //output 5, a * b。
OC呼び出し方法を元に実施し、元の結果に10を掛けた.// , 10
JSValue *value = self.jsContext[@"testAddMethod"];
self.jsContext[@"testAddMethod"] = ^NSInteger(NSInteger a, NSInteger b) {
JSValue *resultValue = [value callWithArguments:[JSContext currentArguments]];
return resultValue.toInt32 * 10;
};
JS呼び出しconsole.log(testAddMethod(1, 5)); //output 60, (a + b) * 10
回調:例えば、h 5に共有ボタンがあります.ユーザーがクリックした後、native共有(WeChat共有、微博共有など)を呼び出して、nativeで成功または失敗を分かち合う時、h 5ページを回して、その共有結果を教えます.h 5ページは対応するUIを更新して、共有成功または失敗したJSコードを表示します.//
function share(shareData) {
var title = shareData.title;
var imgUrl = shareData.imgUrl;
var link = shareData.link;
var result = shareData.result;
//do something
//
setTimeout(function(){
//2s , true
result(true);
}, 2000);
}
//
share({
title: "title",
imgUrl: "http://img.dd.com/xxx.png",
link: location.href,
result: function(res) { //
console.log(res ? "success" : "failure");
}
});
OCコード//
self.jsContext[@"share"] = ^(JSValue *shareData) { // , NSDictionary , ?
// , NSDictionary, result block NSDictionary
NSLog(@"%@", [shareData toObject]);
// shareData result , JSValue javascript function。
JSValue *resultFunction = [shareData valueForProperty:@"result"];
// block, js function OC block
void (^result)(BOOL) = ^(BOOL isSuccess) {
[resultFunction callWithArguments:@[@(isSuccess)]];
};
//
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@" ");
result(YES);
});
};
UICWebViewのCookie管理UICWebViewのCookie管理は簡単で、普通は私達が手動でCookieを操作する必要はありません.すべてのCookieは「NSHTTPCookie Storrage sharedHTTPCookie Storrage」によって管理されます.この単独の例は管理して、しかもUICWebViewは自動的にCookie StorrageのCookieを同期させますので、Native端にいる限り、正常にログインして終了します.h 5は適切な時に更新すれば、登録状態を正確に維持できます.余分な操作は必要ありません.
いくつかの場合がありますが、私たちはあるリンクにアクセスする際に、固定のCookieを追加して区分をする必要があります.それならheaderを通じて実現できます.
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];
[request addValue:@"customCookieName=1314521;" forHTTPHeaderField:@"Set-Cookie"];
[self.webView loadRequest:request];
NSHT TPCookie Strageをアクティブに操作することもできます.カスタムCookieを追加します.NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:@{
NSHTTPCookieName: @"customCookieName",
NSHTTPCookieValue: @"1314521",
NSHTTPCookieDomain: @".baidu.com",
NSHTTPCookiePath: @"/"
}];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie]; //Cookie ,
いくつかの一般的な方法があります.例えば、すべてのCookieを読んでHTTPHeader Fieldsに変換し、requestのheaderに追加します.NSArray *cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage].cookies;
//Cookies requestHeaderFields
NSDictionary *requestHeaderFields = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];
//
request.allHTTPHeaderFields = requestHeaderFields;