iOS開發(fā)60分鐘入門
本文面向已有其它語言(如Java,C幽邓,PHP炮温,Javascript)編程經(jīng)驗的iOS開發(fā)初學(xué)者,初衷在于讓我的同事一小時內(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
本文不包含任何高級的iOS開發(fā)知識棋枕,已學(xué)會iOS開發(fā)的同學(xué)不要看,看完這篇文章學(xué)會了的同學(xué)也不用再看了妒峦。
不僅是學(xué)習(xí)一門新語言
有過腳本開發(fā)經(jīng)驗的人(如Javascript重斑,PHP,Shell)在剛開始學(xué)習(xí)iOS開發(fā)的時候肯骇,會覺得iOS開發(fā)的學(xué)習(xí)曲線比腳本語言要高窥浪,是的,這種感覺是對的笛丙。因為學(xué)iOS開發(fā)漾脂,不僅是學(xué)習(xí)一門新語言,它包括:
- 一門語言:Objective-C
- 一個框架:Cocoa Touch
- 一個IDE:Xcode
初學(xué)腳本語言通常不會來繪制圖形界面胚鸯、與人交互骨稿,iOS如果不做圖形界面,像腳本語言一樣處理文本操作數(shù)據(jù)庫姜钳,就沒啥意思了坦冠。
所以,過去我寫別的新手入門教程哥桥,通常都是寫《XXX入門15分鐘教程》辙浑,而iOS就要花數(shù)倍的時間來寫了。
環(huán)境準(zhǔn)備
做iOS開發(fā)一定要有蘋果的軟件環(huán)境:Mac OS操作系統(tǒng)拟糕、Objective-C編譯器判呕、設(shè)備模擬器等倦踢,開發(fā)工具倒不一定要用Xcode,只要是個源代碼編輯工具就行(vim都行佛玄,只是沒Xcode那么多功能)硼一。
Mac OS
擁有Mac OS環(huán)境最簡單的方法是找一臺蘋果電腦,包括iMac, MacBook Pro, MacBook Air, Mac Mini梦抢,但不包括蘋果的移動設(shè)備(iPod Touch, iPhone, iPad, iPad Mini般贼,它們運行的是iOS系統(tǒng),不是Mac OS)奥吩,蘋果電腦在出廠的時候就會預(yù)裝Mac OS哼蛆,目前最新版本是Mac OS X 10.8,主流的版本還有Mac OS X 10.6霞赫、Max OS X 10.7腮介。
如果囊中羞澀,可以借一臺端衰,或者上淘寶買個二手的叠洗。
黑蘋果
提到iOS開發(fā)入門,似乎沒辦法不說黑蘋果旅东。所謂黑蘋果灭抑,就是把Mac OS改造后安裝在非蘋果的硬件上,這是違反DMCA法案的抵代,黑蘋果的更多資料腾节,可以在維基上找到
蘋果電腦價格高,國內(nèi)軟件開發(fā)者生存壓力大荤牍,所以黑蘋果在國內(nèi)也有一些真實的存在案腺,國外當(dāng)然也有啦。
黑蘋果基本可以勝任iOS開發(fā)康吵,但有一些問題:
- 安裝黑蘋果是非法的
- 個人行為蘋果公司一般不會追究劈榨,但會遭同行的鄙視
- 黑蘋果超級難裝,挑硬件晦嵌。即使完全相同的型號同辣,相同的批次,也有可能A機器裝上了耍铜,B機器裝不上
- 黑蘋果系統(tǒng)多少都存在一些使用上的問題邑闺,像驅(qū)動Bug啦、待機恢復(fù)藍(lán)屏啦棕兼、上網(wǎng)瀏覽有問題啦
- 黑蘋果不能隨意升級陡舅,可能升級一次safari就導(dǎo)致整個系統(tǒng)崩潰了
上面這些雖然不會直接影響Xcode寫代碼、模擬器測試伴挚,但寫著寫著想上網(wǎng)查個東西的時候靶衍,safari不能翻頁灾炭,確實挺影響心情的。所以颅眶,錢包允許的前提下蜈出,還是搞個蘋果電腦省心一些。
Xcode 和 模擬器
Xcode可以在蘋果官網(wǎng)免費下載:Xcode下載地址
安裝Xcode時會自動安裝iOS SDK和模擬器涛酗。
這么強大的IDE居然是免費的铡原,還是挺讓人開心的。
從改一個現(xiàn)成的應(yīng)用開始吧
學(xué)一門新軟件開發(fā)技能商叹,能夠第一時間做出一個可運行的產(chǎn)品非常重要燕刻,有助于給自己正面激勵,我上大學(xué)的時候剖笙,有很多次想學(xué)一門新語言卵洗,往往花了半個月,還沉浸在數(shù)據(jù)類型和語法字典里弥咪,連第一個Hello World都沒做出來过蹂。
這一次,就讓我們從改一個現(xiàn)成的應(yīng)用開始吧聚至。
下載
首先酷勺,我們從蘋果開發(fā)者中心下載一個示例代碼回來。我選了ToolBarSearch晚岭。
在本文檔的末尾鸥印,還有一些其它的網(wǎng)址可以下載開源iOS產(chǎn)品或者代碼段勋功,但我試了一下坦报,還是Apple Sample Code最容易成功。
下載回來的zip文件最好保存在"下載"或者"文稿"目錄里狂鞋,因為在Mac OS 10.8以前片择,有些目錄(例如/var/private/tmp)在Finder中是看不到的,要通過Finder的“前往 > 前往文件夾”功能才能進入骚揍。
打開
有三種方式可以打開一個iOS Project
雙擊project文件
打開Finder字管,進入剛剛下載解壓的ToolBarSearch目錄,找到ToolBarSearch.Xcodeproj文件信不,雙擊之嘲叔,Xcode會自動啟動,并打開這個項目
在Xcode里選擇Project打開
在Xcode沒啟動的情況下(如果Xcode已經(jīng)啟動了抽活,就先按Command Q退出)硫戈,啟動Xcode,會彈出“Welcome to Xcode”的歡迎頁下硕,點擊左下角的“Open Other”按鈕丁逝,找到ToolBarSearch目錄汁胆,雙擊ToolBarSearch目錄,或者雙擊ToolBarSearch.Xcodeproj文件都可以
如果Xcode處于打開狀態(tài)霜幼,可以點擊其菜單欄的File -> Open嫩码,或者File -> Open Recent,然后再選擇要打開的項目
通過命令行打開
在Mac OS 10.8以前罪既,有些目錄(例如/var/private/tmp)铸题,在Finder和Xcode的File > Open對話框中,點擊鼠標(biāo)是找不到的琢感,這時候就要通過命令行終端來打開了回挽。
打開終端,執(zhí)行:
cd /ToolBarSearch的父目錄/ToolBarSearch
open -a Xcode
open -a是mac os的系統(tǒng)命令猩谊,除了iOS項目千劈,別的項目也可以這樣打開。
運行剛下載的應(yīng)用
點擊Xcode左上角的Run按鈕(或者同時按下Comman和R鍵)牌捷,Xcode會編譯源碼并在模擬器中運行這個應(yīng)用墙牌。
編譯成功會在屏幕上淡淡地顯示“Build Succeeded”。反之暗甥,失敗就顯示“Build Failed”且不啟動模擬器喜滨。
最新的Xcode編譯后會報
Compiling IB documents for earlier than iOS7 is no longer supported
, 此時需要手動點擊報錯撤防,在面板中找到build for 選擇合適的版本
修改
在模擬器上看到“Performed search using…”了吧虽风,下面我們改掉它。
在Xcode左上角的Run按鈕下方寄月,有一排小按鈕辜膝,從左到右第三個是一個放大鏡圖標(biāo),鼠標(biāo)移上去會顯示“Show the Search Navigator”漾肮,點一下它厂抖,打開搜索界面,在它下方出現(xiàn)的Find輸入框中輸入“performed”
搜索結(jié)果只有一條:ToolbarSearchViewController.m克懊,點文件名下方被高亮的“Performed”字串忱辅,右側(cè)代碼編輯區(qū)會自動打開這個文件,并滾動屏幕谭溉,使包含“Performed”的這一行出現(xiàn)在編輯區(qū)的中間墙懂。
修改雙引號里的字串,隨便改成啥扮念,然后按“Command S”保存损搬。
當(dāng)然,這些操作,你也可以在終端下通過grep和vim完成场躯。
運行修改后的應(yīng)用
按Command R運行谈为,看看,是不是看到效果啦踢关?
是的伞鲫,修改一個應(yīng)用就這么簡單。
Objective-C
Objective-C是蘋果應(yīng)用軟件(包括蘋果電腦上的Mac OS App和移動設(shè)備上的iOS App)的開發(fā)語言签舞。它是一種面向?qū)ο蟮木幊陶Z言秕脓。
蘋果公司還提供了一個軟件,叫Interface Builder儒搭,簡稱IB吠架,用于可視化的界面制作,就像用Dreamweaver做網(wǎng)頁搂鲫,或者像Visual Basic做桌面軟件一樣傍药。后來IB就整合進了Xcode,成了Xcode的一部分魂仍。這篇文檔不講IB拐辽,只講Objective-C,因為:
- 基本上擦酌,每一本講iOS開發(fā)的書(紙質(zhì)書俱诸、電子書),都有大量的截圖一步一步教如何用IB開發(fā)iOS應(yīng)用赊舶,而講Objective-C開發(fā)應(yīng)用的書卻沒有那么多睁搭。
- IB可以用來直觀方便地畫界面、設(shè)置控件屬性笼平、建立代碼與控件的聯(lián)系园骆,但后臺的業(yè)務(wù)邏輯和數(shù)據(jù)處理仍然要靠Objective-C,可見出吹,不管用不用IB遇伞,Objective-C都是繞不過去的辙喂。
C的超集
Objective-C擴展了ANSI C捶牢,是C的超集,也就是說:
- 任何C源程序巍耗,不經(jīng)修改秋麸,即可通過Objective-C編譯器成功編譯
- Objective-C源程序中可以直接使用任何C語言代碼
除了面向?qū)ο笥姓Z法是SmallTalk風(fēng)格的(下面會講到),其它非面向?qū)ο蟮恼Z法炬太、數(shù)據(jù)類型灸蟆,與C完全相同,所以本文就不再贅述亲族。
來看一個經(jīng)典的Hello World示例吧:
#import <Foundation/Foundation.h>
int main(int argc, char *argv[]){
@autoreleasepool{
NSLog(@"Hello World!");
}
return 0;
}
是不是仿佛穿越回了大一學(xué)習(xí)C語言的時代炒考,看起來和C幾乎沒有區(qū)別可缚,是吧?是的斋枢,因為還沒用到它的面向?qū)ο筇匦粤泵遥?/p>
SmallTalk的消息傳遞語法風(fēng)格
Objective-C的面向?qū)ο笳Z法源自SmallTalk,消息傳遞(Message Passing)風(fēng)格瓤帚。在源碼風(fēng)格方面描姚,這是它與C Family語言(包括C/C++、Java戈次、PHP)差別最大的地方轩勘。
在Java、C++世界怯邪,我們調(diào)用一個對象的某方法绊寻,在Objective-C里,這稱作給類型發(fā)送一個消息悬秉,這可不僅僅是文字游戲榛斯,他們的技術(shù)細(xì)節(jié)也是不同的。
在Java里搂捧,對象和方法關(guān)系非常嚴(yán)格驮俗,一個方法必須屬于一個類/對象,否則編譯是要報錯的允跑。而在Objective-C里王凑,類型和消息的關(guān)系比較松散,消息處理到運行時(runtime)才會動態(tài)決定聋丝,給類型發(fā)送一個它無法處理的消息索烹,也只會拋出一個異常,而不會掛掉弱睦。
[obj undefinedMethod];
在代碼里調(diào)用沒定義的方法(這是Java世界的習(xí)慣說法啊百姓,專業(yè)的叫法是,給obj對象傳遞它無法處理的消息)况木,Xcode會警告垒拢,但編譯能成功,運行的時候會出錯火惊。它會輸出這樣一個錯誤:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSObject undefinedMethod]: unrecognized selector sent to instance 0x8871710'
類似Java的OOP概念
Objective-C中一些面向?qū)ο蟮母拍钋罄啵部梢栽贘ava中找到類似的實現(xiàn)(只能說是類似,不是完全相同)屹耐,我的讀者基本都是Java和PHP程序員尸疆,我會在下文中盡量用Java的概念來類比。
GoogleCode上有人整理了Java和Objective-C的概念、數(shù)據(jù)類型對應(yīng)表寿弱,參見這里
字符串
Objective-C里有字符串是由雙引號包裹犯眠,并在引號前加一個@符號,例如:
title = @"Hello";
if(title == @"hello") {}
PHP程序員要注意症革,在這里不能用單引號冕杠,即使只有一個字符也不能用淹辞。Objective-C與Java镀层、C一樣嘉汰,雙引號表示字符串。
函數(shù)調(diào)用
前文述及摩疑,不涉及面向?qū)ο髸r危融,它和C是完全一樣的。以下是幾個函數(shù)調(diào)用的示例:
不帶參數(shù)
startedBlock();
帶參數(shù)
NSLog(@"decrypted string: %@", str);
CGRectMake(0,0,0,0);
傳遞消息給類/實例方法
不帶參數(shù)
[obj method];
對應(yīng)的Java版本
obj.method();
帶一個參數(shù):
[counter increase:1];
對應(yīng)的Java版本
counter.increase(1);
帶多個參數(shù)
對C Family程序員來說雷袋,這是最難接受的吉殃,最反人類的:
- (void) setColorToRed: (float)red Green: (float)green Blue:(float)blue {...} //定義方法
[myObj setColorToRed: 1.0 Green: 0.8 Blue: 0.2]; //調(diào)用方法
對應(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];
對應(yīng)的Java版
UINavigationBar bar = UINavigationBar.alloc().init().autorelease();//Java沒有指針,所以星號去掉了
類
接口和實現(xiàn)
Objective-C的類分為接口定義和實現(xiàn)兩個部分楷怒。接口定義(Interface)放在頭文件中蛋勺,文件擴展名是.h,實現(xiàn)(implementation)放在實現(xiàn)文件中鸠删,文件擴展名是.m(也有.mm的擴展名抱完,表示Objective-C和C++混編的代碼)。
接口定義也可以寫在.m文件中刃泡,但最好不要這么干
需要注意的是巧娱,與Objective-C的interface概念最接近的是C和C++里的頭文件,它與implementation是成雙成對出現(xiàn)的烘贴,作用是聲明類的成員變量和方法禁添。它與Java的interface概念完全不同:
- Objective-C里,interface有且只有一個實現(xiàn)桨踪,Java的interface可以有0-N個實現(xiàn)
- Objective-C里老翘,interface可以定義成員屬性,Java里不可以
在Objective-C里锻离,和Java的Interface概念相似的是Protocol铺峭,下文會講到。
請看示例:
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
接口和實現(xiàn)以@interface纳账、@implementation開頭逛薇,都以@end結(jié)束∈璩妫“@”符號在Objective-C中是個很神奇的符號。
冒號也是方法名的一部分,method和method:是兩個不同的方法名卧秘,不是overload呢袱,第二個帶參數(shù)。
上述代碼對應(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里沒有私有方法的概念(沒有你說個蛋啊羞福,哈哈哈哈)。
官方并沒有提到Objective-C怎么實現(xiàn)私有方法蚯涮,我查閱了stackoverflow治专,統(tǒng)一的答案是,要實現(xiàn)私有方法的效果只能借助Category遭顶,不過张峰,根據(jù)我的測試,即使采用了Category棒旗,也不能阻止外部的代碼調(diào)用這個“私有方法”喘批,只是Xcode不支持“私有方法”的自動完成,并會有警告提示铣揉,運行的時候饶深,還是會成功的。各位看官知道有這么回事就可以了逛拱,這里不深講敌厘。
變量和屬性
類方法和實例方法
類方法
類方法就是Java、PHP里的Static Method朽合,不用實例化就能調(diào)额湘。類方法有一個加號前綴。
示例:
類定義
@interface MyClass
+(void) sayHello;
@end
@implementation MyClass
+(void) sayHello {
NSLog(@"Hello, World");
}
@end
使用
[MyClass sayHello];
實例方法
實例方法就是Java旁舰、PHP里的普通方法锋华,必須實例化才能調(diào)。實例方法有一個減號前綴箭窜。
示例:
類定義
@interface MyClass : NSObject
-(void) sayHello;
@end
@implementation MyClass
-(void) sayHello {
NSLog(@"Hello, World");
}
@end
使用
mycls = [MyClass new];
[mycls sayHello];
Selector
selector就是一個方法指針毯焕,類似PHP里的動態(tài)方法名:
<?php
class Hello {
public function sayHello() {}
public function test() {
$fun_name = "sayHello";
$this->$fun_name();
}
}
在Objective-C里,selector主要用來做兩類事情:
綁定控件觸發(fā)的動作
@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)這個按鈕被按下時磺樱,觸發(fā)downButtonPressed:方法
}
@end
延時異步執(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
這個例子中纳猫,獲取數(shù)據(jù)源是通過ASIHTTP組件異步調(diào)用服務(wù)端HTTP接口,refreshTable要用到數(shù)據(jù)源返回回來的數(shù)據(jù)竹捉,如果不延遲0.5秒芜辕,就會立刻執(zhí)行,執(zhí)行的時候數(shù)據(jù)還在路上呢块差,頁面就要變空白了侵续。
繼承
繼承是寫在Interface定義里面的倔丈。語法為:子類名在左,父類名在右状蜗,中間用冒號分隔需五。
示例:
@interface MyClass : NSObject
@end
對應(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
對應(yīng)的Java版本是:
publilc interface Printable {
public void print(String str);
}
協(xié)議的繼承
協(xié)議本身也可以繼承別的協(xié)議:
@protocol Printable <NSObject>
-(void)print:(NSString)str;
@end
對應(yīng)的Java版本:
public interface Printable extends NSObject {
public void print (String str);
}
可選方法
協(xié)議可以包含可選方法宏邮,顧名思義,可選方法可以不被類實現(xiàn):
@protocol Printable
@optional
-(void)print:(NSString)str;
@end
加了@optional關(guān)鍵字缸血,一個類在implements這個協(xié)議時蜜氨,便可以不實現(xiàn)print:方法。
Java里沒有類似的實現(xiàn)捎泻,除了Collection里會有一些方法帶有optional的注釋飒炎,但Collection是個特例。
協(xié)議的實現(xiàn)
一個類實現(xiàn)某些協(xié)議是寫在Interface定義里面的族扰。語法為:協(xié)議名用尖括號包裹厌丑,多個協(xié)議名用逗號隔開,協(xié)議寫在父類的右邊(如果沒有父類就直接寫在子類右邊)渔呵。
示例:
@interface MyClass : NSObject <Printable, Drawable>
@end
Printable, Drawablw就是兩個協(xié)議怒竿。
對應(yīng)的Java版本是:
public class MyClass extends NSObject implements Printable, Drawable {
}
分類(Category)
分類可以給一個已經(jīng)存在的類增加方法,而不用去改它的源碼扩氢。Java和PHP中都沒有類似的特性耕驰。
比如說,NSObject是一個Objective-C內(nèi)置的系統(tǒng)類录豺,我們想給它增加toJson方法朦肘,就像這樣:
頭文件:NSObject+Json.h
@interface NSObject (Json)
-(NSString)toJson;
@end
實現(xiàn)文件:NSObject+Json.m
@implementation NSObject (Json)
-(NSString)toJson {
//...
}
@end
使用的時候,只要包含NSObject+Json.h双饥,實例化NSObject類媒抠,就可以使用toJson方法了:
import "NSObject+Json.h"
@implementation XYZController
-(void)test {
NSObject *obj = [[NSObject alloc]init];
NSString *str = [obj toJson];
}
@end
當(dāng)然了,NSObject本來的那些方法依然還是可以用的咏花,什么都沒變趴生,只是多了個toJson方法』韬玻看起來是不是和繼承沒太多差別呢(除了使用的時候?qū)嵗氖荖SObject苍匆,而不是JsonObject)?再看一個繼承實現(xiàn)不了的例子:
頭文件:NSObject+Json+XML.h
@interface NSObject (Json)
-(NSString)toJson;
@end
@interface NSObject (XML)
-(NSString)toXML;
@end
實現(xiàn)文件:NSObject+Json+XML.m
@implementation NSObject (Json)
-(NSString)toJson {
//...
}
@end
@implementation NSObject (XML)
-(NSString)toXML {
//...
}
@end
使用:
import "NSObject+Json+XML.h"
@implementation 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多了一些移動設(shè)備特有的東西统求,如:觸摸屏检碗、加速度傳感器据块、GPS定位。Cocoa中多任務(wù)后裸、多窗口的特性瑰钮,在Cocoa Touch中也是沒有的(或者跟Cocoa不完全一樣的)冒滩。
就像學(xué)了Java語言還要再學(xué)一些Spring微驶、Hibernate、Struts(或者其它類似的Java類庫)才能開始做J2EE應(yīng)用一樣开睡,學(xué)過Objective-C語言之后因苹,也要再學(xué)習(xí)Cocoa Touch框架才能順利地開發(fā)iOS應(yīng)用。
最常用設(shè)計模式之Delegate
Cocoa Touch大量使用Delegate(委派)設(shè)計模式篇恒。
常用控件:按鈕扶檐、文本塊、圖片胁艰、輸入框
TableView
WebView
導(dǎo)航條
Xcode
運行
快捷鍵:Comman R
搜索
搜索文本
搜索文件
新建文件/目錄
推薦在Finder中新建好的再添加進來
斷點
模擬器和真機測試
模擬器測試
在Xcode中打開你的項目款筑,在Xcode頂部工具欄的Stop按鈕(Run按鈕右邊那個黑色正方形按鈕)右邊,有個下拉菜單腾么,顯示著 “ToolBarSearch > iPhone 5.0 Simulator” (即 你的應(yīng)用英文名 > 當(dāng)前選中的調(diào)試 )奈梳,點擊這個下拉菜單,選中iPhone 5.0 Simulator(這里的5.0是指iOS版本解虱,不是iPhone5的意思攘须,如果你的項目是iPad應(yīng)用,請選iPad 5.0 Simulator)殴泰,再按“Run”按鈕于宙,Xcode就會自動把當(dāng)前正在編輯開發(fā)的應(yīng)用編譯并安裝到模擬器上。
在模擬器上操作時悍汛,如果執(zhí)行過程中遇到了你在Xcode里設(shè)置的斷點捞魁,模擬器會暫停運行,并將當(dāng)前活動窗口切換回Xcode离咐,供你調(diào)試谱俭。
在Xcode里增加或者取消了斷點,不需要重新編譯和安裝應(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è)備和版本是彼此獨立的疤坝,iPhone 4S可以有5.0兆解,5.1,6.1幾種iOS版本跑揉,當(dāng)然了锅睛,iPhone 5不可能有4.3的iOS版本。
觸摸屏
用鼠標(biāo)點擊(不區(qū)分左右鍵)模擬器上的iPhone历谍、iPad屏幕现拒,就是在模擬用手指觸摸iPhone,iPad的屏幕望侈,可以實現(xiàn)一些觸摸效果比如:
- 鼠標(biāo)單擊 等于 手指輕觸
- 鼠標(biāo)長按 等于 手指長按(例如你可以在模擬器上長按應(yīng)用icon調(diào)出刪除應(yīng)用的確認(rèn)框)
- 鼠標(biāo)按住拖動 等于 手指拖動
- 雙擊和單擊模擬器的Home鍵也等于雙擊和單擊真機的Home鍵
多指手勢
多指手勢比較復(fù)雜印蔬,在白蘋果筆記本上可以模擬簡單的雙指手勢,白蘋果的觸控板天然支持多指觸摸脱衙,但要定位到模擬器的區(qū)域再響應(yīng)多指手勢就需要借助一些額外的鍵啦:
- 按住Option鍵侥猬,再用兩個手指去操作觸摸板,可模擬雙指拖動捐韩、旋轉(zhuǎn)
- 按住Option+Shift退唠,可模擬雙指合攏
輸入法和鍵盤
輸入中文
手機上特有的輸入法(比如九宮格輸入法)不能模擬。模擬器默認(rèn)的iOS軟鍵盤只有英文輸入奥帘,在測試應(yīng)用的時候铜邮,我們要用到中文,有兩個辦法:
- 使用剪貼板寨蹋,在Mac OS里復(fù)制松蒜,再到模擬器運行的應(yīng)用中的輸入框上長按鼠標(biāo)(模擬手指長按)3秒以上,等彈出“粘貼”的時候選擇之已旧,即可秸苗。
- 在模擬器里,按Home鍵运褪,找到Setting那個App icon(不是Mac OS頂部的模擬器菜單啊惊楼,那里沒有Setting的),打開被模擬iOS設(shè)備的設(shè)置秸讹,依次點擊”General - Keyboard - International Keyboards - Add New Keyboard…”檀咙,加個中文鍵盤,以后就可以使用被模擬iOS設(shè)備軟件盤輸入中文了璃诀,跟在iPhone/iPad真機上一樣弧可。
使用Mac電腦的鍵盤
如果要輸入大量文本,使用模擬器里的軟鍵盤效率太低劣欢,這時候可以使用物理鍵盤棕诵,方法是:在Mac OS頂部的模擬器菜單欄裁良,點擊”硬件”菜單,勾選下拉菜單中的“模擬硬件鍵盤”校套。以后再用模擬器運行iOS應(yīng)用時价脾,點擊iOS應(yīng)用中的輸入框,軟鍵盤就不彈出來了笛匙,可直接使用Mac電腦的物理鍵盤輸入侨把。
注意:
- 模擬器中的iOS接管了物理鍵盤輸入,所以膳算,調(diào)用的是模擬器iOS的輸入法座硕,不是你的Mac電腦的輸入法弛作。打個比方涕蜂,你的Mac OS裝的是搜狗五筆,模擬器中iOS加了個拼音輸入法(Add New Keyboard)映琳,那么机隙,在iOS應(yīng)用中輸入中文會調(diào)用拼音輸入法。
- 要切換模擬器中iOS的中英文輸入法萨西,也只能按iOS設(shè)備軟鍵盤上的小地球圖標(biāo)有鹿,按Mac電腦上的Command+空格鍵是不行的。
地理位置
但Mac電腦沒有定位用的硬件(GPS)和軟件基礎(chǔ)谎脯,因此模擬器不能自動獲得當(dāng)前的地理位置葱跋,不能用模擬器測試定位功能。(注意源梭,雖然WiFi也可以獨立定位——iPad WiFi版沒有GPS也可以定位娱俺,但Mac電腦的WiFi不具備定位相關(guān)的軟件)
要在模擬器里測試依賴地理位置的功能(如”我附近的xx”),可以手工指定一個經(jīng)緯度給模擬器废麻,方法:在Mac電腦頂部的模擬器菜單荠卷,點擊”調(diào)試 - 位置 - 自定位置”,會彈出一個對話框烛愧,在彈出的框內(nèi)填入經(jīng)緯度即可油宜。
如何獲得經(jīng)緯度?
上谷歌地圖(ditu.google.cn)怜姿,在地圖上找到你想要的位置(比如你想知道杭州大廈的位置慎冤,就在通過搜索框找到杭州大廈),點擊右鍵沧卢,選擇“這兒是什么”蚁堤,搜索框中就會出現(xiàn)這個位置的經(jīng)緯度了,前面是緯度搏恤,后面是經(jīng)度违寿。咱們天朝的版圖湃交,都是北緯和東經(jīng)。
攝像頭
Mac電腦有攝像頭藤巢,但Mac OS沒有設(shè)計API給iOS模擬器調(diào)用搞莺,所以,不能用模擬器測試對焦閃光燈等功能掂咒。
要在模擬器上測試依賴照片的功能才沧,可以在代碼里做一個workaround,即當(dāng)代碼檢測到攝像頭不可用時绍刮,彈出一個照片選擇器,讓測試人員從相冊里選擇一幅照片孩革,來進行后續(xù)的操作(如照片美化岁歉、人臉識別鬓催、條碼掃描)。
真機測試
模擬器能驗證你開發(fā)的iOS應(yīng)用的大部分功能忿等,但有些Mac設(shè)備上不具備的硬件栖忠,模擬器是不能模擬的。前文提到了一個繞過這些限制的辦法,但獲取當(dāng)前位置庵寞、拍照狸相、加速度感應(yīng)這些是模擬不了的,一款應(yīng)用發(fā)布給消費者之前捐川,必須要在真實設(shè)備上驗證過脓鹃。
將未提交App Store審核通過的應(yīng)用安裝到iOS設(shè)備上測試,有三種辦法:
- 加入蘋果的Developer Program古沥,成為付費會員瘸右,有了這個付費會員資格,就可以直接在Xcode中點擊”Run”將剛剛改過的代碼編譯打包安裝到開發(fā)測試用的iOS設(shè)備上岩齿。在iOS真機上操作被測試的程序能激活Xcode中設(shè)置的斷點太颤。
- 越獄iOS設(shè)備。將iPhone和iPad越獄后盹沈,可以通過SSH直接上傳Xcode編譯好的ipa包(一個iOS App本質(zhì)上就是一個ipa包)龄章。
- 越獄的iOS設(shè)備,配合破解過的Xcode襟诸,甚至可以實現(xiàn)和付費開發(fā)者計劃一樣的功能:在Xcode上點擊”Run”瓦堵,就自動編譯安裝到iOS設(shè)備上去運行了
- 企業(yè)部署方案。就像阿里巴巴的軒轅劍一樣歌亲,用iPhone/iPad訪問這個網(wǎng)址,點擊里面的軒轅劍鏈接就可以安裝軒轅劍這個應(yīng)用了澜驮。
破解Xcode是違法行為(越獄是合法的)陷揪,而且挑版本挑得厲害,不是所有Xcode版本都能破解杂穷,也不是所有Xcode的破解版都能和越獄的iOS配合好悍缠。越獄+SSH上傳跟企業(yè)部署一樣效率低(部署效率低,無法激活Xcode中的斷點)耐量,只能用于QA驗收飞蚓,不適合開發(fā)自測。綜上所述廊蜒,最適合開發(fā)實時測試的就是第一個正規(guī)途徑了趴拧。下面重點講這個:
擁有一個開發(fā)者賬號
蘋果的Developer Program分為個人開發(fā)者和公司開發(fā)者,分別是每年99美元和每年299美元山叮,分別可以注冊100臺和500臺蘋果測試設(shè)備著榴。這個臺數(shù)限制在一個付費年度內(nèi)不會清空,比如說屁倔,2013年4月1日付費成功的脑又,付費會員資格在2014年3月31日之前有效,這期間,注冊一臺就少一個名額问麸,哪怕這個設(shè)備注冊進來用了之后一分鐘馬上又刪掉了往衷,減少的這個名額也不會回來。
在交錢之前严卖,最好問一下炼绘,周圍的同事,有沒有已經(jīng)交了錢的妄田。如果有俺亮,你只需要注冊一個免費的Apple ID(就是你在App Store安裝軟件用的Apple ID),請他發(fā)個邀請郵件給你疟呐,把你的Apple ID加入他的團隊就可以了脚曾,蘋果會認(rèn)為你們兩個人是一個團隊的,你們分別用自己的賬號启具,共享100臺設(shè)備的限額本讥,這是合法的。
安裝證書和私鑰
證書
不想看下面各種點擊各種頁面跳轉(zhuǎn)的直接用瀏覽器訪問證書管理鲁冯,你要登錄你就用Apple ID登錄(前提是交過錢拷沸,或者找交了錢的人把你加入團隊了)。
不嫌煩薯演,或者想知道下次沒我這個文檔的時候怎么進證書管理嗎撞芍?按這個步驟操作:
- 進入 蘋果開發(fā)者中心
- 點擊iOS Dev Center
- 點藍(lán)色“Login”按鈕,用你的Apple ID登錄跨扮,登錄成功會跳到 開發(fā)者首頁
- 點擊右上角的iOS Provisioning Portal(別找了序无,直接Command F搜索多好)
- 點左側(cè)菜單欄里的Certificates
頁面上有一個“Your Certificate”區(qū)域,下方有個Download圓角按鈕衡创,這是你的個人證書帝嗡,下載下來。再下面一行璃氢,有一句“If you do not have the WWDR intermediate certificate installed, click here to download now”哟玷,這個是蘋果的公共證書,也下下來一也。
雙擊下載回來的證書巢寡,裝證書時,會提示你輸入密碼塘秦,這是【鑰匙串訪問工具】在問你要你的Mac OS賬號開機密碼(相當(dāng)于linux里面的sudo)讼渊,不是Apple ID的密碼,不要搞錯了尊剔。
安裝私鑰
如果你是和其它同事公用的賬號爪幻,讓他給你一個私鑰即可,就是一個擴展名為p12的文件,雙擊之挨稿,鑰匙串訪問會自動出來仇轻,需要你輸入一個密碼,這個密碼問給你p12文件的人要奶甘,不是你的Mac OS系統(tǒng)開機密碼篷店,也不是你的Apple ID密碼。
將設(shè)備注冊到Provisioning Portal
- 打開Xcode臭家,從Xcode的Window菜單中找到Organizer疲陕,打開之(Shift Command 2)。
- 把iOS設(shè)備連上電腦钉赁,Organizer會自動識別出你的設(shè)備蹄殃,并顯示在左側(cè)邊欄。
- 在Organizer左側(cè)邊欄找到你的設(shè)備你踩,右鍵诅岩,點擊“Add Device to Provisioning Portal”,然后等Organizer提示你操作成功即可带膜。(選中設(shè)備后吩谦,右邊設(shè)備詳情區(qū)域會顯示一個按鈕“Use for Development”,點它也可以)膝藕。
到iOS真機上運行測試版程序
回到Xcode主界面式廷,在Stop按鈕(Run按鈕右邊那個黑色正方形按鈕)右邊,有個下拉菜單束莫,顯示著 “ToolBarSearch > iPhone 5.0 Simulator” (即 你的應(yīng)用英文名 > 當(dāng)前選中的調(diào)試 )懒棉,點擊這個下拉菜單,選中你的真機設(shè)備名览绿,再按“Run”按鈕,Xcode就會自動把當(dāng)前正在編輯開發(fā)的應(yīng)用編譯并安裝到真機上測試?yán)玻?/p>
發(fā)布到App Store
打IPA包
IPA包本質(zhì)上是一個ZIP壓縮包穗慕,只不過它有著特殊的目錄結(jié)構(gòu)饿敲,擴展名是ipa,制作方法如下:
- 在Xcode中Build項目逛绵,快捷鍵Command B
- 在左側(cè)項目導(dǎo)航器中怀各,展開Products文件夾,找到你要打包的應(yīng)用术浪,你的應(yīng)用名.app瓢对,右鍵,選擇show in finder
- 到Finder中Copy這個.app目錄(選中胰苏,按Command C)硕蛹,復(fù)制到一個你新建的名為Payload(區(qū)分大小寫)的文件夾中
- 找到你的應(yīng)用Logo,即一個512 * 512像素的PNG文件,copy到與Payload一起(與Payload并列法焰,不要放進Payload了)秧荆,并重命名為iTunesArtwork(區(qū)分大小寫,沒有擴展名)
- 將Payload目錄埃仪、ItunesArtwork文件打成一個zip包乙濒,并更改擴展名為ipa
- 雙擊這個ipa文件,會用iTunes打開卵蛉,如果打開成功颁股,且在iTunes里有應(yīng)用Logo顯示,就成功了
批量自動打包
除App Store外傻丝,還有許多其它的iOS應(yīng)用市場(如91助手甘有,同步推等等),如果一個應(yīng)用需要發(fā)布到很多個應(yīng)用市場桑滩,且他們的代碼略有不同(比如說梧疲,統(tǒng)計代碼不同),按上述方法手工修改源碼再打包运准,再還原幌氮,比較容易出錯。好消息是胁澳,Xcode是有命令行的该互,我們可以寫一個shell腳本,先用se自動修改源碼韭畸,再調(diào)用Xcode的命令行來編譯以得到y(tǒng)our——app.app目錄宇智,最后調(diào)用zip、mv等命令把上一個章節(jié)講的ipa打包動作自動執(zhí)行胰丁。
閱讀應(yīng)用代碼
從頭新建一個應(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。
項目成員間交流時怪得,應(yīng)使用Point咱枉,不要使用pixel卑硫。
SVN操作含有@符號的文件
iOS應(yīng)用中經(jīng)常出現(xiàn)xxxx@2x.png這樣的文件名,它們是給retina設(shè)備用的高分辨率大圖,用svn命令行操作它們的時候會被@符號干擾,解決方案是在svn命令末尾加上一個@符號,如:
svn del icon@2x.png@
svn info Default@2x.png@
如果一次移動了幾十個png文件再svn commit的,可以用shell批處理:
svn status | awk '($1=="!"){print $2}' | grep -v @ | xargs svn del
上面這個命令是將文件名不包含@符號的,且已經(jīng)不在硬盤上的文件從svn version controll中刪掉
for file in `svn status | awk '($1=="!"){print $2}' `; do svn del $file"@"; done
上面這個命令是將文件名包含@符號的,且已經(jīng)不在硬盤上的文件從svn version controll中刪掉
svn add同上, 如法炮制即可.
Xcode中的代碼結(jié)構(gòu)與操作系統(tǒng)上的文件系統(tǒng)并不一致
推薦在Finder里建好目錄再到Xcode的Project Navigator中點擊“Add Files to”添加到項目中
iPhone 5適配
iPhone 5與之前的iPhone不一樣庞钢,采用了4寸Retina屏拔恰,所以它的Point數(shù)變成了320 * 568 points
開源代碼
- Apple官方的Sample Code
- 維基百科上的開源iOS App
- iOS Opensource --Domain Parking了,以前可以下載Twitter和Wordpress客戶端的
- code 4 app
- UI 4 app基括, code4app的姐妹站
Objective-C教程
- Apple官方教程
- Cocoa Dev Center
- 維基上的Objective-C語言簡介 --中文颜懊,十分鐘可讀完,推薦