iOS開發(fā)60分鐘入門

本文面向已有其它語言(如Java暖混,C禾唁,PHP弹砚,Javascript)編程經(jīng)驗的iOS開發(fā)初學者拙绊,初衷在于讓我的同事一小時內(nèi)了解如何開始開發(fā)iOS App牺弹,學習目標包括:

  • 能使用Xcode IDE、模擬器
  • 能修改时呀、調(diào)試已有iOS App
  • 能在已有應用內(nèi)創(chuàng)建新模塊
  • 能創(chuàng)建新應用
  • 能發(fā)布應用到App Store

本文不包含任何高級的iOS開發(fā)知識张漂,已學會iOS開發(fā)的同學不要看,看完這篇文章學會了的同學也不用再看了谨娜。

不僅是學習一門新語言

有過腳本開發(fā)經(jīng)驗的人(如Javascript航攒,PHP,Shell)在剛開始學習iOS開發(fā)的時候趴梢,會覺得iOS開發(fā)的學習曲線比腳本語言要高漠畜,是的,這種感覺是對的坞靶。因為學iOS開發(fā)憔狞,不僅是學習一門新語言,它包括:

  • 一門語言:Objective-C
  • 一個框架:Cocoa Touch
  • 一個IDE:Xcode

初學腳本語言通常不會來繪制圖形界面彰阴、與人交互瘾敢,iOS如果不做圖形界面,像腳本語言一樣處理文本操作數(shù)據(jù)庫尿这,就沒啥意思了簇抵。

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

環(huán)境準備

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

Mac OS

擁有Mac OS環(huán)境最簡單的方法是找一臺蘋果電腦,包括iMac, MacBook Pro, MacBook Air, Mac Mini屑宠,但不包括蘋果的移動設備(iPod Touch, iPhone, iPad, iPad Mini,它們運行的是iOS系統(tǒng)仇让,不是Mac OS)典奉,蘋果電腦在出廠的時候就會預裝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)也有一些真實的存在,國外當然也有啦锻梳。

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

  • 安裝黑蘋果是非法的
  • 個人行為蘋果公司一般不會追究,但會遭同行的鄙視
  • 黑蘋果超級難裝疑枯,挑硬件辩块。即使完全相同的型號,相同的批次荆永,也有可能A機器裝上了庆捺,B機器裝不上
  • 黑蘋果系統(tǒng)多少都存在一些使用上的問題,像驅(qū)動Bug啦屁魏、待機恢復藍屏啦滔以、上網(wǎng)瀏覽有問題啦
  • 黑蘋果不能隨意升級,可能升級一次safari就導致整個系統(tǒng)崩潰了

上面這些雖然不會直接影響Xcode寫代碼氓拼、模擬器測試你画,但寫著寫著想上網(wǎng)查個東西的時候抵碟,safari不能翻頁,確實挺影響心情的坏匪。所以拟逮,錢包允許的前提下,還是搞個蘋果電腦省心一些适滓。

Xcode 和 模擬器

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

安裝Xcode時會自動安裝iOS SDK和模擬器敦迄。

這么強大的IDE居然是免費的,還是挺讓人開心的凭迹。

從改一個現(xiàn)成的應用開始吧

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

這一次蚀狰,就讓我們從改一個現(xiàn)成的應用開始吧愉昆。

下載

