iOS系統webview與JS的交互
昨天寫了Swift和JS的交互,既然寫了就把OC的也寫了出來:
第一部分:webview與Js的交互
第二部分:設定cookie
第三部分:修改header頭
1
交互
#import “webView.h”
#import 《JavaCore/JavaCore.h》//系統支持庫
@protocol JSObjcDelegate 《JSExport》//定義web與JS交互的協議
-(void)goToNextActivity:(NSString *)urlStr;//JS需要調用的方法,參數可有可無,根據需要設定
@end
@interface webView ()《UIWebViewDelegate,JSObjcDelegate》//遵守協議
@property (nonatomic,strong)JSContext * jsContext;//創建JSContext對象 我把它當作上下文對象,用于連接JS和OC
@end
@implementation webView
-(instancetype)initWithFrame:(CGRect)frame url:(NSURL *)url{
self = [super initWithFrame:frame];
if (self) {
NSURLRequest *request = [NSURLRequest requestWithURL:url];
self.delegate = self;
[self loadRequest:request];
}
return self;
}
-(void)webViewDidFinishLoad:(UIWebView *)webView{
self.jsContext = [webView valueForKeyPath:@“documentView.webView.mainFrame.javaContext”];
self.jsContext[@“myObj”] = self;//這里把self賦值給self.jsContext的myObj對象,那么在JS中就可以通過myObj調用oc方法了
self.jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
context.exception = exceptionValue;
NSLog(@“異常信息:%@”, exceptionValue);
};
}
//webview調用方法
-(void)goToNextActivity:(NSString *)urlStr{
NSLog(@“goToNextActivity str:%@”,urlStr);
}
@end
2
cookie
這里是每次請求的時候都進行設定,所以方法寫在了web開始加載的方法里面
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
NSDictionary *dic = @{@“TOKEN”:[DEFAULTS objectForKey:@“token”],@“UID”:[DEFAULTS objectForKey:@“userID”]};
[dic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
// 設定 cookie
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:
[NSDictionary dictionaryWithObjectsAndKeys:
[request.URL host], NSHTTPCookieDomain,
[request.URL path], NSHTTPCookiePath,
key,NSHTTPCookieName,
obj,NSHTTPCookieValue,
nil]];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
// NSLog(@“cookie = %@”,cookie);
}];
return YES;
}
1
header
同樣是寫在了webview開始加載的方法里面
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
NSMutableURLRequest *mutableRequest = [request mutableCopy];
//這里加了一些判斷,避免死循環,因為修改完成后webview需要重新加載request (其中DEFAULTS 是NSUserDefaults存了一些后臺程序返回的內容)
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%