0
点赞
收藏
分享

微信扫一扫

面试总结一

在觉 2021-09-19 阅读 81

1.对于cell而言,使用自动布局和高度缓存哪种方式比较好,为什么

1.使用自动布局会根据给出的约束,在运行时对约束的描述信息进行求解,最终使用frame来绘制视图
2.iOS应用的视图要保持60fps的刷新帧率,那么必须在16.67ms之内完成包括布局,绘制以及渲染等操作,由于自动布局本身的计算量非常巨大,而且还有设置frame的过程消耗时间,那么当页面上的视图非常多的时候,自动布局就无法达到绝对流畅的要求
3.由于自动布局的实现原理导致他的时间复杂度为多项式时间,其性能损耗是仅使用frame的十几倍,所以,在处理庞大的UI界面时表现差强人意
4.强制视图在主线程上布局

2.UIWebView和WKWebView的区别

1.对于UIWebView而言 js的alert是可以直接执行的,而在WKWebView上,js弹窗是弹不出来的,需要通过WKUIDelegate协议接收弹窗事件,然后通过iOS原生弹窗runJavaScriptAlertPanel
2.UIWebView接受一个js字符串参数 返回一个字符串,同步执行
WKWebView接受一个js字符串参数 返回一个ID类型参数 异步执行
3.WKWebView js调用OC的方法使用交互管理WKUserContentController 注册方法 在didReceiveScriptMessage里面具体实现
4. WKWebView使用WKWebViewConfiguration可以设置一些属性 轻松的对载入的网页进行一些简单高效的配置
5.WKWebView的占用内存更小,加载速度比UIWebView更快
6.WKWebView的cookie问题很难处理 与js的交互不够灵活
//创建网页配置对象
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
        
// 创建设置对象
WKPreferences *preference = [[WKPreferences alloc]init];
//最小字体大小 当将javaScriptEnabled属性设置为NO时,可以看到明显的效果
preference.minimumFontSize = 0;
//设置是否支持javaScript 默认是支持的
preference.javaScriptEnabled = YES;
// 在iOS上默认为NO,表示是否允许不经过用户交互由javaScript自动打开窗口
preference.javaScriptCanOpenWindowsAutomatically = YES;
 
config.preferences = preference;
        
// 是使用H5的视频播放器在线播放, 还是使用原生播放器全屏播放
config.allowsInlineMediaPlayback = YES;
//设置视频是否需要用户手动播放  设置为NO则会允许自动播放
config.requiresUserActionForMediaPlayback = YES;
//设置是否允许画中画技术 在特定设备上有效
config.allowsPictureInPictureMediaPlayback = YES;
//设置请求的User-Agent信息中应用程序名称 iOS9后可用
config.applicationNameForUserAgent = @"ChinaDailyForiPad";

3.使用WKWebView进行和js的交互

1.oc调用js方法

使用evaluateJavaScript

//changeColor()是JS方法名,completionHandler是异步回调block
 NSString *jsString = [NSString stringWithFormat:@"changeColor('%@')", @"Js参数"];
    [_webView evaluateJavaScript:jsString completionHandler:^(id _Nullable data, NSError * _Nullable error) {
        NSLog(@"改变HTML的背景色");
 }];

1.js调用oc方法

//这个类主要用来做native与JavaScript的交互管理
WKUserContentController * wkUController = [[WKUserContentController alloc] init];
//注册一个name为jsToOcNoPrams的js方法,设置处理接收JS方法的代理
[wkUController addScriptMessageHandler:self  name:@"jsToOcNoPrams"];
[wkUController addScriptMessageHandler:self  name:@"jsToOcWithPrams"];
config.userContentController = wkUController;

注意:遵守WKScriptMessageHandler协议,代理是由WKUserContentControl设置
 //通过接收JS传出消息的name进行捕捉的回调方法  js调OC
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
    NSLog(@"name:%@\\n body:%@\\n frameInfo:%@\\n",message.name,message.body,message.frameInfo);
}

WKWebView的使用
WKWebView和UIWebView的区别

4.WKWebview Cookie

WKWebview Cookie 如何存储的

session级别的cookie

WKProcessPool是没有属性和方法的对象,唯一的作用就是标识是不是需要新的session级别的管理对象,一个实例代表一个对象

未过期的cookie

有有效期的 cookie 被持久化存储在 NSLibraryDirectory 目录下的 Cookies/文件夹。

在Cookie目录下两个文件比较重要
Cookie.binarycookies
<appid>.binarycookies
两者的区别是<appid>.binarycookies是NSHTTPCookieStorag文件对象
Cookie.binarycookies是WKWebView实例化对象

这就是WKWebview 和 NSHTTPCookieStorage 的原因——因为被保存在不同的文件当中

WKWebview Cookie 如何工作的

如何传递cookie

let cooki = "document.cookie = '这里是你需要的cookie值'
let userContentController = WKUserContentController()       
let userScript = WKUserScript(source: cooki, injectionTime:WKUserScriptInjectionTime.atDocumentStart, forMainFrameOnly: false)    

userContentController.addUserScript(userScript)       

let config = WKWebViewConfiguration()       
config.userContentController = userContentController    
   
var url = URLRequest(url: URL(string: sqlUrl)!, cachePolicy: URLRequest.CachePolicy.useProtocolCachePolicy, timeoutInterval: 20)       

webV = WKWebView(frame: UIScreen.main.bounds, configuration: config)

cookie

第一次拿到cookie

NSString *cookieStr = [self setupCookie];  //保持APP登录状态同步到web
WKUserScript *cookieScript = [[WKUserScript alloc] initWithSource:cookieStr injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
[configuration.userContentController addUserScript:cookieScript];
- (NSString *)setupCookie
{     NSMutableDictionary *cookieDic = [NSMutableDictionary dictionary];
      NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
      NSString *currentHostUrl = [IQHAPIService apiBaseUrlString];;
      NSString *hostDomin = [currentHostUrl stringByReplacingOccurrencesOfString:@"http://mobile" withString:@""];
      for (NSHTTPCookie *cookie in [cookieJar cookies]) {
          if ([hostDomin isEqualToString:cookie.domain]) {
             [cookieDic setObject:cookie.value forKey:cookie.name];
          }
      }
      NSString *sessionType = @"APPSESSIONID";
      NSString *cookieStr = @"";
      for (NSString *key in cookieDic) {
          if([key isEqualToString:@"SESSION"]){
              NSString *appendString = [NSString stringWithFormat:@"'%@=%@;path=/';",sessionType,[cookieDic valueForKey:key]];
              cookieStr = [NSString stringWithFormat:@"%@document.cookie=%@",cookieStr,appendString];
          }
      }
      return cookieStr;
}

5.远程推送原理

Provider是自己程序的后台服务器,APNS是Apple Push Notification Server的缩写,苹果推送服务器
分为三个阶段
1.应用程序的服务端把要发送的信息,目的iPhone的标识打包,发送给APNS
2.APNS在自身的已注册Push服务的iPhone列表中,查找相应标识的iPhone,并把消息发送到iPhone
3.iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知


由于直接生成的证书windows系统是不识别的,所以我们需要生成一个后缀为pem的带证书带秘钥的文件

举报

相关推荐

0 条评论