首先,我們從蘋果開發(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對話框中,點擊鼠標是找不到的瓷产,這時候就要通過命令行終端來打開了站玄。

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

cd /ToolBarSearch的父目錄/ToolBarSearch
open -a Xcode

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

運行剛下載的應用

點擊Xcode左上角的Run按鈕(或者同時按下Comman和R鍵)疤估,Xcode會編譯源碼并在模擬器中運行這個應用。

編譯成功會在屏幕上淡淡地顯示“Build Succeeded”霎冯。反之铃拇,失敗就顯示“Build Failed”且不啟動模擬器。

最新的Xcode編譯后會報 Compiling IB documents for earlier than iOS7 is no longer supported沈撞, 此時需要手動點擊報錯慷荔,在面板中找到build for 選擇合適的版本

修改

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

  • 在Xcode左上角的Run按鈕下方显晶,有一排小按鈕,從左到右第三個是一個放大鏡圖標壹士,鼠標移上去會顯示“Show the Search Navigator”磷雇,點一下它,打開搜索界面躏救,在它下方出現(xiàn)的Find輸入框中輸入“performed”
  • 搜索結(jié)果只有一條:ToolbarSearchViewController.m唯笙,點文件名下方被高亮的“Performed”字串,右側(cè)代碼編輯區(qū)會自動打開這個文件盒使,并滾動屏幕崩掘,使包含“Performed”的這一行出現(xiàn)在編輯區(qū)的中間。
  • 修改雙引號里的字串少办,隨便改成啥苞慢,然后按“Command S”保存。

當然英妓,這些操作枉疼,你也可以在終端下通過grep和vim完成皮假。

運行修改后的應用

按Command R運行,看看骂维,是不是看到效果啦惹资?

是的,修改一個應用就這么簡單航闺。

Objective-C

Objective-C是蘋果應用軟件(包括蘋果電腦上的Mac OS App和移動設備上的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應用宏悦,而講Objective-C開發(fā)應用的書卻沒有那么多。
  • IB可以用來直觀方便地畫界面包吝、設置控件屬性饼煞、建立代碼與控件的聯(lián)系,但后臺的業(yè)務邏輯和數(shù)據(jù)處理仍然要靠Objective-C诗越,可見派哲,不管用不用IB,Objective-C都是繞不過去的掺喻。

C的超集

Objective-C擴展了ANSI C芭届,是C的超集,也就是說:

  • 任何C源程序感耙,不經(jīng)修改褂乍,即可通過Objective-C編譯器成功編譯
  • Objective-C源程序中可以直接使用任何C語言代碼

除了面向?qū)ο笥姓Z法是SmallTalk風格的(下面會講到),其它非面向?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;
}

是不是仿佛穿越回了大一學習C語言的時代褥实,看起來和C幾乎沒有區(qū)別呀狼,是吧?是的损离,因為還沒用到它的面向?qū)ο筇匦愿缤В?/p>

SmallTalk的消息傳遞語法風格

Objective-C的面向?qū)ο笳Z法源自SmallTalk,消息傳遞(Message Passing)風格僻澎。在源碼風格方面貌踏,這是它與C Family語言(包括C/C++、Java窟勃、PHP)差別最大的地方祖乳。

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

在Java里梆暖,對象和方法關(guān)系非常嚴格伞访,一個方法必須屬于一個類/對象掂骏,否則編譯是要報錯的轰驳。而在Objective-C里,類型和消息的關(guān)系比較松散弟灼,消息處理到運行時(runtime)才會動態(tài)決定级解,給類型發(fā)送一個它無法處理的消息,也只會拋出一個異常田绑,而不會掛掉勤哗。

[obj undefinedMethod];

在代碼里調(diào)用沒定義的方法(這是Java世界的習慣說法啊,專業(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ù)類型對應表吆你,參見這里

字符串

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];

對應的Java版本

obj.method();

帶一個參數(shù):

[counter increase:1];

對應的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)用方法

對應的Java版

public void setColorToRedGreenBlue(float red, float green, float blue) {...}
myObj.setColorToRedGreenBlue(1.0, 0.8, 0.2);

消息嵌套

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

對應的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ù)。

上述代碼對應的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 {//響應“按鈕被按下事件”的方法
    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];//當這個按鈕被按下時瑟蜈,觸發(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)用服務端HTTP接口渣窜,refreshTable要用到數(shù)據(jù)源返回回來的數(shù)據(jù)铺根,如果不延遲0.5秒,就會立刻執(zhí)行乔宿,執(zhí)行的時候數(shù)據(jù)還在路上呢位迂,頁面就要變空白了。

繼承

繼承是寫在Interface定義里面的。語法為:子類名在左掂林,父類名在右臣缀,中間用冒號分隔。 示例:

@interface MyClass : NSObject
@end

對應的Java版本是:

public class MyClass extends NSObject {
}

協(xié)議(Protocol)

就是Java泻帮、PHP里的Interface精置。

協(xié)議的定義

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

@protocol Printable
    -(void)print:(NSString)str;
@end

對應的Java版本是:

