面試總結(jié)一

1.對(duì)于cell而言,使用自動(dòng)布局和高度緩存哪種方式比較好,為什么

1.使用自動(dòng)布局會(huì)根據(jù)給出的約束,在運(yùn)行時(shí)對(duì)約束的描述信息進(jìn)行求解,最終使用frame來(lái)繪制視圖
2.iOS應(yīng)用的視圖要保持60fps的刷新幀率,那么必須在16.67ms之內(nèi)完成包括布局,繪制以及渲染等操作,由于自動(dòng)布局本身的計(jì)算量非常巨大,而且還有設(shè)置frame的過(guò)程消耗時(shí)間,那么當(dāng)頁(yè)面上的視圖非常多的時(shí)候,自動(dòng)布局就無(wú)法達(dá)到絕對(duì)流暢的要求
3.由于自動(dòng)布局的實(shí)現(xiàn)原理導(dǎo)致他的時(shí)間復(fù)雜度為多項(xiàng)式時(shí)間褥民,其性能損耗是僅使用frame的十幾倍,所以,在處理龐大的UI界面時(shí)表現(xiàn)差強(qiáng)人意
4.強(qiáng)制視圖在主線(xiàn)程上布局

2.UIWebView和WKWebView的區(qū)別

1.對(duì)于UIWebView而言 js的alert是可以直接執(zhí)行的,而在WKWebView上,js彈窗是彈不出來(lái)的,需要通過(guò)WKUIDelegate協(xié)議接收彈窗事件丈挟,然后通過(guò)iOS原生彈窗runJavaScriptAlertPanel
2.UIWebView接受一個(gè)js字符串參數(shù) 返回一個(gè)字符串,同步執(zhí)行
WKWebView接受一個(gè)js字符串參數(shù) 返回一個(gè)ID類(lèi)型參數(shù) 異步執(zhí)行
3.WKWebView js調(diào)用OC的方法使用交互管理WKUserContentController 注冊(cè)方法 在didReceiveScriptMessage里面具體實(shí)現(xiàn)
4. WKWebView使用WKWebViewConfiguration可以設(shè)置一些屬性 輕松的對(duì)載入的網(wǎng)頁(yè)進(jìn)行一些簡(jiǎn)單高效的配置
5.WKWebView的占用內(nèi)存更小,加載速度比UIWebView更快
6.WKWebView的cookie問(wèn)題很難處理 與js的交互不夠靈活
//創(chuàng)建網(wǎng)頁(yè)配置對(duì)象
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
        
// 創(chuàng)建設(shè)置對(duì)象
WKPreferences *preference = [[WKPreferences alloc]init];
//最小字體大小 當(dāng)將javaScriptEnabled屬性設(shè)置為NO時(shí)果录,可以看到明顯的效果
preference.minimumFontSize = 0;
//設(shè)置是否支持javaScript 默認(rèn)是支持的
preference.javaScriptEnabled = YES;
// 在iOS上默認(rèn)為NO,表示是否允許不經(jīng)過(guò)用戶(hù)交互由javaScript自動(dòng)打開(kāi)窗口
preference.javaScriptCanOpenWindowsAutomatically = YES;
 
config.preferences = preference;
        
// 是使用H5的視頻播放器在線(xiàn)播放, 還是使用原生播放器全屏播放
config.allowsInlineMediaPlayback = YES;
//設(shè)置視頻是否需要用戶(hù)手動(dòng)播放  設(shè)置為NO則會(huì)允許自動(dòng)播放
config.requiresUserActionForMediaPlayback = YES;
//設(shè)置是否允許畫(huà)中畫(huà)技術(shù) 在特定設(shè)備上有效
config.allowsPictureInPictureMediaPlayback = YES;
//設(shè)置請(qǐng)求的User-Agent信息中應(yīng)用程序名稱(chēng) iOS9后可用
config.applicationNameForUserAgent = @"ChinaDailyForiPad";

3.使用WKWebView進(jìn)行和js的交互

1.oc調(diào)用js方法

使用evaluateJavaScript

//changeColor()是JS方法名掷邦,completionHandler是異步回調(diào)block
 NSString *jsString = [NSString stringWithFormat:@"changeColor('%@')", @"Js參數(shù)"];
    [_webView evaluateJavaScript:jsString completionHandler:^(id _Nullable data, NSError * _Nullable error) {
        NSLog(@"改變HTML的背景色");
 }];

