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