publilc interface Printable {
    public void print(String str);
}

協(xié)議的繼承

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

@protocol Printable <NSObject>
    -(void)print:(NSString)str;
@end

對應的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é)議。

對應的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

當然了柳击,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多了一些移動設備特有的東西坦喘,如:觸摸屏盲再、加速度傳感器、GPS定位瓣铣。Cocoa中多任務洲胖、多窗口的特性,在Cocoa Touch中也是沒有的(或者跟Cocoa不完全一樣的)坯沪。

就像學了Java語言還要再學一些Spring绿映、Hibernate、Struts(或者其它類似的Java類庫)才能開始做J2EE應用一樣腐晾,學過Objective-C語言之后叉弦,也要再學習Cocoa Touch框架才能順利地開發(fā)iOS應用。

最常用設計模式之Delegate

Cocoa Touch大量使用Delegate(委派)設計模式藻糖。

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

TableView

WebView

導航條

Xcode

運行

快捷鍵:Comman R

搜索

搜索文本

搜索文件

新建文件/目錄

推薦在Finder中新建好的再添加進來

斷點

模擬器和真機測試

模擬器測試

在Xcode中打開你的項目樱拴,在Xcode頂部工具欄的Stop按鈕(Run按鈕右邊那個黑色正方形按鈕)右邊,有個下拉菜單洋满,顯示著 “ToolBarSearch > iPhone 5.0 Simulator” (即 你的應用英文名 > 當前選中的調(diào)試 )晶乔,點擊這個下拉菜單,選中iPhone 5.0 Simulator(這里的5.0是指iOS版本牺勾,不是iPhone5的意思正罢,如果你的項目是iPad應用,請選iPad 5.0 Simulator)驻民,再按“Run”按鈕翻具,Xcode就會自動把當前正在編輯開發(fā)的應用編譯并安裝到模擬器上。

在模擬器上操作時回还,如果執(zhí)行過程中遇到了你在Xcode里設置的斷點裆泳,模擬器會暫停運行,并將當前活動窗口切換回Xcode柠硕,供你調(diào)試工禾。

在Xcode里增加或者取消了斷點,不需要重新編譯和安裝應用即可生效仅叫。

切換被模擬的設備

模擬器的“硬件”菜單帜篇,可以選擇想要模擬什么設備糙捺,有iPad诫咱、iPhone可選。

  • Retina:表示視網(wǎng)膜屏洪灯,iPhone(Retina)代表iPhone4坎缭,iPhone4S
  • 4-Inch:表示4英寸的iPhone竟痰,iPhone(Retina 4-Inch)就是iPhone 5

切換模擬的iOS版本

在模擬器的“版本”菜單,可以選擇要模擬什么版本的iOS掏呼。設備和版本是彼此獨立的坏快,iPhone 4S可以有5.0,5.1憎夷,6.1幾種iOS版本莽鸿,當然了,iPhone 5不可能有4.3的iOS版本拾给。

觸摸屏

用鼠標點擊(不區(qū)分左右鍵)模擬器上的iPhone祥得、iPad屏幕,就是在模擬用手指觸摸iPhone蒋得,iPad的屏幕级及,可以實現(xiàn)一些觸摸效果比如:

  • 鼠標單擊 等于 手指輕觸
  • 鼠標長按 等于 手指長按(例如你可以在模擬器上長按應用icon調(diào)出刪除應用的確認框)
  • 鼠標按住拖動 等于 手指拖動
  • 雙擊和單擊模擬器的Home鍵也等于雙擊和單擊真機的Home鍵

多指手勢

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

  • 按住Option鍵,再用兩個手指去操作觸摸板窍侧,可模擬雙指拖動县踢、旋轉(zhuǎn)
  • 按住Option+Shift,可模擬雙指合攏

輸入法和鍵盤

輸入中文