1.js調(diào)用oc方法

//這個(gè)類(lèi)主要用來(lái)做native與JavaScript的交互管理
WKUserContentController * wkUController = [[WKUserContentController alloc] init];
//注冊(cè)一個(gè)name為jsToOcNoPrams的js方法,設(shè)置處理接收J(rèn)S方法的代理
[wkUController addScriptMessageHandler:self  name:@"jsToOcNoPrams"];
[wkUController addScriptMessageHandler:self  name:@"jsToOcWithPrams"];
config.userContentController = wkUController;

注意:遵守WKScriptMessageHandler協(xié)議,代理是由WKUserContentControl設(shè)置
 //通過(guò)接收J(rèn)S傳出消息的name進(jìn)行捕捉的回調(diào)方法  js調(diào)OC
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
    NSLog(@"name:%@\\n body:%@\\n frameInfo:%@\\n",message.name,message.body,message.frameInfo);
}

WKWebView的使用
WKWebView和UIWebView的區(qū)別

4.WKWebview Cookie

WKWebview Cookie 如何存儲(chǔ)的

session級(jí)別的cookie

session級(jí)別的cookie是保存在WKProcessPool里的,每個(gè)WKWebView都可以關(guān)聯(lián)一個(gè)WKProcessPool,如果需要在整個(gè)App生命周期內(nèi)訪(fǎng)問(wèn)h5保留h5里的登錄狀態(tài),可以將使用WKProcessPool的單列來(lái)共享登錄狀態(tài)

WKProcessPool是沒(méi)有屬性和方法的對(duì)象,唯一的作用就是標(biāo)識(shí)是不是需要新的session級(jí)別的管理對(duì)象磷支,一個(gè)實(shí)例代表一個(gè)對(duì)象

未過(guò)期的cookie

有有效期的 cookie 被持久化存儲(chǔ)在 NSLibraryDirectory 目錄下的 Cookies/文件夾棺棵。

image
在Cookie目錄下兩個(gè)文件比較重要
Cookie.binarycookies
<appid>.binarycookies
兩者的區(qū)別是<appid>.binarycookies是NSHTTPCookieStorag文件對(duì)象
Cookie.binarycookies是WKWebView實(shí)例化對(duì)象

這就是WKWebview 和 NSHTTPCookieStorage 的原因——因?yàn)楸槐4嬖诓煌奈募?dāng)中

WKWebview Cookie 如何工作的

1.當(dāng)webView loadRequest或者302或者webView加載完畢,觸發(fā)了ajax請(qǐng)求時(shí),WKWebView所需的Cookie會(huì)去Cookie.binarycookies里讀取本域名下的Cookie,加上WKProcessPool持有的Cookie一起作為request頭里的Cookie數(shù)據(jù)

如何傳遞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登錄狀態(tài)同步到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.遠(yuǎn)程推送原理

Provider是自己程序的后臺(tái)服務(wù)器,APNS是Apple Push Notification Server的縮寫(xiě),蘋(píng)果推送服務(wù)器
分為三個(gè)階段
1.應(yīng)用程序的服務(wù)端把要發(fā)送的信息,目的iPhone的標(biāo)識(shí)打包,發(fā)送給APNS
2.APNS在自身的已注冊(cè)Push服務(wù)的iPhone列表中,查找相應(yīng)標(biāo)識(shí)的iPhone,并把消息發(fā)送到iPhone
3.iPhone把發(fā)來(lái)的消息傳遞給相應(yīng)的應(yīng)用程序,并且按照設(shè)定彈出Push通知


APNS推送通知的詳細(xì)工作流程

1.應(yīng)用程序注冊(cè)APNS消息推送
2.iOS從APNS獲取deviceToken 應(yīng)用程序接受deviceToken
3.應(yīng)用程序?qū)evice token發(fā)送給程序的PUSH服務(wù)器程序
4.服務(wù)端程序向APNS服務(wù)發(fā)送消息
5.APNS服務(wù)獎(jiǎng)消息發(fā)送給iPhone應(yīng)用程序

由于直接生成的證書(shū)windows系統(tǒng)是不識(shí)別的楼咳,所以我們需要生成一個(gè)后綴為pem的帶證書(shū)帶秘鑰的文件

