當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀] 本文面向已有其它語(yǔ)言(如Java,C,PHP,Javascript)編程經(jīng)驗(yàn)的iOS開發(fā)初學(xué)者,初衷在于讓我的同事一小時(shí)內(nèi)了解如何開始開發(fā)iOS App,學(xué)習(xí)目標(biāo)包括:

 本文面向已有其它語(yǔ)言(如Java,C,PHP,Javascript)編程經(jīng)驗(yàn)的iOS開發(fā)初學(xué)者,初衷在于讓我的同事一小時(shí)內(nèi)了解如何開始開發(fā)iOS App,學(xué)習(xí)目標(biāo)包括:

能使用Xcode IDE、模擬器

能修改、調(diào)試已有iOS App

能在已有應(yīng)用內(nèi)創(chuàng)建新模塊

能創(chuàng)建新應(yīng)用

能發(fā)布應(yīng)用到App Store

本文不包含任何高級(jí)的iOS開發(fā)知識(shí),已學(xué)會(huì)iOS開發(fā)的同學(xué)不要看,看完這篇文章學(xué)會(huì)了的同學(xué)也不用再看了。

不僅是學(xué)習(xí)一門新語(yǔ)言

有過腳本開發(fā)經(jīng)驗(yàn)的人(如Javascript,PHP,Shell)在剛開始學(xué)習(xí)iOS開發(fā)的時(shí)候,會(huì)覺得iOS開發(fā)的學(xué)習(xí)曲線比腳本語(yǔ)言要高,是的,這種感覺是對(duì)的。因?yàn)閷W(xué)iOS開發(fā),不僅是學(xué)習(xí)一門新語(yǔ)言,它包括:

一門語(yǔ)言:Objective-C

一個(gè)框架:Cocoa Touch

一個(gè)IDE:Xcode

初學(xué)腳本語(yǔ)言通常不會(huì)來(lái)繪制圖形界面、與人交互,iOS如果不做圖形界面,像腳本語(yǔ)言一樣處理文本操作數(shù)據(jù)庫(kù),就沒啥意思了。

所以,過去我寫別的新手入門教程,通常都是寫《XXX入門15分鐘教程》,而iOS就要花數(shù)倍的時(shí)間來(lái)寫了。

環(huán)境準(zhǔn)備

做iOS開發(fā)一定要有蘋果的軟件環(huán)境:Mac OS操作系統(tǒng)、Objective-C編譯器、設(shè)備模擬器等,開發(fā)工具倒不一定要用Xcode,只要是個(gè)源代碼編輯工具就行(vim都行,只是沒Xcode那么多功能)。

Mac OS

擁有Mac OS環(huán)境最簡(jiǎn)單的方法是找一臺(tái)蘋果電腦,包括iMac, MacBook Pro, MacBook Air, Mac Mini,但不包括蘋果的移動(dòng)設(shè)備(iPod Touch, iPhone, iPad, iPad Mini,它們運(yùn)行的是iOS系統(tǒng),不是Mac OS),蘋果電腦在出廠的時(shí)候就會(huì)預(yù)裝Mac OS,目前最新版本是Mac OS X 10.8,主流的版本還有Mac OS X 10.6、Max OS X 10.7。

如果囊中羞澀,可以借一臺(tái),或者上淘寶買個(gè)二手的。

黑蘋果

提到iOS開發(fā)入門,似乎沒辦法不說黑蘋果。所謂黑蘋果,就是把Mac OS改造后安裝在非蘋果的硬件上,這是違反DMCA法案的,黑蘋果的更多資料,可以在維基上找到

蘋果電腦價(jià)格高,國(guó)內(nèi)軟件開發(fā)者生存壓力大,所以黑蘋果在國(guó)內(nèi)也有一些真實(shí)的存在,國(guó)外當(dāng)然也有啦。

黑蘋果基本可以勝任iOS開發(fā),但有一些問題:

安裝黑蘋果是非法的

個(gè)人行為蘋果公司一般不會(huì)追究,但會(huì)遭同行的鄙視

黑蘋果超級(jí)難裝,挑硬件。即使完全相同的型號(hào),相同的批次,也有可能A機(jī)器裝上了,B機(jī)器裝不上

黑蘋果系統(tǒng)多少都存在一些使用上的問題,像驅(qū)動(dòng)Bug啦、待機(jī)恢復(fù)藍(lán)屏啦、上網(wǎng)瀏覽有問題啦

黑蘋果不能隨意升級(jí),可能升級(jí)一次safari就導(dǎo)致整個(gè)系統(tǒng)崩潰了

上面這些雖然不會(huì)直接影響Xcode寫代碼、模擬器測(cè)試,但寫著寫著想上網(wǎng)查個(gè)東西的時(shí)候,safari不能翻頁(yè),確實(shí)挺影響心情的。所以,錢包允許的前提下,還是搞個(gè)蘋果電腦省心一些。

Xcode 和 模擬器

Xcode可以在蘋果官網(wǎng)免費(fèi)下載:Xcode下載地址

安裝Xcode時(shí)會(huì)自動(dòng)安裝iOS SDK和模擬器。

這么強(qiáng)大的IDE居然是免費(fèi)的,還是挺讓人開心的。

從改一個(gè)現(xiàn)成的應(yīng)用開始吧

學(xué)一門新軟件開發(fā)技能,能夠第一時(shí)間做出一個(gè)可運(yùn)行的產(chǎn)品非常重要,有助于給自己正面激勵(lì),我上大學(xué)的時(shí)候,有很多次想學(xué)一門新語(yǔ)言,往往花了半個(gè)月,還沉浸在數(shù)據(jù)類型和語(yǔ)法字典里,連第一個(gè)Hello World都沒做出來(lái)。

