2016.02.28 16:51*字?jǐn)?shù) 4334閱讀 1109評論 1喜歡 10
(一)推薦的圖書
1.書里推薦的圖書:
Object-c程序設(shè)計(jì)
swift快速入門
跨越終端web
iOS測試指南
(二)推薦的博客和如何更好的學(xué)習(xí)iOS開發(fā)
1.提高iOS開發(fā)技能
1)閱讀博客
好的博客列表:https://github.com/tangqiaoboy/iOSBlogCN
2)讀書
每年至少堅(jiān)持讀完一本高質(zhì)量的iOS開發(fā)圖書
3)看WWDC視頻
4)看蘋果的官方文檔
5)看開源項(xiàng)目的代碼
除iOS開發(fā)本身知識外顶瞒,還可以學(xué)習(xí)設(shè)計(jì)模式和軟件架構(gòu)等
6)多寫代碼多思考
盡量保持寫的代碼都具有復(fù)用性。代碼因?yàn)闃I(yè)務(wù)需求需要變更時(shí)锈候,及時(shí)重構(gòu)崭放,在不要留下技術(shù)債的同時(shí)哟楷,多思考如何設(shè)計(jì)應(yīng)用結(jié)構(gòu)赌渣,保證滿足靈活多變的產(chǎn)品需求晓淀,在多次重構(gòu)和思考中怜瞒,會慢慢積出一系列的最佳解決辦法线罕,成為自己的寶貴經(jīng)驗(yàn)止潮。
7)多和同行交流
國內(nèi)的技術(shù)社區(qū)進(jìn)行交流,國外的Stack Overflow(http://www.stackoverflow.com)上提問或者回答問題钞楼。
8)分享
分享方式:發(fā)起一個(gè)開源項(xiàng)目喇闸,寫技術(shù)博客,在技術(shù)會議上做報(bào)告询件。
(三)摘要:iOS開發(fā)工具
1.CocoaPods
CocoaPods項(xiàng)目的源碼地址:https://github.com/CocoaPods/CocoaPods
可以節(jié)省設(shè)置和更新第三方開源庫的時(shí)間燃乍。
使用CocoaPods將用到的第三方庫放到profile的文件中,執(zhí)行pod install雳殊。會自動(dòng)下載下來
注意事項(xiàng):
1)關(guān)于.gitigonre
profile.lock只有在執(zhí)行pod update才會變更橘沥,執(zhí)行pod install不會改變,不能把profile.lock添加到.gitigonre中夯秃。
2)為自己項(xiàng)目創(chuàng)建podspec文件
參考:兩篇博文:《如何編寫一個(gè)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.網(wǎng)絡(luò)封包分的截取和分析工具Charles
方便開發(fā)中截取調(diào)試網(wǎng)絡(luò)請求內(nèi)容座咆,分析封包協(xié)議痢艺,以及模擬慢網(wǎng)速等。
官方網(wǎng)址:http://www.charlesproxy.com
1)可以模擬慢網(wǎng)速
2)截取SSL信息
3)修改網(wǎng)絡(luò)請求內(nèi)容
4)修改服務(wù)器返回內(nèi)容
5)Map功能 Map Remote網(wǎng)絡(luò)請求重新定義到另一個(gè)網(wǎng)址介陶,Map Local網(wǎng)絡(luò)請求重新定義到本地文件堤舒。
6)Rewrite對網(wǎng)絡(luò)請求的結(jié)果進(jìn)行改變
7)Breakpoints功能
3.Reveal
開發(fā)時(shí)可以動(dòng)態(tài)的查看和修改程序的界面,可以連接真機(jī)和模擬器
PonyDebugger和Spark Inspector也是同沒醒的界面調(diào)試工具哺呜,PonyDebugger開源并且免費(fèi)舌缤,Reveal和Spark Inspector是收費(fèi)的,不過功能更強(qiáng)大些
4.移動(dòng)統(tǒng)計(jì)工具Flurry
https://github.com/tangqiaoboy/FlurryUsageSample
1)每天登錄用戶數(shù)某残,應(yīng)用使用次數(shù)国撵;
2)使用iOS系統(tǒng)各版本(例如iOS6.0,iOS7.0等)比例。
3)使用iOS各種設(shè)備(例如iphone4,iphone5等)比例玻墅。
4)crashlog統(tǒng)計(jì)
5.崩潰日志記錄工具Crashlytics
專門為移動(dòng)應(yīng)用開發(fā)者提供的保存和分析應(yīng)用崩潰信息的專業(yè)工具介牙。
6.App Store統(tǒng)計(jì)工具App Annie
App Store數(shù)據(jù)的統(tǒng)計(jì)分析工具,該工具可以統(tǒng)計(jì)App在App Store的下載量澳厢,排名變化环础,銷售收入情況及用戶評價(jià)等信息。
7.Xcode插件
1)Alcatraz管理Xcode插件,http://blog.csdn.net/xiaoliuxingzi/article/details/46889429剩拢。
2)KSimageNamed ?彈出圖片
3)XVim 編輯窗口打開Vim Ctrl+W來切換當(dāng)前編輯的分欄
4)FuzzyAutocompletePlugin 使用模糊的方式自動(dòng)補(bǔ)全代碼
5)XToDo 提供一個(gè)匯總的界面线得,集中顯示所有的未完成的TODO和FIXME標(biāo)記
6)BBUDebuggerTuckAway 編輯代碼的時(shí)候自動(dòng)隱藏底部的調(diào)試窗口
7)SCXcodeswitchExpander 迅速的在switch語句中填充枚舉類型的每種可能的取值
8)deriveddata-exterminator清除Xcode緩存目錄的插件
9)VVDocumenter自動(dòng)生成代碼注釋的工具
10)ClangFormat自動(dòng)調(diào)整代碼風(fēng)格的工具
11)ColorSense實(shí)時(shí)預(yù)覽相應(yīng)的顏色
12)XcodeBoost 包含多個(gè)輔助修改小代碼的功能
9.其它工具介紹
1)取色工具,數(shù)碼測色計(jì)(DigitalColor Meter),蘋果自帶的類似有xScope
2)圖形工具ImageOptim免費(fèi)圖像壓縮工具,iOS工程默認(rèn)使用pngcrush來壓縮圖片徐伐,效率不高贯钩,
3)馬克鰻 免費(fèi)標(biāo)注工具,可以方便地在輸出的美術(shù)設(shè)計(jì)稿上標(biāo)注相應(yīng)界面元素的大小呵晨,顏色魏保,邊距熬尺,說明等摸屠。
4)Dash 快速查看API文檔和代碼片段管理工具。
5)蒲公英粱哼,內(nèi)測分發(fā)工具類似于TestFlight.
6)命令行工具季二,nomad方便操作蘋果開發(fā)者中心的命令行工具,添加測試設(shè)備揭措,更新證書胯舷,增加AppID,驗(yàn)證IAP的憑證。
7)xctool 可在github上下載绊含,開源的iOS編譯和測試的工具桑嘶,可方便進(jìn)行編輯和單元測試,將測試的結(jié)果集成到Jenkins中躬充,實(shí)現(xiàn)自動(dòng)化集成逃顶,蘋果在OSX Server上推出自動(dòng)化集成BOT讨便,效果不是很好。
8)appledoc是一個(gè)從源代碼中抽取文檔的工具以政,可從iOS工程的源代碼中抽取相應(yīng)的注釋霸褒,生成幫助文檔。
(四)有用的技術(shù)
1.內(nèi)存管理盈蛮,引用計(jì)數(shù)废菱。
Xcode檢測循環(huán)引用,使用Xcode的菜單欄選擇Product - Profile - Leaks,在單擊右下角的Profile按鈕開始檢測,在Instruments會檢測到這次的循環(huán)引用抖誉,Instruments中會用一條紅色的線條來表示一次內(nèi)存泄露的產(chǎn)生殊轴,切換到Leaks這一欄,點(diǎn)擊Cycles&Roots,就可以看到以圖形的方式顯示出來的循環(huán)引用袒炉,這樣我們就可以非常方便地找到循環(huán)引用的對象了梳凛。
ARC
需要使用_bridge等關(guān)鍵字
將非ARC的工程轉(zhuǎn)換成ARC,Xcode中使用Edit-Refactor-Convert to Object-c ARC
2.CoreFoundation對象的內(nèi)存管理
底層的內(nèi)存管理XXCreateWithXxx這樣的方式創(chuàng)建,底層的內(nèi)存管理梳杏。
3.GCD
4.UIWindowLevel
UIKIT_EXTERN const UIWindowLevel UIwindowLevelNormal;
切換到用戶的界面的時(shí)候需要輸入密碼韧拒,有隨書的筆記。需要用到UIWindow的情況有應(yīng)用啟動(dòng)頁十性,應(yīng)用內(nèi)通知提醒叛溢,輸入密碼。
5.動(dòng)態(tài)下載系統(tǒng)提供的多種中文字體
蘋果提供啦動(dòng)態(tài)下載代碼的Demo工程:http://developer.apple.com/library/ios/#samplecode/DownloadFont/Listings/DownloadFont_ViewController_m.html
6.使用應(yīng)用內(nèi)支付
1)配置后臺
2)配置iTunes Connect
3)iOS端的開發(fā)
4)服務(wù)器端開發(fā)
5)蘋果審核應(yīng)用時(shí)劲适,只會在沙盒(sandbox)環(huán)境購買楷掉,其產(chǎn)生的購買憑證,也只能連接蘋果的測試驗(yàn)證服務(wù)器霞势,但是審核的應(yīng)用又是連接的我們的線上服務(wù)器烹植,那應(yīng)該怎么處理?
解決辦法是判斷蘋果正式驗(yàn)證服務(wù)器的返回狀態(tài)碼愕贡,如果是21007草雕,則再一次連接測試服務(wù)器進(jìn)行驗(yàn)證即可,蘋果的文檔http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/RenewableSubscriptions
7.基于UIWebView的混合編程
1)模板引擎:MGTemplateEngine,也可以使用GRMustache固以,
2)Object-c和JavaScript語言的相互調(diào)用
原生界面發(fā)現(xiàn)以gap請求的地址墩虹,就不進(jìn)行加載,而是執(zhí)行相應(yīng)的調(diào)用邏輯憨琳。這也是Cordova框架調(diào)用的原生邏輯機(jī)制诫钓,
WebViewJavaScriptBridge它能實(shí)現(xiàn)相互調(diào)用
3)CommonJS規(guī)范
4)使用safari進(jìn)行調(diào)試
safari的調(diào)試模式打開,safari-preferences-Advanced 勾選上Show Develop menu in menu bar選項(xiàng)
在Iphone模擬器或者真機(jī)的設(shè)置上把調(diào)試模式打開篙螟,safari-高級-web檢查器
通過USB臉上電腦菌湃,safari的Develop菜單下就會多出相應(yīng)的菜單選項(xiàng)
8.安全性問題
1)安全的傳輸密碼,將密碼加密MD5
2)charles將自己的電腦設(shè)置成代理服務(wù)器遍略,windows環(huán)境下使用Fiddler軟件惧所,
使用get方式發(fā)送密碼很不安全场梆,get的URL數(shù)據(jù)一般都會保存在服務(wù)器的access log中,所以黑客一旦攻擊啦服務(wù)器纯路,只需要掃描access log或油,則可以輕易獲得所有用戶的明文密碼
3)防止通訊協(xié)議被輕易破解
通訊協(xié)議被破解,開發(fā)者可以選擇類似Protobuf驰唬,Goole提供的一個(gè)開源數(shù)據(jù)交換格式顶岸,對于傳輸?shù)膬?nèi)容進(jìn)行一定程度的加密,一增加黑客破解協(xié)議的難度叫编。
4)本地文件和數(shù)據(jù)安全
javaScript的安裝包解壓可以看到源代碼辖佣,要對javaScript進(jìn)行混淆和加密,防止被篡改搓逾。
本地?cái)?shù)據(jù)應(yīng)該加密存儲或者將其保存到keychain中卷谈,以保證其不被篡改。
5)通過file,class-dump,theos,otool等工具霞篡,黑客就可以分析編譯之后的二進(jìn)制程序文件世蔗,IDA是一個(gè)收費(fèi)的反匯編工具,可以采取的措施是朗兵,關(guān)鍵邏輯使用純C實(shí)現(xiàn)污淋。
9∮嘁矗基于CoreText排版引擎
CoreText是一個(gè)處理文字和字體的底層技術(shù)寸爆,Quartz是一個(gè)2D圖形渲染引擎。
使用CoreText排版的是盐欺,例如:新浪微博客戶端赁豆,多看閱讀客戶端,猿題庫都是基于CoreText來排版的冗美,用drawRect方法魔种,就是畫圖。
復(fù)雜的排版引擎分為4類
1)一個(gè)是顯示用的類墩衙,僅負(fù)責(zé)顯示內(nèi)容务嫡,不負(fù)責(zé)排版;
2)一個(gè)模型類漆改,用于承載顯示所需要的所有數(shù)據(jù)
3)一個(gè)排版類,用于實(shí)現(xiàn)文字內(nèi)容的排版准谚;
4) 一個(gè)配置類挫剑,用于實(shí)現(xiàn)一些排版時(shí)的可配置項(xiàng)。
分成如下:
1)CTFrameParserConfig類柱衔,用于配置繪制的參數(shù)樊破,例如文字顏色愉棱,大小,行間距等
2)CTFrameParser類哲戚,用于生成最后回執(zhí)界面需要的CTFrameRef;
3) CoreTextData類奔滑,用于保存由CTFrameParser類生成的CTFrameRef實(shí)例,以及CTFrame實(shí)際回執(zhí)需要的高度顺少;
4)CTDisplayView類朋其,持有CoreTextData類的實(shí)例,負(fù)責(zé)將CTFrameRef繪制到界面上
注意:修改CTView的frame信息脆炎,需要把use Autolayout的勾選去掉梅猿。
(五)實(shí)戰(zhàn)技巧
1.撤銷正在審核的應(yīng)用;
點(diǎn)擊Reject this binary
2.申請加急審核
1)點(diǎn)擊Contact us;
2)APP Review;
3)request Expedited review
5) request an expedited app review可加急審核應(yīng)用秒裕。
3.刪除設(shè)備
每年只有一次機(jī)會袱蚓,延續(xù)費(fèi)用之后第一次登錄進(jìn)去,membersship year開始后即可使用几蜻,需要先刪除設(shè)備喇潘,才能新加設(shè)備,一旦開始添加梭稚,刪除不管用响蓉。給蘋果發(fā)郵件,http://developer.apple.com/contact/點(diǎn)擊"program benefits"按鈕提交哨毁,
4)把應(yīng)用下架
應(yīng)用上架時(shí)間改變
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.調(diào)用系統(tǒng)方法實(shí)現(xiàn)截屏,實(shí)現(xiàn)半透明效果
9.內(nèi)存優(yōu)化CABackingStore,volatile表示扼褪,這塊內(nèi)存可能再次被原變量使用想幻。
10類方法的block不會產(chǎn)生循環(huán)引用問題。
11Xcode的快捷鍵话浇,Behaviors 設(shè)置各種行為發(fā)生界面應(yīng)該做何種改變脏毯。
12,JavaScript文件設(shè)置調(diào)整
js后綴的文件默認(rèn)被拖動(dòng)到工程中后幔崖,是在編譯列表食店,而不是在資源列表。需要手工調(diào)整其位置赏寇,否則就不能導(dǎo)報(bào)到ipa文件中吉嫩,js不需要編譯,需要手工將這個(gè)js文件從compile Source移動(dòng)到copy Bundle Resources.
13.清除DerivedData
緩存路徑 ~/Library/Developer/Xcode/DerivedData
工程進(jìn)行g(shù)it merge 或者git rebase的時(shí)候造成緩存異常嗅定。清除緩存后重啟Xcode就可以啦
14.target信息異常
編譯target異常的時(shí)候自娩,可刪除UourProjectName.xcodeproj/xcuserdata目錄,該目錄下有當(dāng)前用戶的各種工程狀態(tài)信息渠退,刪除后重啟Xcode,信息會自動(dòng)重建忙迁。
15.下載Xcode https://developer.apple.com/downloads/index.action
16.調(diào)劑技巧
1)Opt+Shift可以調(diào)出雙指拖動(dòng)效果
2)Opt 可以在模擬器中調(diào)出雙指放大和縮小效果
3)Shift + cmd + H到Home鍵
4)Cmd + Left/Right 切換橫豎屏
17.xib刪除后脐彩,并不會立馬刪除,需要?jiǎng)h除應(yīng)用后重新啟動(dòng)姊扔。
18.圖片可以直接從Finder拖到模擬器中
19.真機(jī)模擬慢網(wǎng)速 :設(shè)置-開發(fā)者-Status-Network Link Conditioner 中惠奸,如果在真機(jī)中沒有找到,在電腦的Xcode的Origanizer將其設(shè)置成測試設(shè)備
20.ipa文件格式
把ipa文件名的后綴改成zip恰梢,然后雙擊及可解壓打開佛南,解壓后再程序的Payload目錄下,是一個(gè)app后綴的文件夾删豺,在該文件上單擊右鍵選擇show Package Contents 即可看到所有的程序資源文件共虑。
21.查看ipa的圖片
用命令來解壓圖片pngcrush -revert -iphone -optimizations 源文件名 目的文件名
22.為項(xiàng)目增加Daily Build
1)保證每天提交代碼的可用性
2)進(jìn)度跟進(jìn),產(chǎn)品可以跟進(jìn)進(jìn)度呀页,產(chǎn)品經(jīng)理更多時(shí)間來調(diào)整他的設(shè)計(jì)妈拌。
3)確認(rèn)需求,產(chǎn)品經(jīng)理可以盡早確認(rèn)開發(fā)的功能細(xì)節(jié)是否符合預(yù)期蓬蝶。
4)測試跟進(jìn)尘分,測試人員可以盡早進(jìn)行測試。
Xcode提供啦build命令丸氛,用xcodebuild -usage可以查看到所有的可用參數(shù)培愁。
在Daily Build中,把Release用為Configuration其實(shí)不是很好缓窜。因?yàn)镽elease證書可能經(jīng)常會被修改定续。我們可以基于Release的Configuration。在Info一欄禾锤,在Configuration一欄的下方點(diǎn)擊+,然后選擇Duplicate Release Configuration私股,新建名為DailyBuild的Configuration.
用xcodebuild -configuration DailyBuild -target "YourProduct"
在bulid里面就會出現(xiàn)一個(gè).app文件啦。這個(gè)就是build成功之后的程序文件恩掷。
23.生成安裝包
使用item-services協(xié)議來直接在iphone/ipad上安裝應(yīng)用程序倡鲸。
24。找不到開發(fā)證書黄娘。
把開發(fā)者證書從登陸拖動(dòng)到系統(tǒng)欄中
25.可安裝腳本自動(dòng)執(zhí)行Daily build 峭状,可以參考自動(dòng)打包腳本ios-makefile 網(wǎng)址https://github.com/lexrus/ios-makefile。
26.用腳本自動(dòng)生成小尺寸的圖片
1)第三方軟件XnConvert
2)安裝imagemagick,先用brew install ?imagemagick
27.檢查圖片尺寸是否都是偶數(shù)
28.代碼片段管理
通過快捷鍵Cmd + Ctrl+Opt + 2調(diào)出來逼争。
29.定義自己的代碼片段
1)使用git管理代碼片段优床,將自己整理的代碼片段都放到Git上,
(六)底層原理
1.isa指針
2.Ruby語言
3.系統(tǒng)相關(guān)的API及應(yīng)用
1)isa swizzling的應(yīng)用
系統(tǒng)提供的KVO的實(shí)現(xiàn)氮凝,就利用啦動(dòng)態(tài)地修改isa指針的值的技術(shù)羔巢。
2)Method Swizzling API說明
特定版本有問題的系統(tǒng)庫函數(shù)打了Patch.
3)Nimbus工具類庫
4)大眾點(diǎn)評,自己開發(fā)的基于Wax修改而來的WaxPatch罩阵,可以實(shí)現(xiàn)通過服務(wù)器更新來動(dòng)態(tài)修改客戶端的邏輯竿秆,WaxPatch主要是修改了Wax中的wax_instance.m文件在其中加入了class_replaceMethod來替換原始實(shí)現(xiàn),從而修改客戶端的原有行為稿壁。
4.Tagged Pointer對象
32位升級到64位幽钢,為了改進(jìn)上面提到的內(nèi)存占用和效率的問題,蘋果提出Tagged Pointer對象傅是,WWDC2013年的視頻有介紹匪燕,
5.64位下的指針優(yōu)化
32位環(huán)境下,對象的引用計(jì)數(shù)都保存在一個(gè)外部的表中喧笔,每一個(gè)對象的Retain操作帽驯,實(shí)際上都包括如下5個(gè)步驟
1)獲得全局的記錄引用計(jì)數(shù)的hash表
2)為了線程安全,給該hash表加鎖
3)查找到目標(biāo)對象的引用計(jì)數(shù)值
4)將該引用計(jì)數(shù)值+1书闸,寫會hash表
5)給該hash表解鎖
參考文獻(xiàn):https://mikeash.com/pyblog/friday-qa-2013-09-27-arm64-and-you.html
6.block對象模型
1)Block內(nèi)部數(shù)據(jù)結(jié)構(gòu)定義
https://llvm.org/svn/llvm-project/compiler-rt/tags/Apple/Libcompiler_rt-10/BlocksRuntime/Block_private.h
6層
1))isa指針尼变,實(shí)現(xiàn)對象相關(guān)功能
flags,用于按bit位表示一些block的附加信息浆劲,
reserved,保留變量
invoke,指向具體的block實(shí)現(xiàn)的函數(shù)調(diào)用地址
descriptor嫌术,表示該block的附加描述信息,主要是size,copy,dispose函數(shù)的指針
variables,capture過來的變量牌借,block能訪問它外部的局部變量度气,就是因?yàn)閷⑦@些變量(或變量的地址)復(fù)制到了結(jié)構(gòu)體中
2)3種類型的Block
全局的靜態(tài)block,不會訪問任何外部變量;保存在棧中的block膨报,當(dāng)函數(shù)返回時(shí)會被銷毀磷籍;保存在堆中的block,當(dāng)引用計(jì)數(shù)為0時(shí)會被銷毀现柠。
3)用clang分析block實(shí)現(xiàn)
用clang工具可以將object-c 的源代碼改寫成c語言院领,clang -rewrite -objc block.c
7.參考文獻(xiàn)
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