当前位置:   article > 正文

如何在iOS应用中更好的调试H5页面_mediatypesrequiringuseractionforplayback

mediatypesrequiringuseractionforplayback

前言

在APP中,H5页面可以通过加载vConsole脚本,来查看页面的日志、异常、网络加载、设备信息、储存信息、元素。但是,JS脚本加载于页面Dom挂载之后,这样就会使得这一区间的信息丢失,而且vConsole的Error也会有采集不到的情况。

本篇先简单讲述WKWebView的加载流程,再通过Safari网页检查器,实现H5页面的调试与问题定位。

一、了解web容器的加载流程

1、WKWebView的初始化

WKWebViewConfiguration配置

  1. - (WKWebViewConfiguration *)configuration {
  2. if (!_configuration) {
  3. _configuration = [[WKWebViewConfiguration alloc] init];
  4. _configuration.allowsInlineMediaPlayback = YES;
  5. if (@available(iOS 10.0, *)) {
  6. if ([_configuration respondsToSelector:@selector(mediaTypesRequiringUserActionForPlayback)]) {
  7. _configuration.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone;
  8. }
  9. } else if(@available(iOS 9.0, *)){
  10. if([_configuration respondsToSelector:@selector(setRequiresUserActionForMediaPlayback:)]) {
  11. _configuration.requiresUserActionForMediaPlayback = NO;
  12. }
  13. } else if([_configuration respondsToSelector:@selector(setMediaPlaybackRequiresUserAction:)]){
  14. _configuration.mediaPlaybackRequiresUserAction = NO;
  15. }
  16. WKUserContentController* userContentController = [[WKUserContentController alloc] init];
  17. _configuration.userContentController = userContentController;
  18. NSString *strDocumentCookie = @"document.cookie='uid=;path=/;domain=.baidu.com';document.cookie='sessionId=;path=/;domain=.baidu.com';document.cookie='tokenId=;path=/;domain=.baidu.com';";
  19. WKUserScript* cookieScript = [[WKUserScript alloc] initWithSource:strDocumentCookie injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
  20. [userContentController addUserScript:cookieScript];
  21. }
  22. return _configuration;
  23. }

WKWebView的初始化

  1. - (WKWebView *)wkWebView {
  2. if (!_wkWebView){
  3. _webViewWK = [[WKWebView alloc] initWithFrame:self.frame configuration:self.configuration];
  4. _wkWebView.scrollView.showsHorizontalScrollIndicator = NO;
  5. _wkWebView.scrollView.showsVerticalScrollIndicator = NO;
  6. _wkWebView.scrollView.bounces = NO;
  7. _wkWebView.navigationDelegate = self;
  8. _wkWebView.UIDelegate = self;
  9. _wkWebView.allowsBackForwardNavigationGestures = YES;
  10. _wkWebView.configuration.allowsInlineMediaPlayback = YES;
  11. if (@available(iOS 11.0, *)) {
  12. _wkWebView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
  13. }
  14. return _wkWebView;
  15. }

2、H5页面加载

  1. - (void)loadRequest {
  2. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://m.baidu.com"]];
  3. [request setValue:@"uid=;sessionId=;tokenId=;" forHTTPHeaderField:@"Cookie"];
  4. [self.wkWebView loadRequest:request];
  5. }

3、WKWebView的页面加载回调

  1. // 开始加载
  2. - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(null_unspecified WKNavigation *)navigation;
  3. // 资源加载,可以进行拦截处理
  4. - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler WK_SWIFT_ASYNC(3);
  5. // 加载响应,可以进行拦截处理
  6. - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler WK_SWIFT_ASYNC(3);
  7. // 加载失败
  8. - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error;
  9. // 加载完成
  10. - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation;
  11. // web进程终止
  12. - (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView API_AVAILABLE(macos(10.11), ios(9.0));

4、JSBridge交互 

1)H5到iOS的交互

在页面开始加载时,注入JSBridge

[self.configuration.userContentController addScriptMessageHandler:(MKMessageHandler *)scriptMessageHandler name:@"JSBridge"];

MessageHandler的具体实现 

  1. @interface MKMessageHandler : NSObject <WKScriptMessageHandler>
  2. @end
  3. @implementation MKMessageHandler
  4. - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
  5. if ([message.body isKindOfClass:[NSDictionary class]]) {
  6. NSDictionary *messageBody = [NSDictionary getDictionary:message.body];
  7. NSString *moduleName = [messageBody stringForKey:@"moduleName"];
  8. NSString *methodName = [messageBody stringForKey:@"methodName"];
  9. NSString *parameter = [messageBody stringForKey:@"parameter"];
  10. [self performMainThread:^ {
  11. [self invokeAPI:moduleName methodName:methodName parameter:parameter];
  12. }];
  13. }
  14. }
  15. - (void)invokeAPI:(NSString *)moduleName methodName:(NSString *)methodName parameter:(NSString *)parameter {
  16. // API映射
  17. }
  18. @end

web端调用JSAPI 

window.webkit.messageHandlers.JSBridge.postMessage({'moduleName': 'page','methodName':'openURL','parameter':JSON.stringify({'url':''})})

2)iOS到H5的交互

web端方法挂载,监听方法回调

  1. // 页面window挂载方法
  2. window.onCallBack = res => {
  3. console.log(res)
  4. }
  5. /* 使用function的方式,this会指向window
  6. window.onCallBack = function(res) {
  7. console.log(res)
  8. }
  9. */

webView直接运行JS代码调用

  1. [self.wkWebView evaluateJavaScript:@"window.onCallBack('Hello JS!!!')" completionHandler:^(id result, NSError *error) {
  2. // 调用结果回调
  3. }];

二、使用Safari实现iOS中的H5调试

1、环境准备

1)iOS安装包必须是开发证书打的IPA包

2)打开手机的设置 > Safari > 高级 > 网页检查器

3)打开Mac版Safari偏好设置 > 高级 > 在菜单栏中显示“开发”菜单

4)手机连接Mac电脑 > 打开APP对应的web页 > 打开Mac版Safari的“开发”菜单

5)找到对应的页面 > 点击打开网页检查器

2、实际应用 

1)元素布局:手动修改html以及css属性,点击刷新按钮可以重置页面。通过网页检查器修改元素布局与样式,可以直接应用在APP的web页面。

2)控制台:通过错误日志排查页面异常,使用控制台运行JS代码。错误日志包括js语法错误、脚本资源加载异常、页面Exception。

3)来源:找到需要调试的JS文件,在具体的行打上断点,当页面逻辑调用到指定行代码时,触发断点;在通过变量预览、断点操作、控制台操作来实现基本的联调。

4)网络:查看网络资源的加载情况(资源大小、url、时耗、类型、异常),包括XHR接口的相关信息(请求、响应)。

5)储存空间:LocalStorage、Cookie、SessionStorage,查看页面相关的存储信息。

  

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号