美文网首页
(转载)学习唐巧的《iOS开发进阶》

(转载)学习唐巧的《iOS开发进阶》

作者: 一片枫叶随风舞 | 来源:发表于2017-09-22 11:47 被阅读0次

    作者Molary已关注

    2016.02.28 16:51*字数 4334阅读 1109评论 1喜欢 10

    (一)推荐的图书

    1.书里推荐的图书:

    Object-c程序设计

    swift快速入门

    跨越终端web

    iOS测试指南

    (二)推荐的博客和如何更好的学习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

    相关文章

      网友评论

          本文标题:(转载)学习唐巧的《iOS开发进阶》

          本文链接:https://www.haomeiwen.com/subject/xvtfextx.html