(一)推荐的图书
1.书里推荐的图书:
(二)推荐的博客和如何更好的学习iOS开发
1.提高iOS开发技能
1)阅读博客
好的博客列表:https://github.com/tangqiaoboy/iOSBlogCN
2)读书
每年至少坚持读完一本高质量的iOS开发图书
3)看WWDC视频
4)看苹果的官方文档
5)看开源项目的代码
除iOS开发本身知识外,还可以学习设计模式和软件架构等
6)多写代码多思考
尽量保持写的代码都具有复用性。代码因为业务需求需要变更时,及时重构,在不要留下技术债的同时,多思考如何设计应用结构,保证满足灵活多变的产品需求,在多次重构和思考中,会慢慢积出一系列的最佳解决办法,成为自己的宝贵经验。
7)多和同行交流
国内的技术社区进行交流,国外的Stack Overflow(http://www.stackoverflow.com)上提问或者回答问题。
8)分享
分享方式:发起一个开源项目,写技术博客,在技术会议上做报告。
(三)摘要:iOS开发工具
1.CocoaPods
CocoaPods项目的源码地址:https://github.com/CocoaPods/CocoaPods
可以节省设置和更新第三方开源库的时间。
使用CocoaPods将用到的第三方库放到profile的文件中,执行pod install。会自动下载下来
注意事项:
1)关于.gitigonre
profile.lock只有在执行pod update才会变更,执行pod install不会改变,不能把profile.lock添加到.gitigonre中。
2)为自己项目创建podspec文件
参考:两篇博文:《如何编写一个CocoaPods的spec文件》(http://ishalou.com/blog/2012/10/16/how-to-create-a-cocoapods-spec-file/)和《cocoapods入门》(http://studentdeng.github.io/blog/2013/09/13/cocoapods-tutorial/)
3)使用私有的pods,不更新podspec
2.网络封包分的截取和分析工具Charles
方便开发中截取调试网络请求内容,分析封包协议,以及模拟慢网速等。
官方网址:http://www.charlesproxy.com
1)可以模拟慢网速
2)截取SSL信息
3)修改网络请求内容
4)修改服务器返回内容
5)Map功能 Map Remote网络请求重新定义到另一个网址,Map Local网络请求重新定义到本地文件。
6)Rewrite对网络请求的结果进行改变
7)Breakpoints功能
3.Reveal
开发时可以动态的查看和修改程序的界面,可以连接真机和模拟器
PonyDebugger和Spark Inspector也是同没醒的界面调试工具,PonyDebugger开源并且免费,Reveal和Spark Inspector是收费的,不过功能更强大些
4.移动统计工具Flurry
https://github.com/tangqiaoboy/FlurryUsageSample
1)每天登录用户数,应用使用次数;
2)使用iOS系统各版本(例如iOS6.0,iOS7.0等)比例。
3)使用iOS各种设备(例如iphone4,iphone5等)比例。
4)crashlog统计
5.崩溃日志记录工具Crashlytics
专门为移动应用开发者提供的保存和分析应用崩溃信息的专业工具。
6.App Store统计工具App Annie
App Store数据的统计分析工具,该工具可以统计App在App Store的下载量,排名变化,销售收入情况及用户评价等信息。
7.Xcode插件
1)Alcatraz管理Xcode插件,http://blog.csdn.net/xiaoliuxingzi/article/details/46889429。
2)KSimageNamed 弹出图片
3)XVim 编辑窗口打开Vim Ctrl+W来切换当前编辑的分栏
4)FuzzyAutocompletePlugin 使用模糊的方式自动补全代码
5)XToDo 提供一个汇总的界面,集中显示所有的未完成的TODO和FIXME标记
6)BBUDebuggerTuckAway 编辑代码的时候自动隐藏底部的调试窗口
7)SCXcodeswitchExpander 迅速的在switch语句中填充枚举类型的每种可能的取值
8)deriveddata-exterminator清除Xcode缓存目录的插件
9)VVDocumenter自动生成代码注释的工具
10)ClangFormat自动调整代码风格的工具
11)ColorSense实时预览相应的颜色
12)XcodeBoost 包含多个辅助修改小代码的功能
9.其它工具介绍
1)取色工具,数码测色计(DigitalColor Meter),苹果自带的类似有xScope
2)图形工具ImageOptim免费图像压缩工具,iOS工程默认使用pngcrush来压缩图片,效率不高,
3)马克鳗 免费标注工具,可以方便地在输出的美术设计稿上标注相应界面元素的大小,颜色,边距,说明等。
4)Dash 快速查看API文档和代码片段管理工具。
5)蒲公英,内测分发工具类似于TestFlight.
6)命令行工具,nomad方便操作苹果开发者中心的命令行工具,添加测试设备,更新证书,增加AppID,验证IAP的凭证。
7)xctool 可在github上下载,开源的iOS编译和测试的工具,可方便进行编辑和单元测试,将测试的结果集成到Jenkins中,实现自动化集成,苹果在OSX Server上推出自动化集成BOT,效果不是很好。
8)appledoc是一个从源代码中抽取文档的工具,可从iOS工程的源代码中抽取相应的注释,生成帮助文档。
(四)有用的技术
1.内存管理,引用计数。
Xcode检测循环引用,使用Xcode的菜单栏选择Product - Profile - Leaks,在单击右下角的Profile按钮开始检测,在Instruments会检测到这次的循环引用,Instruments中会用一条红色的线条来表示一次内存泄露的产生,切换到Leaks这一栏,点击Cycles&Roots,就可以看到以图形的方式显示出来的循环引用,这样我们就可以非常方便地找到循环引用的对象了。
ARC
需要使用_bridge等关键字
将非ARC的工程转换成ARC,Xcode中使用Edit-Refactor-Convert to Object-c ARC
2.CoreFoundation对象的内存管理
底层的内存管理XXCreateWithXxx这样的方式创建,底层的内存管理。
3.GCD
4.UIWindowLevel
UIKIT_EXTERN const UIWindowLevel UIwindowLevelNormal;
切换到用户的界面的时候需要输入密码,有随书的笔记。需要用到UIWindow的情况有应用启动页,应用内通知提醒,输入密码。
5.动态下载系统提供的多种中文字体
苹果提供啦动态下载代码的Demo工程:http://developer.apple.com/library/ios/#samplecode/DownloadFont/Listings/DownloadFont_ViewController_m.html
6.使用应用内支付
1)配置后台
2)配置iTunes Connect
3)iOS端的开发
4)服务器端开发
5)苹果审核应用时,只会在沙盒(sandbox)环境购买,其产生的购买凭证,也只能连接苹果的测试验证服务器,但是审核的应用又是连接的我们的线上服务器,那应该怎么处理?
解决办法是判断苹果正式验证服务器的返回状态码,如果是21007,则再一次连接测试服务器进行验证即可,苹果的文档http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/RenewableSubscriptions
7.基于UIWebView的混合编程
1)模板引擎:MGTemplateEngine,也可以使用GRMustache,
2)Object-c和JavaScript语言的相互调用
原生界面发现以gap请求的地址,就不进行加载,而是执行相应的调用逻辑。这也是Cordova框架调用的原生逻辑机制,
WebViewJavaScriptBridge它能实现相互调用
3)CommonJS规范
4)使用safari进行调试
safari的调试模式打开,safari-preferences-Advanced 勾选上Show Develop menu in menu bar选项
在Iphone模拟器或者真机的设置上把调试模式打开,safari-高级-web检查器
通过USB脸上电脑,safari的Develop菜单下就会多出相应的菜单选项
8.安全性问题
1)安全的传输密码,将密码加密MD5
2)charles将自己的电脑设置成代理服务器,windows环境下使用Fiddler软件,
使用get方式发送密码很不安全,get的URL数据一般都会保存在服务器的access log中,所以黑客一旦攻击啦服务器,只需要扫描access log,则可以轻易获得所有用户的明文密码
3)防止通讯协议被轻易破解
通讯协议被破解,开发者可以选择类似Protobuf,Goole提供的一个开源数据交换格式,对于传输的内容进行一定程度的加密,一增加黑客破解协议的难度。
4)本地文件和数据安全
javaScript的安装包解压可以看到源代码,要对javaScript进行混淆和加密,防止被篡改。
本地数据应该加密存储或者将其保存到keychain中,以保证其不被篡改。
5)通过file,class-dump,theos,otool等工具,黑客就可以分析编译之后的二进制程序文件,IDA是一个收费的反汇编工具,可以采取的措施是,关键逻辑使用纯C实现。
9。基于CoreText排版引擎
CoreText是一个处理文字和字体的底层技术,Quartz是一个2D图形渲染引擎。
使用CoreText排版的是,例如:新浪微博客户端,多看阅读客户端,猿题库都是基于CoreText来排版的,用drawRect方法,就是画图。
复杂的排版引擎分为4类
1)一个是显示用的类,仅负责显示内容,不负责排版;
2)一个模型类,用于承载显示所需要的所有数据
3)一个排版类,用于实现文字内容的排版;
4) 一个配置类,用于实现一些排版时的可配置项。
分成如下:
1)CTFrameParserConfig类,用于配置绘制的参数,例如文字颜色,大小,行间距等
2)CTFrameParser类,用于生成最后回执界面需要的CTFrameRef;
3) CoreTextData类,用于保存由CTFrameParser类生成的CTFrameRef实例,以及CTFrame实际回执需要的高度;
4)CTDisplayView类,持有CoreTextData类的实例,负责将CTFrameRef绘制到界面上
注意:修改CTView的frame信息,需要把use Autolayout的勾选去掉。
(五)实战技巧
1.撤销正在审核的应用;
点击Reject this binary
2.申请加急审核
1)点击Contact us;
2)APP Review;
3)request Expedited review
5) request an expedited app review可加急审核应用。
3.删除设备
每年只有一次机会,延续费用之后第一次登录进去,membersship year开始后即可使用,需要先删除设备,才能新加设备,一旦开始添加,删除不管用。给苹果发邮件,http://developer.apple.com/contact/点击"program benefits"按钮提交,
4)把应用下架
应用上架时间改变
5)收键盘
[self.view endEditing:YES];
[[UIApplication sharedApplication]sendAction:@selector(resignFirstResponder) to:nil for:nil forEvent:nil];
[[UIApplication sharedApplication]endEditing:YES];
6.NSJSONSerialization比NSKeyedArchiver更好在选择持久化方案,快啦7倍
7.修改长按后的中文变英文问题:
用vim打开info.plist,在文件中增加CFBundleLocalizations zh_CN en
8.调用系统方法实现截屏,实现半透明效果
9.内存优化CABackingStore,volatile表示,这块内存可能再次被原变量使用。
10类方法的block不会产生循环引用问题。
11Xcode的快捷键,Behaviors 设置各种行为发生界面应该做何种改变。
12,JavaScript文件设置调整
js后缀的文件默认被拖动到工程中后,是在编译列表,而不是在资源列表。需要手工调整其位置,否则就不能导报到ipa文件中,js不需要编译,需要手工将这个js文件从compile Source移动到copy Bundle Resources.
13.清除DerivedData
缓存路径 ~/Library/Developer/Xcode/DerivedData
工程进行git merge 或者git rebase的时候造成缓存异常。清除缓存后重启Xcode就可以啦
14.target信息异常
编译target异常的时候,可删除UourProjectName.xcodeproj/xcuserdata目录,该目录下有当前用户的各种工程状态信息,删除后重启Xcode,信息会自动重建。
15.下载Xcode https://developer.apple.com/downloads/index.action
16.调剂技巧
1)Opt+Shift可以调出双指拖动效果
2)Opt 可以在模拟器中调出双指放大和缩小效果
3)Shift + cmd + H到Home键
4)Cmd + Left/Right 切换横竖屏
17.xib删除后,并不会立马删除,需要删除应用后重新启动。
18.图片可以直接从Finder拖到模拟器中
19.真机模拟慢网速 :设置-开发者-Status-Network Link Conditioner 中,如果在真机中没有找到,在电脑的Xcode的Origanizer将其设置成测试设备
20.ipa文件格式
把ipa文件名的后缀改成zip,然后双击及可解压打开,解压后再程序的Payload目录下,是一个app后缀的文件夹,在该文件上单击右键选择show Package Contents 即可看到所有的程序资源文件。
21.查看ipa的图片
用命令来解压图片pngcrush -revert -iphone -optimizations 源文件名 目的文件名
22.为项目增加Daily Build
1)保证每天提交代码的可用性
2)进度跟进,产品可以跟进进度,产品经理更多时间来调整他的设计。
3)确认需求,产品经理可以尽早确认开发的功能细节是否符合预期。
4)测试跟进,测试人员可以尽早进行测试。
Xcode提供啦build命令,用xcodebuild -usage可以查看到所有的可用参数。
在Daily Build中,把Release用为Configuration其实不是很好。因为Release证书可能经常会被修改。我们可以基于Release的Configuration。在Info一栏,在Configuration一栏的下方点击+,然后选择Duplicate Release Configuration,新建名为DailyBuild的Configuration.
用xcodebuild -configuration DailyBuild -target "YourProduct"
在bulid里面就会出现一个.app文件啦。这个就是build成功之后的程序文件。
23.生成安装包
使用item-services协议来直接在iphone/ipad上安装应用程序。
24。找不到开发证书。
把开发者证书从登陆拖动到系统栏中
25.可安装脚本自动执行Daily build ,可以参考自动打包脚本ios-makefile 网址https://github.com/lexrus/ios-makefile。
26.用脚本自动生成小尺寸的图片
1)第三方软件XnConvert
2)安装imagemagick,先用brew install imagemagick
27.检查图片尺寸是否都是偶数
28.代码片段管理
通过快捷键Cmd + Ctrl+Opt + 2调出来。
29.定义自己的代码片段
1)使用git管理代码片段,将自己整理的代码片段都放到Git上,
(六)底层原理
1.isa指针
2.Ruby语言
3.系统相关的API及应用
1)isa swizzling的应用
系统提供的KVO的实现,就利用啦动态地修改isa指针的值的技术。
2)Method Swizzling API说明
特定版本有问题的系统库函数打了Patch.
3)Nimbus工具类库
4)大众点评,自己开发的基于Wax修改而来的WaxPatch,可以实现通过服务器更新来动态修改客户端的逻辑,WaxPatch主要是修改了Wax中的wax_instance.m文件在其中加入了class_replaceMethod来替换原始实现,从而修改客户端的原有行为。
4.Tagged Pointer对象
32位升级到64位,为了改进上面提到的内存占用和效率的问题,苹果提出Tagged Pointer对象,WWDC2013年的视频有介绍,
5.64位下的指针优化
32位环境下,对象的引用计数都保存在一个外部的表中,每一个对象的Retain操作,实际上都包括如下5个步骤
1)获得全局的记录引用计数的hash表
2)为了线程安全,给该hash表加锁
3)查找到目标对象的引用计数值
4)将该引用计数值+1,写会hash表
5)给该hash表解锁
参考文献:https://mikeash.com/pyblog/friday-qa-2013-09-27-arm64-and-you.html
6.block对象模型
1)Block内部数据结构定义
https://llvm.org/svn/llvm-project/compiler-rt/tags/Apple/Libcompiler_rt-10/BlocksRuntime/Block_private.h
6层
1))isa指针,实现对象相关功能
flags,用于按bit位表示一些block的附加信息,
reserved,保留变量
invoke,指向具体的block实现的函数调用地址
descriptor,表示该block的附加描述信息,主要是size,copy,dispose函数的指针
variables,capture过来的变量,block能访问它外部的局部变量,就是因为将这些变量(或变量的地址)复制到了结构体中
2)3种类型的Block
全局的静态block,不会访问任何外部变量;保存在栈中的block,当函数返回时会被销毁;保存在堆中的block,当引用计数为0时会被销毁。
3)用clang分析block实现
用clang工具可以将object-c 的源代码改写成c语言,clang -rewrite -objc block.c
7.参考文献
1)https://llvm.org/svn/llvm-project/
2)http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-1/
3)http://rypress.com/tutorials/objective-c/blocks