這一次,就讓我們從改一個(gè)現(xiàn)成的應(yīng)用開始吧。

下載

首先,我們從蘋果開發(fā)者中心下載一個(gè)示例代碼回來(lái)。我選了ToolBarSearch。

在本文檔的末尾,還有一些其它的網(wǎng)址可以下載開源iOS產(chǎn)品或者代碼段,但我試了一下,還是Apple Sample Code最容易成功。

下載回來(lái)的zip文件最好保存在"下載"或者"文稿"目錄里,因?yàn)樵贛ac OS 10.8以前,有些目錄(例如/var/private/tmp)在Finder中是看不到的,要通過Finder的“前往 > 前往文件夾”功能才能進(jìn)入。

打開

有三種方式可以打開一個(gè)iOS Project

雙擊project文件

打開Finder,進(jìn)入剛剛下載解壓的ToolBarSearch目錄,找到ToolBarSearch.Xcodeproj文件,雙擊之,Xcode會(huì)自動(dòng)啟動(dòng),并打開這個(gè)項(xiàng)目

在Xcode里選擇Project打開

在Xcode沒啟動(dòng)的情況下(如果Xcode已經(jīng)啟動(dòng)了,就先按Command Q退出),啟動(dòng)Xcode,會(huì)彈出“Welcome to Xcode”的歡迎頁(yè),點(diǎn)擊左下角的“Open Other”按鈕,找到ToolBarSearch目錄,雙擊ToolBarSearch目錄,或者雙擊ToolBarSearch.Xcodeproj文件都可以

如果Xcode處于打開狀態(tài),可以點(diǎn)擊其菜單欄的File -> Open,或者File -> Open Recent,然后再選擇要打開的項(xiàng)目

通過命令行打開

在Mac OS 10.8以前,有些目錄(例如/var/private/tmp),在Finder和Xcode的File > Open對(duì)話框中,點(diǎn)擊鼠標(biāo)是找不到的,這時(shí)候就要通過命令行終端來(lái)打開了。

打開終端,執(zhí)行:

cd /ToolBarSearch的父目錄/ToolBarSearch

open -a Xcode

open -a是mac os的系統(tǒng)命令,除了iOS項(xiàng)目,別的項(xiàng)目也可以這樣打開。

運(yùn)行剛下載的應(yīng)用

點(diǎn)擊Xcode左上角的Run按鈕(或者同時(shí)按下Comman和R鍵),Xcode會(huì)編譯源碼并在模擬器中運(yùn)行這個(gè)應(yīng)用。

編譯成功會(huì)在屏幕上淡淡地顯示“Build Succeeded”。反之,失敗就顯示“Build Failed”且不啟動(dòng)模擬器。

修改

在模擬器上看到“Performed search using…”了吧,下面我們改掉它。

在Xcode左上角的Run按鈕下方,有一排小按鈕,從左到右第三個(gè)是一個(gè)放大鏡圖標(biāo),鼠標(biāo)移上去會(huì)顯示“Show the Search Navigator”,點(diǎn)一下它,打開搜索界面,在它下方出現(xiàn)的Find輸入框中輸入“performed”

搜索結(jié)果只有一條:ToolbarSearchViewController.m,點(diǎn)文件名下方被高亮的“Performed”字串,右側(cè)代碼編輯區(qū)會(huì)自動(dòng)打開這個(gè)文件,并滾動(dòng)屏幕,使包含“Performed”的這一行出現(xiàn)在編輯區(qū)的中間。

修改雙引號(hào)里的字串,隨便改成啥,然后按“Command S”保存。

當(dāng)然,這些操作,你也可以在終端下通過grep和vim完成。

運(yùn)行修改后的應(yīng)用

按Command R運(yùn)行,看看,是不是看到效果啦?

是的,修改一個(gè)應(yīng)用就這么簡(jiǎn)單。

Objective-C

Objective-C是蘋果應(yīng)用軟件(包括蘋果電腦上的Mac OS App和移動(dòng)設(shè)備上的iOS App)的開發(fā)語(yǔ)言。它是一種面向?qū)ο蟮木幊陶Z(yǔ)言。

蘋果公司還提供了一個(gè)軟件,叫Interface Builder,簡(jiǎn)稱IB,用于可視化的界面制作,就像用Dreamweaver做網(wǎng)頁(yè),或者像Visual Basic做桌面軟件一樣。后來(lái)IB就整合進(jìn)了Xcode,成了Xcode的一部分。這篇文檔不講IB,只講Objective-C,因?yàn)椋?/p>

基本上,每一本講iOS開發(fā)的書(紙質(zhì)書、電子書),都有大量的截圖一步一步教如何用IB開發(fā)iOS應(yīng)用,而講Objective-C開發(fā)應(yīng)用的書卻沒有那么多。

IB可以用來(lái)直觀方便地畫界面、設(shè)置控件屬性、建立代碼與控件的聯(lián)系,但后臺(tái)的業(yè)務(wù)邏輯和數(shù)據(jù)處理仍然要靠Objective-C,可見,不管用不用IB,Objective-C都是繞不過去的。

C的超集

Objective-C擴(kuò)展了ANSI C,是C的超集,也就是說:

任何C源程序,不經(jīng)修改,即可通過Objective-C編譯器成功編譯

Objective-C源程序中可以直接使用任何C語(yǔ)言代碼

除了面向?qū)ο笥姓Z(yǔ)法是SmallTalk風(fēng)格的(下面會(huì)講到),其它非面向?qū)ο蟮恼Z(yǔ)法、數(shù)據(jù)類型,與C完全相同,所以本文就不再贅述。 來(lái)看一個(gè)經(jīng)典的Hello World示例吧:

