跳至主要内容

iOS webview js交互总结

iOS web控件有两种,一种是UIWebView,一种是WKWebView

UIWebView



UIWebView 拦截函数为自定义函数
UIWebView js交互,如果交互函数只有函数名称,即中间没有.号的话,拦截很容易,如果有.号的话,要拦截,必须使用第三方组件UIWebView+TS_JavaScriptContext,然后在 webViewDidFinishLoad: 里面执行以下函数(demo中的函数是thirdPartyApp. CloseWebView())

self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
self.context[@"thirdPartyApp"] = self;


然后再在web控制器页面添加函数就可以完成拦截过程了

- (void)CloseWebView{
}


## WKWebView
WKWebView 拦截的js方法和UIWebView不一样,只能拦截window.webkit.messageHandlers.mydemo.postMessage函数,拦截名称为灰色部分。
WKWebView 有两种方案

方案1:



修改web,然后添加兼容WKWebView的代码,本地修改useragent,添加webConfiguration.applicationNameForUserAgent = @"demo";后面为添加的区分代码
交互代码为

window.webkit.messageHandlers.mydemo.postMessage('');


方案2:初始化代码如下,添加的js交互代码



拦截核心代码如下

WKUserContentController *userController = [[WKUserContentController alloc]init];
NSString *javaScriptSource = @"var thirdPartyApp = {};thirdPartyApp.function(){window.webkit.messageHandlers.mydemo.postMessage('');}";
WKUserScript *userScript = [[WKUserScript alloc] initWithSource:javaScripinjectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:NO];
[userController addUserScript:userScript];
webConfiguration.userContentController = userController;


以下是比较完整的代码部分

WKWebViewConfiguration *webConfiguration = [[WKWebViewConfiguration alloc] init];
WKPreferences *preference = [[WKPreferences alloc]init];
//最小字体大小 当将javaScriptEnabled属性设置为NO时,可以看到明显的效果
preference.minimumFontSize = 0;
//设置是否支持javaScript 默认是支持的
preference.javaScriptEnabled = YES;
// 在iOS上默认为NO,表示是否允许不经过用户交互由javaScript自动打开窗口
preference.javaScriptCanOpenWindowsAutomatically = YES;
webConfiguration.preferences = preference;
webConfiguration.applicationNameForUserAgent = @"demo";
WKUserContentController *userController = [[WKUserContentController alloc]init];
NSString *javaScriptSource = @"var thirdPartyApp = {};thirdPartyApp.function(){window.webkit.messageHandlers.mydemo.postMessage('');}";
WKUserScript *userScript = [[WKUserScript alloc] initWithSource:javaScripinjectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:NO];
[userController addUserScript:userScript];
webConfiguration.userContentController = userController;
[userController addScriptMessageHandler:self name:@"mydemo"];
_webview = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.configuration:webConfiguration];
_webview.UIDelegate = self;
_webview.navigationDelegate = self;
_webview.backgroundColor = [UIColor clearColor];
[self.view addSubview:_webview];
_webview.allowsBackForwardNavigationGestures = YES;
NSURL *url;
url = [NSURL URLWithString:@"https://www.baidu.com"];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
[_webview loadRequest:request];

评论

此博客中的热门博文

非公开 app

 1.对用户 用户只能通过特定链接才能使用该 app,其他使用和应用商店 app 一致。 2.对开发 a,以应用商店提交 app 的标准方式提交 app,在备注添加一行,写上“App 将用于非公开分发”,提交 app。 b,  填写非公开 app 申请,https://developer.apple.com/contact/request/unlisted-app/ c,等待审核,整个审核过程会比平常审核慢 2-5 个工作日,后续更新应该会正常。 app分发类型 非公开app ABM App Store 企业包 app分发类型 非公开app ABM App Store 企业包 是否需要https, 自己搭建托管环境 否,文件托管到 App Store 否,文件托管到 App Store 否,文件托管到App Store 是,需要自己托管,需要 https 环境,受信任的 ssl证书 是否可以直接在 App Store 搜索到 否 否 是 否 是否可以在 App Store 展示 应用信息,包括 在应用信息页面 手动点击更新 是 否 是 不上传到App Store无 App Store信息 在应用商店 更新列表点击更新 是 是 是 否 是否需要手 动更新app 开启App Store的自动更新,就自动更新,否则手动更新 开启App Store的自动更新,就自动更新,否则手动更新,只能点我的头像,更新列表里面去更新 开启App Store的自动更新,就自动更新,否则手动更新 必须去 app 里面 点击更新,或者 去下载页面去 下载最新的app 包是否会过期 否,只要账号正常 否,只要账号正常 否,只要账号正常 是,包里面有 两个证书,虽 然只打包进一 个证书文件, 但那个证书文 件关联另一个, (打包的时候一 起使用)打包 的文件有效期1 年,关联的文 件有效期 3 年。打包的时候 是否允许马甲, 重复应用(相似 ui,相似代码) 是 是 否 是 应用商店审核要求 有,除了马甲应用,其他都一样 有,除了马甲应用,其他都一样 不允许马甲应用,其他都一样 不需要审核 是否能用其他 开发者账号上传 我们的定制版应用 未知 可以 不允许 无app store 应用上传权限 哪些版本可以 改成该版本 1.App Store包 2.企业包 1.企业包 1.企业包 ...

非公开 app 分发

非公开 app  简介 app 除了不能搜索到该 app,其他使用和普通的应用商店一致。 只需要使用对应的链接就可以跳转到该 app 。 非公开 app 上传审核流程 1.appstore connect 新建应用,配置和普通上传应用商店(公开应用)完全一致 2.在备注里面加上一行:该 app 属于非公开 app,提交 app 3.去非公开 app 申请链接app 为非公开 app,https://developer.apple.com/contact/request/unlisted-app/ 4.审核被拒,有两部分,一个是普通appstore审核被拒(可能没有),最后还会多上一个非公开 app 审核被拒的部分。等待只有非公开 app 审核被拒的问题后,再等上两天左右就好了。 5.审核通过后,会通过邮件发送该 app 的链接,此链接其实和其他 app 的链接格式一致,并无区别,唯一的区别是该 app 在应用商店搜索不到。

企业包下载安装问题

1. 下载后,去设置 ---> 通用 ---> VPN与设备管理(设备管理),找到对应的企业证书名称,选择信任即可正常打开软件使用。 2. app过期,或者系统时间手动修改到app过期时间,安装包无法正常使用,手动调整系统时间到正常时间即可正常运行。