手機上特有的輸入法(比如九宮格輸入法)不能模擬伟件。模擬器默認的iOS軟鍵盤只有英文輸入殿雪,在測試應用的時候,我們要用到中文锋爪,有兩個辦法:

  • 使用剪貼板丙曙,在Mac OS里復制,再到模擬器運行的應用中的輸入框上長按鼠標(模擬手指長按)3秒以上其骄,等彈出“粘貼”的時候選擇之亏镰,即可。
  • 在模擬器里拯爽,按Home鍵索抓,找到Setting那個App icon(不是Mac OS頂部的模擬器菜單啊,那里沒有Setting的)毯炮,打開被模擬iOS設備的設置逼肯,依次點擊”General - Keyboard - International Keyboards - Add New Keyboard…”,加個中文鍵盤桃煎,以后就可以使用被模擬iOS設備軟件盤輸入中文了篮幢,跟在iPhone/iPad真機上一樣。

使用Mac電腦的鍵盤

如果要輸入大量文本为迈,使用模擬器里的軟鍵盤效率太低三椿,這時候可以使用物理鍵盤缺菌,方法是:在Mac OS頂部的模擬器菜單欄,點擊”硬件”菜單搜锰,勾選下拉菜單中的“模擬硬件鍵盤”伴郁。以后再用模擬器運行iOS應用時,點擊iOS應用中的輸入框蛋叼,軟鍵盤就不彈出來了焊傅,可直接使用Mac電腦的物理鍵盤輸入柴我。

注意

  • 模擬器中的iOS接管了物理鍵盤輸入趋观,所以,調(diào)用的是模擬器iOS的輸入法遏片,不是你的Mac電腦的輸入法薯嗤。打個比方顽爹,你的Mac OS裝的是搜狗五筆,模擬器中iOS加了個拼音輸入法(Add New Keyboard)骆姐,那么镜粤,在iOS應用中輸入中文會調(diào)用拼音輸入法。
  • 要切換模擬器中iOS的中英文輸入法玻褪,也只能按iOS設備軟鍵盤上的小地球圖標肉渴,按Mac電腦上的Command+空格鍵是不行的。

地理位置

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

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