#import

int main(int argc, char *argv[]){

@autoreleasepool{

NSLog(@"Hello World!");

}

return 0;

}

是不是仿佛穿越回了大一學(xué)習(xí)C語(yǔ)言的時(shí)代,看起來(lái)和C幾乎沒有區(qū)別,是吧?是的,因?yàn)檫€沒用到它的面向?qū)ο筇匦?,哈?

SmallTalk的消息傳遞語(yǔ)法風(fēng)格

Objective-C的面向?qū)ο笳Z(yǔ)法源自SmallTalk,消息傳遞(Message Passing)風(fēng)格。在源碼風(fēng)格方面,這是它與C Family語(yǔ)言(包括C/C++、Java、PHP)差別最大的地方。

在Java、C++世界,我們調(diào)用一個(gè)對(duì)象的某方法,在Objective-C里,這稱作給類型發(fā)送一個(gè)消息,這可不僅僅是文字游戲,他們的技術(shù)細(xì)節(jié)也是不同的。

在Java里,對(duì)象和方法關(guān)系非常嚴(yán)格,一個(gè)方法必須屬于一個(gè)類/對(duì)象,否則編譯是要報(bào)錯(cuò)的。而在Objective-C里,類型和消息的關(guān)系比較松散,消息處理到運(yùn)行時(shí)(runtime)才會(huì)動(dòng)態(tài)決定,給類型發(fā)送一個(gè)它無(wú)法處理的消息,也只會(huì)拋出一個(gè)異常,而不會(huì)掛掉。

[obj undefinedMethod];

在代碼里調(diào)用沒定義的方法(這是Java世界的習(xí)慣說法啊,專業(yè)的叫法是,給obj對(duì)象傳遞它無(wú)法處理的消息),Xcode會(huì)警告,但編譯能成功,運(yùn)行的時(shí)候會(huì)出錯(cuò)。它會(huì)輸出這樣一個(gè)錯(cuò)誤:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSObject undefinedMethod]: unrecognized selector sent to instance 0x8871710'

類似Java的OOP概念

Objective-C中一些面向?qū)ο蟮母拍?,也可以在Java中找到類似的實(shí)現(xiàn)(只能說是類似,不是完全相同),我的讀者基本都是Java和PHP程序員,我會(huì)在下文中盡量用Java的概念來(lái)類比。

GoogleCode上有人整理了Java和Objective-C的概念、數(shù)據(jù)類型對(duì)應(yīng)表,參見這里

字符串

Objective-C里有字符串是由雙引號(hào)包裹,并在引號(hào)前加一個(gè)@符號(hào),例如:

title = @"Hello";

if(title == @"hello") {}

PHP程序員要注意,在這里不能用單引號(hào),即使只有一個(gè)字符也不能用。Objective-C與Java、C一樣,雙引號(hào)表示字符串。

函數(shù)調(diào)用

前文述及,不涉及面向?qū)ο髸r(shí),它和C是完全一樣的。以下是幾個(gè)函數(shù)調(diào)用的示例:

不帶參數(shù)

startedBlock();

帶參數(shù)

NSLog(@"decrypted string: %@", str);

CGRectMake(0,0,0,0);

傳遞消息給類/實(shí)例方法

不帶參數(shù)

[obj method];

對(duì)應(yīng)的Java版本

obj.method();

帶一個(gè)參數(shù):

[counter increase:1];

對(duì)應(yīng)的Java版本

counter.increase(1);

帶多個(gè)參數(shù)

對(duì)C Family程序員來(lái)說,這是最難接受的,最反人類的:

- (void) setColorToRed: (float)red Green: (float)green Blue:(float)blue {...} //定義方法

[myObj setColorToRed: 1.0 Green: 0.8 Blue: 0.2]; //調(diào)用方法

對(duì)應(yīng)的Java版

public void setColorToRedGreenBlue(float red, float green, float blue) {...}

myObj.setColorToRedGreenBlue(1.0, 0.8, 0.2);

消息嵌套

UINavigationBar *bar = [[[UINavigationBar alloc] init] autorelease];

對(duì)應(yīng)的Java版

UINavigationBar bar = UINavigationBar.alloc().init().autorelease();//Java沒有指針,所以星號(hào)去掉了

接口和實(shí)現(xiàn)

Objective-C的類分為接口定義和實(shí)現(xiàn)兩個(gè)部分。接口定義(Interface)放在頭文件中,文件擴(kuò)展名是.h,實(shí)現(xiàn)(implementation)放在實(shí)現(xiàn)文件中,文件擴(kuò)展名是.m(也有.mm的擴(kuò)展名,表示Objective-C和C++混編的代碼)。

接口定義也可以寫在.m文件中,但最好不要這么干

需要注意的是,與Objective-C的interface概念最接近的是C和C++里的頭文件,它與implementation是成雙成對(duì)出現(xiàn)的,作用是聲明類的成員變量和方法。它與Java的interface概念完全不同:

Objective-C里,interface有且只有一個(gè)實(shí)現(xiàn),Java的interface可以有0-N個(gè)實(shí)現(xiàn)

Objective-C里,interface可以定義成員屬性,Java里不可以

在Objective-C里,和Java的Interface概念相似的是Protocol,下文會(huì)講到。

請(qǐng)看示例:

Interface

@interface MyClass {

int memberVar1;

id memberVar2;

}

-(return_type) instance_method1;

-(return_type) instance_method2: (int) p1;

-(return_type) instance_method3: (int) p1 andPar: (int) p2;

@end

Implementation