1.把.cer的ssl證書(shū)轉(zhuǎn)換為.pem文件
openssl x509 -in aps_development.cer -inform der -out PushChatCert.pem
2.把私鑰Push.p12證書(shū)轉(zhuǎn)換為.pem文件
openssl pkcs12 -nocerts -out PushChatKey.pem -in Push.p12
3.把生成的兩個(gè)pem文件再生成一個(gè)pem文件 把證書(shū)和私鑰整合到一個(gè)文件里
cat PushChatCert.pem PushChatKey.pem > ck.pem
4.測(cè)試證書(shū)是否工作
telnet gateway.sandbox.push.apple.com 2195
5.使用SSL證書(shū)和私鑰來(lái)設(shè)置一個(gè)安全的鏈接去鏈接蘋(píng)果服務(wù)器
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem
6.建立推送
在AppDelegate里didFinishLaunchingWithOptions函數(shù)里寫(xiě)

  • (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
    //推送的形式:標(biāo)記,聲音烛恤,提示
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
    return YES;
    }

  • (void)application:(UIApplication *)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken {
    NSLog(@"regisger success:%@",pToken);
    //注冊(cè)成功母怜,將deviceToken保存到應(yīng)用服務(wù)器數(shù)據(jù)庫(kù)
    }

  • (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    // 處理推送消息
    NSLog(@"userinfo:%@",userInfo);

    NSLog(@"收到推送消息:%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]);
    }

  • (void)application:(UIApplication *)applicationdidFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSLog(@"Registfail%@",error);
    }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市缚柏,隨后出現(xiàn)的幾起案子苹熏,更是在濱河造成了極大的恐慌,老刑警劉巖币喧,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轨域,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡杀餐,警方通過(guò)查閱死者的電腦和手機(jī)干发,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)史翘,“玉大人枉长,你說(shuō)我怎么就攤上這事∏矸恚” “怎么了必峰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)钻蹬。 經(jīng)常有香客問(wèn)我自点,道長(zhǎng),這世上最難降的妖魔是什么脉让? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任桂敛,我火速辦了婚禮功炮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘术唬。我一直安慰自己薪伏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布粗仓。 她就那樣靜靜地躺著嫁怀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪借浊。 梳的紋絲不亂的頭發(fā)上塘淑,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音蚂斤,去河邊找鬼存捺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛曙蒸,可吹牛的內(nèi)容都是我干的捌治。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼纽窟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼肖油!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起臂港,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤森枪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后审孽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體县袱,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年瓷胧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了显拳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棚愤。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搓萧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宛畦,到底是詐尸還是另有隱情瘸洛,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布次和,位于F島的核電站反肋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏踏施。R本人自食惡果不足惜石蔗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一罕邀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧养距,春花似錦诉探、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至耘纱,卻和暖如春敬肚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背束析。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工艳馒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人畸陡。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓鹰溜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親丁恭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子曹动,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 一、深復(fù)制和淺復(fù)制的區(qū)別牲览? 1墓陈、淺復(fù)制:只是復(fù)制了指向?qū)ο蟮闹羔槪磧蓚€(gè)指針指向同一塊內(nèi)存單元第献!而不復(fù)制指向?qū)ο蟮?..
    iOS_Alex閱讀 1,358評(píng)論 1 27
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,320評(píng)論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,089評(píng)論 1 32
  • 5月以來(lái)利花,哪怕對(duì)市場(chǎng)風(fēng)向再不敏感的人,也感覺(jué)到陣陣涼意载佳。二級(jí)市場(chǎng)連續(xù)下挫炒事,一級(jí)市場(chǎng)融資環(huán)境惡化,不論企業(yè)融資數(shù)量還...
    錢(qián)皓頻道閱讀 6,022評(píng)論 1 6
  • 推薦指數(shù): 6.0 書(shū)籍主旨關(guān)鍵詞:特權(quán)蔫慧、焦點(diǎn)挠乳、注意力、語(yǔ)言聯(lián)想、情景聯(lián)想 觀(guān)點(diǎn): 1.統(tǒng)計(jì)學(xué)現(xiàn)在叫數(shù)據(jù)分析睡扬,社會(huì)...
    Jenaral閱讀 5,701評(píng)論 0 5