如何獲得經(jīng)緯度蒜哀? 上谷歌地圖(http://ditu.google.cn)咏雌,在地圖上找到你想要的位置(比如你想知道杭州大廈的位置校焦,就在通過搜索框找到杭州大廈),點擊右鍵氛雪,選擇“這兒是什么”,搜索框中就會出現(xiàn)這個位置的經(jīng)緯度了浴鸿,前面是緯度弦追,后面是經(jīng)度劲件。咱們天朝的版圖,都是北緯和東經(jīng)苗分。

攝像頭

Mac電腦有攝像頭牵辣,但Mac OS沒有設計API給iOS模擬器調(diào)用纬向,所以,不能用模擬器測試對焦閃光燈等功能近她。

要在模擬器上測試依賴照片的功能膳帕,可以在代碼里做一個workaround,即當代碼檢測到攝像頭不可用時攒磨,彈出一個照片選擇器汤徽,讓測試人員從相冊里選擇一幅照片谒府,來進行后續(xù)的操作(如照片美化浮毯、人臉識別泰鸡、條碼掃描)。

真機測試

模擬器能驗證你開發(fā)的iOS應用的大部分功能饰迹,但有些Mac設備上不具備的硬件余舶,模擬器是不能模擬的匿值。前文提到了一個繞過這些限制的辦法,但獲取當前位置钟些、拍照曲楚、加速度感應這些是模擬不了的龙誊,一款應用發(fā)布給消費者之前,必須要在真實設備上驗證過鹤树。

將未提交App Store審核通過的應用安裝到iOS設備上測試逊朽,有三種辦法:

  • 加入蘋果的Developer Program叽讳,成為付費會員,有了這個付費會員資格邑狸,就可以直接在Xcode中點擊”Run”將剛剛改過的代碼編譯打包安裝到開發(fā)測試用的iOS設備上单雾。在iOS真機上操作被測試的程序能激活Xcode中設置的斷點。
  • 越獄iOS設備屿储。將iPhone和iPad越獄后渐逃,可以通過SSH直接上傳Xcode編譯好的ipa包(一個iOS App本質(zhì)上就是一個ipa包)朴乖。
  • 越獄的iOS設備助赞,配合破解過的Xcode雹食,甚至可以實現(xiàn)和付費開發(fā)者計劃一樣的功能:在Xcode上點擊”Run”,就自動編譯安裝到iOS設備上去運行了
  • 企業(yè)部署方案吃挑。就像阿里巴巴的軒轅劍一樣舶衬,用iPhone/iPad訪問這個網(wǎng)址赎离,點擊里面的軒轅劍鏈接就可以安裝軒轅劍這個應用了梁剔。

破解Xcode是違法行為(越獄是合法的),而且挑版本挑得厲害码撰,不是所有Xcode版本都能破解脖岛,也不是所有Xcode的破解版都能和越獄的iOS配合好颊亮。越獄+SSH上傳跟企業(yè)部署一樣效率低(部署效率低编兄,無法激活Xcode中的斷點),只能用于QA驗收揣苏,不適合開發(fā)自測。綜上所述脯厨,最適合開發(fā)實時測試的就是第一個正規(guī)途徑了合武。下面重點講這個:

擁有一個開發(fā)者賬號

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

在交錢之前带到,最好問一下,周圍的同事被饿,有沒有已經(jīng)交了錢的狭握。如果有,你只需要注冊一個免費的Apple ID(就是你在App Store安裝軟件用的Apple ID)哎垦,請他發(fā)個邀請郵件給你漏设,把你的Apple ID加入他的團隊就可以了澡谭,蘋果會認為你們兩個人是一個團隊的蛙奖,你們分別用自己的賬號杆兵,共享100臺設備的限額琐脏,這是合法的。

安裝證書和私鑰

證書

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

不嫌煩,或者想知道下次沒我這個文檔的時候怎么進證書管理嗎撑碴?按這個步驟操作:

頁面上有一個“Your Certificate”區(qū)域恐似,下方有個Download圓角按鈕矫夷,這是你的個人證書憋槐,下載下來阳仔。再下面一行,有一句“If you do not have the WWDR intermediate certificate installed, click here to download now”嘶摊,這個是蘋果的公共證書叶堆,也下下來斥杜。

雙擊下載回來的證書蔗喂,裝證書時,會提示你輸入密碼畦粮,這是【鑰匙串訪問工具】在問你要你的Mac OS賬號開機密碼(相當于linux里面的sudo)锈玉,不是Apple ID的密碼拉背,不要搞錯了默终。

安裝私鑰

如果你是和其它同事公用的賬號,讓他給你一個私鑰即可床估,就是一個擴展名為p12的文件诱渤,雙擊之勺美,鑰匙串訪問會自動出來赡茸,需要你輸入一個密碼,這個密碼問給你p12文件的人要遗菠,不是你的Mac OS系統(tǒng)開機密碼辙纬,也不是你的Apple ID密碼友多。

將設備注冊到Provisioning Portal

  • 打開Xcode域滥,從Xcode的Window菜單中找到Organizer启绰,打開之(Shift Command 2)委可。
  • 把iOS設備連上電腦腊嗡,Organizer會自動識別出你的設備燕少,并顯示在左側(cè)邊欄。
  • 在Organizer左側(cè)邊欄找到你的設備崇决,右鍵恒傻,點擊“Add Device to Provisioning Portal”盈厘,然后等Organizer提示你操作成功即可。(選中設備后譬重,右邊設備詳情區(qū)域會顯示一個按鈕“Use for Development”臀规,點它也可以)塔嬉。

到iOS真機上運行測試版程序

回到Xcode主界面谨究,在Stop按鈕(Run按鈕右邊那個黑色正方形按鈕)右邊泣棋,有個下拉菜單潭辈,顯示著 “ToolBarSearch > iPhone 5.0 Simulator” (即 你的應用英文名 > 當前選中的調(diào)試 )把敢,點擊這個下拉菜單,選中你的真機設備名婶恼,再按“Run”按鈕勾邦,Xcode就會自動把當前正在編輯開發(fā)的應用編譯并安裝到真機上測試啦眷篇!

發(fā)布到App Store

打IPA包

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

  • 在Xcode中Build項目确憨,快捷鍵Command B
  • 在左側(cè)項目導航器中休弃,展開Products文件夾圈膏,找到你要打包的應用稽坤,你的應用名.app尿褪,右鍵,選擇show in finder
  • 到Finder中Copy這個.app目錄(選中顿仇,按Command C)臼闻,復制到一個你新建的名為Payload(區(qū)分大小寫)的文件夾中
  • 找到你的應用Logo些阅,即一個512 * 512像素的PNG文件,copy到與Payload一起(與Payload并列恕刘,不要放進Payload了)抒倚,并重命名為iTunesArtwork(區(qū)分大小寫托呕,沒有擴展名)
  • 將Payload目錄、ItunesArtwork文件打成一個zip包斟赚,并更改擴展名為ipa
  • 雙擊這個ipa文件拗军,會用iTunes打開发侵,如果打開成功妆偏,且在iTunes里有應用Logo顯示钱骂,就成功了

批量自動打包

除App Store外罐柳,還有許多其它的iOS應用市場(如91助手张吉,同步推等等)肮蛹,如果一個應用需要發(fā)布到很多個應用市場伦忠,且他們的代碼略有不同(比如說,統(tǒng)計代碼不同)气忠,按上述方法手工修改源碼再打包旧噪,再還原淘钟,比較容易出錯米母。好消息是铁瞒,Xcode是有命令行的精拟,我們可以寫一個shell腳本蜂绎,先用se自動修改源碼,再調(diào)用Xcode的命令行來編譯以得到y(tǒng)our——app.app目錄怪瓶,最后調(diào)用zip洗贰、mv等命令把上一個章節(jié)講的ipa打包動作自動執(zhí)行敛滋。

閱讀應用代碼

從頭新建一個應用:Hello World

其它

代碼里的控件尺寸

iOS App里的控件尺寸和字體大小都是指Point绎晃,Retina設備(iPhone 4庶艾,4S咱揍,5煤裙;the new Pad)和非Retina設備(iPhone 3GS噪漾,iPad,iPad 2)的Point數(shù)是一樣的怪与,盡管iPhone 4的分辨率是3GS的2倍。比如說缅疟,10point在Retina設備里是20 pixel分别,在非Retina設備(iPhone 3G)上則是10 pixel遍愿。

項目成員間交流時,應使用Point耘斩,不要使用pixel沼填。

SVN操作含有@符號的文件

iOS應用中經(jīng)常出現(xiàn)xxxx@2x.png這樣的文件名,它們是給retina設備用的高分辨率大圖括授,用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

作為一個開發(fā)者荚虚,有一個學習的氛圍跟一個交流圈子特別重要薛夜,這有個iOS交流群:642363427,不管你是小白還是大牛歡迎入駐 版述,分享BAT,阿里面試題梯澜、面試經(jīng)驗,討論技術(shù)渴析,iOS開發(fā)者一起交流學習成長晚伙!

公眾號:iOS進階寶典

查看原文

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市俭茧,隨后出現(xiàn)的幾起案子咆疗,更是在濱河造成了極大的恐慌,老刑警劉巖母债,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件午磁,死亡現(xiàn)場離奇詭異,居然都是意外死亡场斑,警方通過查閱死者的電腦和手機漓踢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漏隐,“玉大人喧半,你說我怎么就攤上這事∏嘣穑” “怎么了挺据?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脖隶。 經(jīng)常有香客問我扁耐,道長,這世上最難降的妖魔是什么产阱? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任婉称,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘王暗。我一直安慰自己悔据,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布俗壹。 她就那樣靜靜地躺著科汗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绷雏。 梳的紋絲不亂的頭發(fā)上头滔,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音涎显,去河邊找鬼坤检。 笑死,一個胖子當著我的面吹牛棺禾,可吹牛的內(nèi)容都是我干的缀蹄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼膘婶,長吁一口氣:“原來是場噩夢啊……” “哼缺前!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起悬襟,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤衅码,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后脊岳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逝段,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年割捅,在試婚紗的時候發(fā)現(xiàn)自己被綠了奶躯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡亿驾,死狀恐怖嘹黔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情莫瞬,我是刑警寧澤儡蔓,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站疼邀,受9級特大地震影響喂江,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旁振,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一获询、第九天 我趴在偏房一處隱蔽的房頂上張望涨岁。 院中可真熱鬧,春花似錦筐付、人聲如沸卵惦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丛塌,卻和暖如春较解,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赴邻。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工印衔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姥敛。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓奸焙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親彤敛。 傳聞我的和親對象是個殘疾皇子与帆,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容