@implementation MyClass {

int memberVar3;

}

-(return_type) instance_method1 {

....

}

-(return_type) instance_method2: (int) p1 {

....

}

-(return_type) instance_method3: (int) p1 andPar: (int) p2 {

....

}

@end

接口和實(shí)現(xiàn)以@interface、@implementation開頭,都以@end結(jié)束。“@”符號(hào)在Objective-C中是個(gè)很神奇的符號(hào)。

冒號(hào)也是方法名的一部分,method和method:是兩個(gè)不同的方法名,不是overload,第二個(gè)帶參數(shù)。

上述代碼對(duì)應(yīng)的Java版:

public class MyClass {

protected int memberVar1;

protected pointer memberVar2;

private int memberVar3;

public (return_type) instance_method1() {

....

}

public (return_type) instance_method2(int p1) {

....

}

public (return_type) instance_method3andPar(int p1, int p2) {

....

}

}

私有方法和公開方法

寫在.h頭文件里的方法都是公開的,Objective-C里沒有私有方法的概念(沒有你說個(gè)蛋啊,哈哈哈哈)。

官方并沒有提到Objective-C怎么實(shí)現(xiàn)私有方法,我查閱了stackoverflow,統(tǒng)一的答案是,要實(shí)現(xiàn)私有方法的效果只能借助Category,不過,根據(jù)我的測(cè)試,即使采用了Category,也不能阻止外部的代碼調(diào)用這個(gè)“私有方法”,只是Xcode不支持“私有方法”的自動(dòng)完成,并會(huì)有警告提示,運(yùn)行的時(shí)候,還是會(huì)成功的。各位看官知道有這么回事就可以了,這里不深講。

變量和屬性

類方法和實(shí)例方法

類方法

類方法就是Java、PHP里的Static Method,不用實(shí)例化就能調(diào)。類方法有一個(gè)加號(hào)前綴。 示例:

類定義

@interface MyClass

+(void) sayHello;

@end

@implementation MyClass

+(void) sayHello {

NSLog(@"Hello, World");

}

@end

使用

[MyClass sayHello];

實(shí)例方法

實(shí)例方法就是Java、PHP里的普通方法,必須實(shí)例化才能調(diào)。實(shí)例方法有一個(gè)減號(hào)前綴。 示例:

類定義

@interface MyClass : NSObject

-(void) sayHello;

@end

@implementation MyClass

-(void) sayHello {

NSLog(@"Hello, World");

}

@end

使用

mycls = [MyClass new];

[mycls sayHello];

Selector

selector就是一個(gè)方法指針,類似PHP里的動(dòng)態(tài)方法名:

class Hello {

public function sayHello() {}

public function test() {

$fun_name = "sayHello";

$this->$fun_name();

}

}

在Objective-C里,selector主要用來(lái)做兩類事情:

綁定控件觸發(fā)的動(dòng)作

@implementation DemoViewController

- (void)downButtonPressed:(id)sender {//響應(yīng)“按鈕被按下事件”的方法

UIButton *button = (UIButton*)sender;

[button setSelected:YES];

}

- (void)drawAnButton {

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

btn.frame = _frame;

btn.tag = 1;

btn.backgroundColor = [UIColor clearColor];

[btn addTarget: self

action: @selector(downButtonPressed:)

forControlEvents: UIControlEventTouchUpInside];//當(dāng)這個(gè)按鈕被按下時(shí),觸發(fā)downButtonPressed:方法

}

@end

延時(shí)異步執(zhí)行

@implementation ETHotDealViewController

- (void)viewDidLoad {

//獲取數(shù)據(jù)源

HotDealDataSource *ds = [[HotDealDataSource alloc]init];

[ds reload];

_items = ds.items;

[self performSelector: @selector(refreshTable)

withObject: self

afterDelay: 0.5];//延遲0.5秒調(diào)用refreshTable方法

}

-(void)refreshTable

{

[self.tableView reloadData];

}

@end

這個(gè)例子中,獲取數(shù)據(jù)源是通過ASIHTTP組件異步調(diào)用服務(wù)端HTTP接口,refreshTable要用到數(shù)據(jù)源返回回來(lái)的數(shù)據(jù),如果不延遲0.5秒,就會(huì)立刻執(zhí)行,執(zhí)行的時(shí)候數(shù)據(jù)還在路上呢,頁(yè)面就要變空白了。

繼承

繼承是寫在Interface定義里面的。語(yǔ)法為:子類名在左,父類名在右,中間用冒號(hào)分隔。 示例:

@interface MyClass : NSObject

@end

對(duì)應(yīng)的Java版本是:

public class MyClass extends NSObject {

}

協(xié)議(Protocol)

就是Java、PHP里的Interface。

協(xié)議的定義

協(xié)議的定義用@protocol關(guān)鍵字:

@protocol Printable

-(void)print:(NSString)str;

@end

對(duì)應(yīng)的Java版本是:

publilc interface Printable {

public void print(String str);

}

協(xié)議的繼承

協(xié)議本身也可以繼承別的協(xié)議:

@protocol Printable

-(void)print:(NSString)str;

@end

對(duì)應(yīng)的Java版本:

public interface Printable extends NSObject {

public void print (String str);

}

可選方法

協(xié)議可以包含可選方法,顧名思義,可選方法可以不被類實(shí)現(xiàn):

@protocol Printable

@optional

-(void)print:(NSString)str;

@end

加了@optional關(guān)鍵字,一個(gè)類在implements這個(gè)協(xié)議時(shí),便可以不實(shí)現(xiàn)print:方法。

Java里沒有類似的實(shí)現(xiàn),除了Collection里會(huì)有一些方法帶有optional的注釋,但Collection是個(gè)特例。

