因为篇幅问题,会分三篇描述对应不一样内容。辅助工具,底层原理,开发中要注意问题三个方面,谈谈对应的总结。本人以为书只是一个索引,特别对于技术类书籍,基本都是经过书籍引入一些观点,而后在经过其它第三方途径进行扩展。因此本文描述内容不必定就是书本内容,会与自身实践经验,还有部份内容精简和拓展。有些基础概念第三方描述已足够详细,实例也足够详细,本文仅仅提出一些我的总结理解,不在重复描述具体功能原理。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/