1. 回答一個合格的IOS開發工程師應具備哪些條件
一、Objective-C
C語言是iOS開發的語言基礎,而Objective-C是iOS開發的標准語言,也是為眾多iphone開發工程師所公認的標准,所以必須要掌握。內容包括以下這些:
(1)Objective-C語言基礎;
(2)library,framework的製作;
(3)Runtime編程;
(4)LLVM原理和調優。
二、操作系統
操作系統使計算機系統所有資源最大限度地發揮作用,提供各種形式的用戶界面,使用戶有一個好的工作環境,為其它軟體的開發提供必要的服務和相應的介面。所以,必須對ISO操作系統很熟悉才行。包括以下方面的內容:
(1)iOS內存管理和調優;
(2)iOS的文件系統和沙盒機制;
(3)iOS多線程編程(Thread,GCD,NSOperation);
(4)iOS網路和伺服器編程(NSURLConnection,NSURLSession);
(5)iOS系統的各種安全機制。
三、網路編程
網路編程是學習iOS開發必須掌握的編程技巧,涉及到Htpps、Socket編程等;在這一部分處理的規范程度,直接影響到蘋果AppStore的審核。
(1)iOS網路發送機制調整和優化(NSURLSession);
(2)Socket編程;
(3)網路傳輸中的各種保障;
(4)對傳輸協議的調整優化。
四、資料庫&持久化方案
資料庫持久化就是把數據保存到可永久保存的存儲設備中,持久化的主要應用是將內存中的數據存儲在關系型的資料庫中。
(1)常規持久化方案(Keychain,NSUserDefaults,Sqlite,CoreData);
(2)資料庫的使用和設計(Sqlite);
(3)數據結構優化,Sql調優。
五、圖形圖像編程
iOS開發過程中,大部分的APP都是採用多視圖設計來完成的。所以要熟悉一些圖像的繪制:
(1)UIKit,CoreAnimation和CoreText的繪制;
(2)CoreGraphics,Quartz2D,MediaPlayer,AVFoundation;
(3)OpenGLES,GLKit,SpriteKit,SceneKit,Metal。
六、數據結構&演算法
懂得基本的演算法:
(1)基本的演算法和數據結構(排序搜索演算法,數組,隊列);
(2)較復雜數據結構的靈活應用(二叉樹,圖等);
(3)復雜的專項演算法(圖像識別演算法,拓撲定位等)。
七、業務能力
作為一名優秀或者說是及格的iOS程序員,必須要有一定的將功能需求轉化並實現的業務能力:
(1)一般性業務功能需求分析及實現;
(2)重要業務模塊的需求分析及實現;
(3)中小規模產品的架構,系統設計和實現;
(4)大規模產品或產品線的架構,系統設計和實現;
(5)平台級產品的架構,系統設計和實現。
八、安全方案
另外,還需要提供對數據安全方面有利的方案:
(1)本地數據存儲安全(Keychain);
(2)授權和身份驗證;
(3)傳輸安全(對稱,非對稱,SSL);
(4)App代碼安全。
九、專業素質
作為一名iOS工程師,需要具備一定專業素質,包括:
(1)團隊協作能力。軟體開發要求開發參與者間有一定默契度,從事自己工作之餘為其他同伴創造條件;
(2)溝通能力。能清晰的把你對項目的理解、開發中的問題等轉達給同事和用戶;
(3)強烈的好奇心和學習精神。IOS軟體開發的變化和創新幾乎是每時每刻的,優秀的程序員要適應和主動迎合行業變化的大環境;
(4)冷靜、細心。及時發現問題和判斷對策。
2. ios用什麼框架做socket開發
一般使用的網路數據傳輸中一般涉及到7層,分別為物理層、數據鏈路層、網路層、傳輸層、會話層、表示層和應用層。對於程序開發人員而言能夠用到的就是傳輸層,會話層,表示層和應用層。
http協議 對應於應用層
tcp協議 對應於傳輸層
ip協議 對應於網路層
上邊是我們每次網路請求中,各個協議在每個層中的應用,下邊的層都為上一層提供了傳輸基礎。上邊三層共同構成了一次網路請求(當然還有更底下的我們不做研究的層),而Socket則是對TCP/UDP,IP協議(即傳輸和網路層)的封裝,Socket本身並不是協議,而是一個調用介面(API),通過Socket,我們才能使用TCP/UDP,IP協議。
那麼這時候我們就一定要了解HTTP請求和Socket之間到底是怎麼樣的一個關系呢,又該怎麼理解呢?其實Http請求就是基於TCP/IP協議的一層的Socket再封裝,只是Socket在數據的傳輸過程中數據是無法識別的內容如果想要使傳輸的數據有意義,則必須使用應用層協議,應用層協議很多,有HTTP、FTP、TELNET等等,也可以自己定義應用層協議。而Http協議就是現在使用最廣泛的應用層協議,這樣我們的才保證了我們可以在網路請求中可以自定義收到的JSON/XML格式的數據。而Http請求實際上每次本質上就是先建立一次Socket長鏈接 然後接受數據包(因為TCP協議的數據傳輸是數據流可能是多個包的 Http通過請求頭會對包進行處理和組合),當數據包全部接收完成之後,通過協議轉換成我們想要的格式返回給我們,然後關閉長鏈接,這樣的一個流程完成一次Http請求。這個時候我們就會發現一個問題,只有我們主動的給伺服器端發送請求的時候服務端才會給我們響應返回數據。而且每次網路請求又會重新開啟TCP協議中的三次握手的過程,每次使用肯定是耗時的(當然現在基於Http2.0的多次網路請求可以減少握手次數)。但是也只是在每次Http之後還是會關閉Socket而且伺服器端都不能在我們沒有請求的情況下主動給我們發送消息,這個時候我們就可以使用Socket解決這個問題了。
如果我們建立了一個Socket長鏈接,不斷開伺服器端就能和我保持通訊了,這也就是我們現在用的及時通訊軟體和視頻是直播軟體實現的原理(當然視頻直播還涉及到很多其他的知識,一直覺得那才是iOS開發中最大的難點),現在我們知道了為什麼我們有了Http還要了解Socket,那麼接下來就開始介紹Socket底層的一些實現原理,我一直覺得iOS開發如果只是知道一些三方框架如何使用,在框架使用的過程中遇到了實際的問題,我們實際上是很難有實質上的思路去解決問題的,所以很多東西我想最好先從原理上去了解。
這時候我們就要做Socket變成就需要引入幾個知識點。
1.地址
1.地址在程序中,我們如何保存一個地址呢?在中的sockaddr便是描述socket地址的結構體類型.
/** [XSI] Structure used by kernel to store most addresses.*/
struct sockaddr {
__uint8_t sa_len; /* total length */
sa_family_t sa_family; /* [XSI] address family */
char sa_data[14]; /* [XSI] addr value (actually larger) */
};
為了方便設置用語網路通信的socket地址,引入了sockaddr_in結構體(對於UNIX Domain Socket則對應sockaddr_un)
/*
* Socket address, internet style.
*/
struct sockaddr_in {
__uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;//得是網路位元組序
struct in_addr sin_addr;//in_addr存在的原因則是歷史原因,其實質是代表一個IP地址的32位整數
char sin_zero[8];//bzero之,純粹是為了兼容sockaddr
};
在實際編程的時候,經常需要將sockaddr_in強制轉換成sockaddr類型。
2.埠
在本地的進程中,每一個進程都可以通過PID來標識,對於網路上的一個計算機中的進程如何標識呢?網路中的計算機可以通過一個IP地址進行標識,一個計算機中的某個進程則可以通過一個無符號整數(埠號)來標識,所以一個網路中的進程可以通過IP地址+埠號的方式進行標識。
3網路位元組序
談網路位元組序(Endianness)之前我們先說說什麼是位元組序。位元組序又叫端序,就是指計算機中存放 多位元組數據的位元組的順序。典型的就是數據存放在內存中或者網路傳輸時的位元組的順序。常用的位元組序有大端序(big-endian),小端序(litle-endian,另還有不常見的混合序middle-endian)。不同的CPU可能會使用不同的位元組序,如X86,PDP-11等處理器為小端序,Motorola 6800,PowerPC 970等使用的是大端序。小端序是指低位元組位存放在內存地址的低端,高端序是指高位位元組存放在內存的低端。 舉個例子來說明什麼是大端序和小端序: 比如一個4位元組的整數 16進制形式為 0x12345678,最左邊是高位。
大端序
低位 > > > > 高位
12 34 56 78
小端序
低位 > > > > 高位
78 56 34 12
TCP/IP 各層協議將位元組序使用的是大端序,我們把TCP/IP協議中使用的位元組序稱之為網路位元組序。 編程的時候可以使用定義在sys/_endian.h中的相關的介面進行本地位元組序和網路位元組序的互轉。
#define ntohs(x) __DARWIN_OSSwapInt16(x) // 16位整數 網路位元組序轉主機位元組序
#define htons(x) __DARWIN_OSSwapInt16(x) // 16位整數 主機位元組序轉網路位元組序
#define ntohl(x) __DARWIN_OSSwapInt32(x) //32位整數 網路位元組序轉主機位元組序
#define htonl(x) __DARWIN_OSSwapInt32(x) //32位整數 主機位元組序轉網路位元組序
以上聲明中 n代表netwrok, h代表host ,s代表short,l代表long
如果數據是單位元組的話,則其沒有位元組序的說法了。
4.半相關和全相關
半相關(half-association)是指一個三元組 (協議,本地IP地址,本地埠),通過這個三元組就可以唯一標識一個網路中的進程,一般用於listening socket。但是實際進行通信的過程,至少需要兩個進程,且它們所使用的協議必須一致,所以一個完成的網路通信至少需要一個五元組表示(協議,本地地址,本地埠,遠端地址,遠端埠),這樣的五元組叫做全相關。
5.網路編程模型
網路存在的本質其實就是網路中個體之間的在某個領域的信息存在不對等性,所以一般情況下總有一些個體為另一些個體提供服務。提供伺服器的我們把它叫做伺服器,接受服務的叫做客戶端。所以在網路編程中,也存在伺服器端和客戶端之分。
3. iOS如何實現網路編程
最簡單的網路鏈接,一個url,一個request,一個connection以及一個response返回。默認的是get請求。
.data轉碼問題
代理方法的實現
4. 編程軟體有哪些
一、編程軟體:
1、電腦編程軟體主要有:BASIC、PASCAL、C、COBOL、FORTRAN、LOGO以及VC、VB java等。
2、CC++ 常用軟體是MS VC++(6.0和更高版本)集成在微軟的開發工具visual studio中,JAVA桌面編程常用軟體是netbean,網路編程是MyEclipse(包括了常用的Eclipse和常用工具,目前Java最流行的網路編程軟體)。
3、C#沒有別的軟體,就是MS VC#,也集成在了Visual studio中,微軟官方有下載,有免費的學習版。
4、pascal就是Turbo Pascal。
二、編程開發工具:
1、關於C++的: CFREE(初學者適用),VC,MyC++,Magic C++,DevC++。
2、關於JAVA的:JBuilder、Eclipse、NetBeans IDE、JCreator+J2SDK、JDK、Tomcat、Weblogic、JRun。
3、關於C#的:VS Studio 系列(VS2003,VS2005,VS2008,VS2010,VS2011),SharpDevelop(開源的免費軟體)。
4、關於Delphi的:delphi2005。
5、關於C的:Turbo C 2。
5、關於PHP的:Dreamweaver_CS5、Notepad++。
7、關於VB的:visual basic 6.0。
8、關於匯編的:VisualASM。
9、關於VBS的:按鍵精靈2014。
(4)ios網路編程擴展閱讀:
1、可視化:可視化編程也越來越重要,所謂的可視化程序設計和Visual Basic或Visual C++並不同,支持可視化程序設計的IDE可以讓開發人員直接移動程序單元來建立流程圖和結構圖,然後直接做編譯或解釋,這一類的流程圖通常是以UML為基礎。
2、這樣的界面因為樂高的Mindstorms開始普及,一些公司也開始透過瀏覽器Mozilla和分布式程序設計(LabVIEW)往這方面努力。
3、從1980年代開始,第一個可視化程序設計系統—Max,就是以類比合成器的設計為榜樣,同時被用來開發即時音樂演出軟體。
4、這種方法也被用在專業軟體,例如Openlab,這類的使用者需要完整程序設計語言的彈性,並不想要傳統的學習曲線。
5、可視化程序設計語言有另一個半免費和開放源代碼的替代品-Mindscript,具有加密系統和連結資料庫等等。
6、智能手機:應用程序開發行業中最大的新熱潮是智能手機的應用程序「這種裝置通常需要開發人員使用一種可將裝置的功能發揮到極致的特定語言作為應用平台,至少要以官方認可的方式進行。
7、智能手機開發體系的一個新興產業正在崛起,即允許開發人員用非智能手機平台原生的其它語言編寫自己的代碼,然後轉化為原生語言的應用程序。
8、因為不需要學習任何特定的智能手機平台的官方應用程序開發語言,Web應用程序也沾了光,成為智能手機應用程序開發的一種方法。
9、選擇語言甚於平台的另一個方案是使用像諾基亞的N900這樣的設備,它運行Debian發行的Linux系統,可以運行的軟體范圍很寬——包括很多不是為智能手機設計的軟體。
10、隨著安卓和ios智能手機范圍的不斷擴大,安卓和ios編程人員企業急缺,3G夢工場軟體學院在華中地區最早開設了3G智能手機編程相關的課程,為對編程感興趣的人提供了一個學習平台。
參考資料來源:
網路-編程