協(xié)議的實(shí)現(xiàn)

一個(gè)類實(shí)現(xiàn)某些協(xié)議是寫在Interface定義里面的。語(yǔ)法為:協(xié)議名用尖括號(hào)包裹,多個(gè)協(xié)議名用逗號(hào)隔開,協(xié)議寫在父類的右邊(如果沒有父類就直接寫在子類右邊)。

示例:

@interface class MyClass : NSObject

@end

Printable, Drawablw就是兩個(gè)協(xié)議。

對(duì)應(yīng)的Java版本是:

public class MyClass extends NSObject implements Printable, Drawable {

}

分類(Category)

分類可以給一個(gè)已經(jīng)存在的類增加方法,而不用去改它的源碼。Java和PHP中都沒有類似的特性。

比如說,NSObject是一個(gè)Objective-C內(nèi)置的系統(tǒng)類,我們想給它增加toJson方法,就像這樣:

頭文件:NSObject+Json.h

@interface NSObject (Json)

-(NSString)toJson;

@end

實(shí)現(xiàn)文件:NSObject+Json.m

@implementation NSObject (Json)

-(NSString)toJson {

//...

}

@end

使用的時(shí)候,只要包含NSObject+Json.h,實(shí)例化NSObject類,就可以使用toJson方法了:

import "NSObject+Json.h"

@implatementation XYZController

-(void)test {

NSObject *obj = [[NSObject alloc]init];

NSString *str = [obj toJson];

}

@end

當(dāng)然了,NSObject本來(lái)的那些方法依然還是可以用的,什么都沒變,只是多了個(gè)toJson方法??雌饋?lái)是不是和繼承沒太多差別呢(除了使用的時(shí)候?qū)嵗氖荖SObject,而不是JsonObject)?再看一個(gè)繼承實(shí)現(xiàn)不了的例子:

頭文件:NSObject+Json+XML.h

@interface NSObject (Json)

-(NSString)toJson;

@end

@interface NSObject (XML)

-(NSString)toXML;

@end

實(shí)現(xiàn)文件:NSObject+Json+XML.m

@implementation NSObject (Json)

-(NSString)toJson {

//...

}

@end

@implementation NSObject (XML)

-(NSString)toXML {

//...

}

@end

使用:

import "NSObject+Json+XML.h"

@implatementation XYZController

-(void)test {

NSObject *obj = [[NSObject alloc]init];

NSString *json = [obj toJson];

NSString *xml = [obj toXML];

}

@end

Cocoa Touch

Cocoa是Mac OS App的開發(fā)框架,Cocoa Touch是iOS開發(fā)用的框架,Cocoa Touch和Cocoa大部分是一樣的,只是Cocoa Touch多了一些移動(dòng)設(shè)備特有的東西,如:觸摸屏、加速度傳感器、GPS定位。Cocoa中多任務(wù)、多窗口的特性,在Cocoa Touch中也是沒有的(或者跟Cocoa不完全一樣的)。

就像學(xué)了Java語(yǔ)言還要再學(xué)一些Spring、Hibernate、Struts(或者其它類似的Java類庫(kù))才能開始做J2EE應(yīng)用一樣,學(xué)過Objective-C語(yǔ)言之后,也要再學(xué)習(xí)Cocoa Touch框架才能順利地開發(fā)iOS應(yīng)用。

最常用設(shè)計(jì)模式之Delegate

Cocoa Touch大量使用Delegate(委派)設(shè)計(jì)模式。

常用控件:按鈕、文本塊、圖片、輸入框

TableView

WebView

導(dǎo)航條

Xcode

運(yùn)行

快捷鍵:Comman R

搜索

搜索文本

搜索文件

新建文件/目錄

推薦在Finder中新建好的再添加進(jìn)來(lái)

斷點(diǎn)

模擬器和真機(jī)測(cè)試

模擬器測(cè)試

在Xcode中打開你的項(xiàng)目,在Xcode頂部工具欄的Stop按鈕(Run按鈕右邊那個(gè)黑色正方形按鈕)右邊,有個(gè)下拉菜單,顯示著 “ToolBarSearch > iPhone 5.0 Simulator” (即 你的應(yīng)用英文名 > 當(dāng)前選中的調(diào)試 ),點(diǎn)擊這個(gè)下拉菜單,選中iPhone 5.0 Simulator(這里的5.0是指iOS版本,不是iPhone5的意思,如果你的項(xiàng)目是iPad應(yīng)用,請(qǐng)選iPad 5.0 Simulator),再按“Run”按鈕,Xcode就會(huì)自動(dòng)把當(dāng)前正在編輯開發(fā)的應(yīng)用編譯并安裝到模擬器上。

在模擬器上操作時(shí),如果執(zhí)行過程中遇到了你在Xcode里設(shè)置的斷點(diǎn),模擬器會(huì)暫停運(yùn)行,并將當(dāng)前活動(dòng)窗口切換回Xcode,供你調(diào)試。

在Xcode里增加或者取消了斷點(diǎn),不需要重新編譯和安裝應(yīng)用即可生效。

切換被模擬的設(shè)備

模擬器的“硬件”菜單,可以選擇想要模擬什么設(shè)備,有iPad、iPhone可選。

Retina:表示視網(wǎng)膜屏,iPhone(Retina)代表iPhone4,iPhone4S

4-Inch:表示4英寸的iPhone,iPhone(Retina 4-Inch)就是iPhone 5

切換模擬的iOS版本

在模擬器的“版本”菜單,可以選擇要模擬什么版本的iOS。設(shè)備和版本是彼此獨(dú)立的,iPhone 4S可以有5.0,5.1,6.1幾種iOS版本,當(dāng)然了,iPhone 5不可能有4.3的iOS版本。

