因爲篇幅問題,會分三篇描述對應不一樣內容。輔助工具,底層原理,開發中要注意問題三個方面,談談對應的總結。本人以爲書只是一個索引,特別對於技術類書籍,基本都是經過書籍引入一些觀點,而後在經過其它第三方途徑進行擴展。因此本文描述內容不必定就是書本內容,會與自身實踐經驗,還有部份內容精簡和拓展。有些基礎概念第三方描述已足夠詳細,實例也足夠詳細,本文僅僅提出一些我的總結理解,不在重複描述具體功能原理。javascript
文字不如圖片直觀,因此先上一張本系列描述的觀點的思惟導圖,梳理脈絡。紅色部分爲本文內容梳理。html
https 通訊協議的加密 《HTTPS鏈接過程及證書自定義認證》 這篇是以前作ssl加密認證總結的。ios
URL加密,主要針對get/put/del.後端交互能夠用aes,h5能夠用base64.web
內容加密,主要針對post.json採用AES加密,app與後端同用一套加密發送前加密,到後端解密。返回過程也是。json
出於安全性,我是以爲用post代替全部協議更加好,可是效率上post會比get低。《post和get 請求區別+原理》後端
還有各類第三庫TMDiskCache,FDMB,YYCache,這些都是基於文件的因此當沙盒被破時加密性會大大降低。瀏覽器
而Keychain適合存須要加密的信息,如金錢的,帳號的,積分的等等。。。。安全
解釋性腳本語言,javascript不須要編譯,只須要嵌入到html代碼中,由瀏覽器逐行加載解釋執行。
javascript是一種基於對象的語言,使用已經建立好的對象來,和麪向對象的先鋒需設計語言不一樣,javascript並不支持繼承和重載。
語言簡單,弱類型,語法和java,C語言相似,變量不須要聲明和指定類型便可使用,是一種弱類型語言。
最重要的特色就是隻有2點單線程,而且都是異步處理的。
//oc NSString *jsStr = [NSString stringWithFormat:@"setLocation('%@')",@"廣東省深圳市南山區學府路XXXX號"]; [self.webView stringByEvaluatingJavaScriptFromString:jsStr]; //js function setLocation(location) { asyncAlert(location); document.getElementById("returnValue").value = location; } function asyncAlert(content) { setTimeout(function(){ alert(content); },1); }
// js調用 function loadURL(url) { var iFrame; iFrame = document.createElement("iframe"); iFrame.setAttribute("src", url); iFrame.setAttribute("style", "display:none;"); iFrame.setAttribute("height", "0px"); iFrame.setAttribute("width", "0px"); iFrame.setAttribute("frameborder", "0"); document.body.appendChild(iFrame); // 發起請求後這個iFrame就沒用了,因此把它從dom上移除掉 iFrame.parentNode.removeChild(iFrame); iFrame = null; } // oc攔截 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSURL *URL = request.URL; NSString *scheme = [URL scheme]; if ([scheme isEqualToString:@"haleyaction"]) { [self handleCustomAction:URL]; return NO; } return YES; }
其實IOS8後可使用WKWebview代替,效率更高。
這裏是我總結的《WKWebView 基本使用及與JS交互》
這裏是前公司的使用總結 《網頁交互框架js》
《手把手教你利用Jenkins持續集成iOS項目》 文章中的xcrun好似在xcode8就開始被廢棄看。
持續集成指的是,頻繁地(一天屢次)將代碼集成到主幹。持續集成的目的,就是讓產品能夠快速迭代,同時還能保持高質量。它的核心措施是,代碼集成到主幹以前,必須經過自動化測試。只要有一個測試用例失敗,就不能集成。
打包腳本以在上篇xcodebulid簡述中提供了。
方法一,jenken部署mac服務器上,理由jenken定時任務定時部署。
方法二,Jenkins跑遠程ssh運行打包腳本,而後發佈到第三方(蒲公英之類)。
神器fastlane工具,這個之後準備瞭解一下。
動態庫分離,架構文件分離。
增長 Thinned Run Script
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}" # This script loops through the frameworks embedded in the application and # removes unused architectures. find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK do FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable) FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME" echo "Executable is $FRAMEWORK_EXECUTABLE_PATH" EXTRACTED_ARCHS=() for ARCH in $ARCHS do echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME" lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH" EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH") done echo "Merging extracted architectures: ${ARCHS}" lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}" rm "${EXTRACTED_ARCHS[@]}" echo "Replacing original executable with thinned version" rm "$FRAMEWORK_EXECUTABLE_PATH" mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH" done
// 1 假如咱們如今要下載娃娃體字體,它的PostScript名稱爲DFWaWaSC-W5。具體的步驟以下: - (BOOL)isFontDownloaded:(NSString *)fontName { //判斷是否系統支持某種字體 - (BOOL)isFontDownloaded:(NSString *)fontName { UIFont* aFont = [UIFont fontWithName:fontName size:12.0]; if (aFont && ([aFont.fontName compare:fontName] == NSOrderedSame || [aFont.familyName compare:fontName] == NSOrderedSame)) { return YES; } else { return NO; } } // 3 若是該字體下載過了,則能夠直接使用。不然咱們須要先準備下載字體API須要的一些參數,以下所示: // 用字體的PostScript名字建立一個Dictionary NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithObjectsAndKeys:fontName, kCTFontNameAttribute, nil]; // 建立一個字體描述對象CTFontDescriptorRef CTFontDescriptorRef desc = CTFontDescriptorCreateWithAttributes((__bridge CFDictionaryRef)attrs); // 將字體描述對象放到一個NSMutableArray中 NSMutableArray *descs = [NSMutableArray arrayWithCapacity:0]; [descs addObject:(__bridge id)desc]; CFRelease(desc); // 4 準備好上面的descs變量後,則能夠進行字體的下載了,代碼以下: __block BOOL errorDuringDownload =NO; CTFontDescriptorMatchFontDescriptorsWithProgressHandler( (__bridge CFArrayRef)descs,NULL, ^(CTFontDescriptorMatchingState state, CFDictionaryRef progressParameter) { double progressValue = [[(__bridge NSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingPercentage] doubleValue]; if (state == kCTFontDescriptorMatchingDidBegin) { NSLog(@"字體已經匹配"); } elseif (state == kCTFontDescriptorMatchingDidFinish) { if (!errorDuringDownload) { NSLog(@"字體%@下載完成", fontName); } } elseif (state == kCTFontDescriptorMatchingWillBeginDownloading) { NSLog(@"字體開始下載"); } elseif (state == kCTFontDescriptorMatchingDidFinishDownloading) { NSLog(@"字體下載完成"); dispatch_async( dispatch_get_main_queue(), ^ { // 能夠在這裏修改UI控件的字體 }); } elseif (state == kCTFontDescriptorMatchingDownloading) { NSLog(@"下載進度 %.0f%% ", progressValue); } elseif (state == kCTFontDescriptorMatchingDidFailWithError) { NSError *error = [(__bridge NSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingError]; if (error !=nil) { _errorMessage = [error description]; } else { _errorMessage = @"ERROR MESSAGE IS NOT AVAILABLE!"; } // 設置標誌 errorDuringDownload = YES; NSLog(@"下載錯誤: %@", _errorMessage); } return (BOOL)YES; });
這種下載不是下載到app是二下載到一個系統公共目錄(/private/var/mobile/Library/Assets/com_apple_MobileAsset_Font/)全部APP均可以用的。
節省空間,一個字符要10-20M以上。
原文:http://raychow.linkfun.top/2018/01/13/archives/1_ios/2017-section-3/index/