觸摸屏

用鼠標(biāo)點(diǎn)擊(不區(qū)分左右鍵)模擬器上的iPhone、iPad屏幕,就是在模擬用手指觸摸iPhone,iPad的屏幕,可以實(shí)現(xiàn)一些觸摸效果比如:

鼠標(biāo)單擊 等于 手指輕觸

鼠標(biāo)長(zhǎng)按 等于 手指長(zhǎng)按(例如你可以在模擬器上長(zhǎng)按應(yīng)用icon調(diào)出刪除應(yīng)用的確認(rèn)框)

鼠標(biāo)按住拖動(dòng) 等于 手指拖動(dòng)

雙擊和單擊模擬器的Home鍵也等于雙擊和單擊真機(jī)的Home鍵

多指手勢(shì)

多指手勢(shì)比較復(fù)雜,在白蘋果筆記本上可以模擬簡(jiǎn)單的雙指手勢(shì),白蘋果的觸控板天然支持多指觸摸,但要定位到模擬器的區(qū)域再響應(yīng)多指手勢(shì)就需要借助一些額外的鍵啦:

按住Option鍵,再用兩個(gè)手指去操作觸摸板,可模擬雙指拖動(dòng)、旋轉(zhuǎn)

按住Option+Shift,可模擬雙指合攏

輸入法和鍵盤

輸入中文

手機(jī)上特有的輸入法(比如九宮格輸入法)不能模擬。模擬器默認(rèn)的iOS軟鍵盤只有英文輸入,在測(cè)試應(yīng)用的時(shí)候,我們要用到中文,有兩個(gè)辦法:

使用剪貼板,在Mac OS里復(fù)制,再到模擬器運(yùn)行的應(yīng)用中的輸入框上長(zhǎng)按鼠標(biāo)(模擬手指長(zhǎng)按)3秒以上,等彈出“粘貼”的時(shí)候選擇之,即可。

在模擬器里,按Home鍵,找到Setting那個(gè)App icon(不是Mac OS頂部的模擬器菜單啊,那里沒有Setting的),打開被模擬iOS設(shè)備的設(shè)置,依次點(diǎn)擊”General - Keyboard - International Keyboards - Add New Keyboard…”,加個(gè)中文鍵盤,以后就可以使用被模擬iOS設(shè)備軟件盤輸入中文了,跟在iPhone/iPad真機(jī)上一樣。

使用Mac電腦的鍵盤

如果要輸入大量文本,使用模擬器里的軟鍵盤效率太低,這時(shí)候可以使用物理鍵盤,方法是:在Mac OS頂部的模擬器菜單欄,點(diǎn)擊”硬件”菜單,勾選下拉菜單中的“模擬硬件鍵盤”。以后再用模擬器運(yùn)行iOS應(yīng)用時(shí),點(diǎn)擊iOS應(yīng)用中的輸入框,軟鍵盤就不彈出來(lái)了,可直接使用Mac電腦的物理鍵盤輸入。

注意:

模擬器中的iOS接管了物理鍵盤輸入,所以,調(diào)用的是模擬器iOS的輸入法,不是你的Mac電腦的輸入法。打個(gè)比方,你的Mac OS裝的是搜狗五筆,模擬器中iOS加了個(gè)拼音輸入法(Add New Keyboard),那么,在iOS應(yīng)用中輸入中文會(huì)調(diào)用拼音輸入法。

要切換模擬器中iOS的中英文輸入法,也只能按iOS設(shè)備軟鍵盤上的小地球圖標(biāo),按Mac電腦上的Command+空格鍵是不行的。

地理位置

但Mac電腦沒有定位用的硬件(GPS)和軟件基礎(chǔ),因此模擬器不能自動(dòng)獲得當(dāng)前的地理位置,不能用模擬器測(cè)試定位功能。(注意,雖然WiFi也可以獨(dú)立定位——iPad WiFi版沒有GPS也可以定位,但Mac電腦的WiFi不具備定位相關(guān)的軟件)

要在模擬器里測(cè)試依賴地理位置的功能(如”我附近的xx”),可以手工指定一個(gè)經(jīng)緯度給模擬器,方法:在Mac電腦頂部的模擬器菜單,點(diǎn)擊”調(diào)試 - 位置 - 自定位置”,會(huì)彈出一個(gè)對(duì)話框,在彈出的框內(nèi)填入經(jīng)緯度即可。

如何獲得經(jīng)緯度? 上谷歌地圖(ditu.google.cn),在地圖上找到你想要的位置(比如你想知道杭州大廈的位置,就在通過搜索框找到杭州大廈),點(diǎn)擊右鍵,選擇“這兒是什么”,搜索框中就會(huì)出現(xiàn)這個(gè)位置的經(jīng)緯度了,前面是緯度,后面是經(jīng)度。咱們天朝的版圖,都是北緯和東經(jīng)。

攝像頭

Mac電腦有攝像頭,但Mac OS沒有設(shè)計(jì)API給iOS模擬器調(diào)用,所以,不能用模擬器測(cè)試對(duì)焦閃光燈等功能。

要在模擬器上測(cè)試依賴照片的功能,可以在代碼里做一個(gè)workaround,即當(dāng)代碼檢測(cè)到攝像頭不可用時(shí),彈出一個(gè)照片選擇器,讓測(cè)試人員從相冊(cè)里選擇一幅照片,來(lái)進(jìn)行后續(xù)的操作(如照片美化、人臉識(shí)別、條碼掃描)。

真機(jī)測(cè)試

模擬器能驗(yàn)證你開發(fā)的iOS應(yīng)用的大部分功能,但有些Mac設(shè)備上不具備的硬件,模擬器是不能模擬的。前文提到了一個(gè)繞過這些限制的辦法,但獲取當(dāng)前位置、拍照、加速度感應(yīng)這些是模擬不了的,一款應(yīng)用發(fā)布給消費(fèi)者之前,必須要在真實(shí)設(shè)備上驗(yàn)證過。

將未提交App Store審核通過的應(yīng)用安裝到iOS設(shè)備上測(cè)試,有三種辦法:

加入蘋果的Developer Program,成為付費(fèi)會(huì)員,有了這個(gè)付費(fèi)會(huì)員資格,就可以直接在Xcode中點(diǎn)擊”Run”將剛剛改過的代碼編譯打包安裝到開發(fā)測(cè)試用的iOS設(shè)備上。在iOS真機(jī)上操作被測(cè)試的程序能激活Xcode中設(shè)置的斷點(diǎn)。

越獄iOS設(shè)備。將iPhone和iPad越獄后,可以通過SSH直接上傳Xcode編譯好的ipa包(一個(gè)iOS App本質(zhì)上就是一個(gè)ipa包)。

越獄的iOS設(shè)備,配合破解過的Xcode,甚至可以實(shí)現(xiàn)和付費(fèi)開發(fā)者計(jì)劃一樣的功能:在Xcode上點(diǎn)擊”Run”,就自動(dòng)編譯安裝到iOS設(shè)備上去運(yùn)行了

企業(yè)部署方案。就像阿里巴巴的軒轅劍一樣,用iPhone/iPad訪問這個(gè)網(wǎng)址,點(diǎn)擊里面的軒轅劍鏈接就可以安裝軒轅劍這個(gè)應(yīng)用了。

破解Xcode是違法行為(越獄是合法的),而且挑版本挑得厲害,不是所有Xcode版本都能破解,也不是所有Xcode的破解版都能和越獄的iOS配合好。越獄+SSH上傳跟企業(yè)部署一樣效率低(部署效率低,無(wú)法激活Xcode中的斷點(diǎn)),只能用于QA驗(yàn)收,不適合開發(fā)自測(cè)。綜上所述,最適合開發(fā)實(shí)時(shí)測(cè)試的就是第一個(gè)正規(guī)途徑了。下面重點(diǎn)講這個(gè):

擁有一個(gè)開發(fā)者賬號(hào)

蘋果的Developer Program分為個(gè)人開發(fā)者和公司開發(fā)者,分別是每年99美元和每年299美元,分別可以注冊(cè)100臺(tái)和500臺(tái)蘋果測(cè)試設(shè)備。這個(gè)臺(tái)數(shù)限制在一個(gè)付費(fèi)年度內(nèi)不會(huì)清空,比如說,2013年4月1日付費(fèi)成功的,付費(fèi)會(huì)員資格在2014年3月31日之前有效,這期間,注冊(cè)一臺(tái)就少一個(gè)名額,哪怕這個(gè)設(shè)備注冊(cè)進(jìn)來(lái)用了之后一分鐘馬上又刪掉了,減少的這個(gè)名額也不會(huì)回來(lái)。

在交錢之前,最好問一下,周圍的同事,有沒有已經(jīng)交了錢的。如果有,你只需要注冊(cè)一個(gè)免費(fèi)的Apple ID(就是你在App Store安裝軟件用的Apple ID),請(qǐng)他發(fā)個(gè)邀請(qǐng)郵件給你,把你的Apple ID加入他的團(tuán)隊(duì)就可以了,蘋果會(huì)認(rèn)為你們兩個(gè)人是一個(gè)團(tuán)隊(duì)的,你們分別用自己的賬號(hào),共享100臺(tái)設(shè)備的限額,這是合法的。

安裝證書和私鑰

證書

不想看下面各種點(diǎn)擊各種頁(yè)面跳轉(zhuǎn)的直接用瀏覽器訪問證書管理,你要登錄你就用Apple ID登錄(前提是交過錢,或者找交了錢的人把你加入團(tuán)隊(duì)了)。

不嫌煩,或者想知道下次沒我這個(gè)文檔的時(shí)候怎么進(jìn)證書管理嗎?按這個(gè)步驟操作:進(jìn)入 蘋果開發(fā)者中心

點(diǎn)擊iOS Dev Center

點(diǎn)藍(lán)色“Login”按鈕,用你的Apple ID登錄,登錄成功會(huì)跳到 開發(fā)者首頁(yè)

點(diǎn)擊右上角的iOS Provisioning Portal(別找了,直接Command F搜索多好)

點(diǎn)左側(cè)菜單欄里的Certificates

頁(yè)面上有一個(gè)“Your Certificate”區(qū)域,下方有個(gè)Download圓角按鈕,這是你的個(gè)人證書,下載下來(lái)。再下面一行,有一句“If you do not have the WWDR intermediate certificate installed, click here to download now”,這個(gè)是蘋果的公共證書,也下下來(lái)。

雙擊下載回來(lái)的證書,裝證書時(shí),會(huì)提示你輸入密碼,這是【鑰匙串訪問工具】在問你要你的Mac OS賬號(hào)開機(jī)密碼(相當(dāng)于linux里面的sudo),不是Apple ID的密碼,不要搞錯(cuò)了。

安裝私鑰

如果你是和其它同事公用的賬號(hào),讓他給你一個(gè)私鑰即可,就是一個(gè)擴(kuò)展名為p12的文件,雙擊之,鑰匙串訪問會(huì)自動(dòng)出來(lái),需要你輸入一個(gè)密碼,這個(gè)密碼問給你p12文件的人要,不是你的Mac OS系統(tǒng)開機(jī)密碼,也不是你的Apple ID密碼。

將設(shè)備注冊(cè)到Provisioning Portal

打開Xcode,從Xcode的Window菜單中找到Organizer,打開之(Shift Command 2)。

把iOS設(shè)備連上電腦,Organizer會(huì)自動(dòng)識(shí)別出你的設(shè)備,并顯示在左側(cè)邊欄。

在Organizer左側(cè)邊欄找到你的設(shè)備,右鍵,點(diǎn)擊“Add Device to Provisioning Portal”,然后等Organizer提示你操作成功即可。(選中設(shè)備后,右邊設(shè)備詳情區(qū)域會(huì)顯示一個(gè)按鈕“Use for Development”,點(diǎn)它也可以)。

到iOS真機(jī)上運(yùn)行測(cè)試版程序

回到Xcode主界面,在Stop按鈕(Run按鈕右邊那個(gè)黑色正方形按鈕)右邊,有個(gè)下拉菜單,顯示著 “ToolBarSearch > iPhone 5.0 Simulator” (即 你的應(yīng)用英文名 > 當(dāng)前選中的調(diào)試 ),點(diǎn)擊這個(gè)下拉菜單,選中你的真機(jī)設(shè)備名,再按“Run”按鈕,Xcode就會(huì)自動(dòng)把當(dāng)前正在編輯開發(fā)的應(yīng)用編譯并安裝到真機(jī)上測(cè)試?yán)?

發(fā)布到App Store

打IPA包

IPA包本質(zhì)上是一個(gè)ZIP壓縮包,只不過它有著特殊的目錄結(jié)構(gòu),擴(kuò)展名是ipa,制作方法如下:

在Xcode中Build項(xiàng)目,快捷鍵Command B

在左側(cè)項(xiàng)目導(dǎo)航器中,展開Products文件夾,找到你要打包的應(yīng)用,你的應(yīng)用名.app,右鍵,選擇show in finder

到Finder中Copy這個(gè).app目錄(選中,按Command C),復(fù)制到一個(gè)你新建的名為Payload(區(qū)分大小寫)的文件夾中

找到你的應(yīng)用Logo,即一個(gè)512 * 512像素的PNG文件,copy到與Payload一起(與Payload并列,不要放進(jìn)Payload了),并重命名為iTunesArtwork(區(qū)分大小寫,沒有擴(kuò)展名)

將Payload目錄、ItunesArtwork文件打成一個(gè)zip包,并更改擴(kuò)展名為ipa

雙擊這個(gè)ipa文件,會(huì)用iTunes打開,如果打開成功,且在iTunes里有應(yīng)用Logo顯示,就成功了

批量自動(dòng)打包

除App Store外,還有許多其它的iOS應(yīng)用市場(chǎng)(如91助手,同步推等等),如果一個(gè)應(yīng)用需要發(fā)布到很多個(gè)應(yīng)用市場(chǎng),且他們的代碼略有不同(比如說,統(tǒng)計(jì)代碼不同),按上述方法手工修改源碼再打包,再還原,比較容易出錯(cuò)。好消息是,Xcode是有命令行的,我們可以寫一個(gè)shell腳本,先用se自動(dòng)修改源碼,再調(diào)用Xcode的命令行來(lái)編譯以得到y(tǒng)our——app.app目錄,最后調(diào)用zip、mv等命令把上一個(gè)章節(jié)講的ipa打包動(dòng)作自動(dòng)執(zhí)行。

閱讀應(yīng)用代碼

從頭新建一個(gè)應(yīng)用:Hello World

其它

代碼里的控件尺寸

iOS App里的控件尺寸和字體大小都是指Point,Retina設(shè)備(iPhone 4,4S,5;the new Pad)和非Retina設(shè)備(iPhone 3GS,iPad,iPad 2)的Point數(shù)是一樣的,盡管iPhone 4的分辨率是3GS的2倍。比如說,10point在Retina設(shè)備里是20 pixel,在非Retina設(shè)備(iPhone 3G)上則是10 pixel。

項(xiàng)目成員間交流時(shí),應(yīng)使用Point,不要使用pixel。

SVN操作含有@符號(hào)的文件

iOS應(yīng)用中經(jīng)常出現(xiàn)xxxx@2x.png這樣的文件名,它們是給retina設(shè)備用的高分辨率大圖,用svn命令行操作它們的時(shí)候會(huì)被@符號(hào)干擾,解決方案是在svn命令末尾加上一個(gè)@符號(hào),如:

svn del icon@2x.png@

svn info Default@2x.png@

如果一次移動(dòng)了幾十個(gè)png文件再svn commit的,可以用shell批處理:

svn status | awk '($1=="!"){print $2}' | grep -v @ | xargs svn del

上面這個(gè)命令是將文件名不包含@符號(hào)的,且已經(jīng)不在硬盤上的文件從svn version controll中刪掉

for file in `svn status | awk '($1=="!"){print $2}' `; do svn del $file"@"; done

上面這個(gè)命令是將文件名包含@符號(hào)的,且已經(jīng)不在硬盤上的文件從svn version controll中刪掉

svn add同上, 如法炮制即可.

Xcode中的代碼結(jié)構(gòu)與操作系統(tǒng)上的文件系統(tǒng)并不一致

推薦在Finder里建好目錄再到Xcode的Project Navigator中點(diǎn)擊“Add Files to”添加到項(xiàng)目中

iPhone 5適配

iPhone 5與之前的iPhone不一樣,采用了4寸Retina屏,所以它的Point數(shù)變成了320 * 568 points

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