iOS開發60分鐘入門

轉載自:https://github.com/qinjx/30min_guides/blob/master/ios.md

本文面向已有其它語言(如Java,C,PHP,Javascript)編程經驗的iOS開發初學者,初衷在於讓個人同事一小時內瞭解如何開始開發iOS App,學習目標包括:php

  • 能使用Xcode IDE、模擬器
  • 能修改、調試已有iOS App
  • 能在已有應用內建立新模塊
  • 能建立新應用
  • 能發佈應用到App Store

本文不包含任何高級的iOS開發知識,已學會iOS開發的同窗不要看,看完這篇文章學會了的同窗也不用再看了。html

不只是學習一門新語言

有過腳本開發經驗的人(如Javascript,PHP,Shell)在剛開始學習iOS開發的時候,會以爲iOS開發的學習曲線比腳本語言要高,是的,這種感受是對的。由於學iOS開發,不只是學習一門新語言,它包括:java

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

初學腳本語言一般不會來繪製圖形界面、與人交互,iOS若是不作圖形界面,像腳本語言同樣處理文本操做數據庫,就沒啥意思了。linux

因此,過去我寫別的新手入門教程,一般都是寫《XXX入門15分鐘教程》,而iOS就要花數倍的時間來寫了。ios

環境準備

作iOS開發必定要有蘋果的軟件環境:Mac OS操做系統、Objective-C編譯器、設備模擬器等,開發工具倒不必定要用Xcode,只要是個源代碼編輯工具就行(vim都行,只是沒Xcode那麼多功能)。git

Mac OS

擁有Mac OS環境最簡單的方法是找一臺蘋果電腦,包括iMac, MacBook Pro, MacBook Air, Mac Mini,但不包括蘋果的移動設備(iPod Touch, iPhone, iPad, iPad Mini,它們運行的是iOS系統,不是Mac OS),蘋果電腦在出廠的時候就會預裝Mac OS,目前最新版本是Mac OS X 10.8,主流的版本還有Mac OS X 10.六、Max OS X 10.7。程序員

若是囊中羞澀,能夠借一臺,或者上淘寶買個二手的。github

黑蘋果

提到iOS開發入門,彷佛沒辦法不說黑蘋果。所謂黑蘋果,就是把Mac OS改造後安裝在非蘋果的硬件上,這是違反DMCA法案的,黑蘋果的更多資料,能夠在維基上找到web

蘋果電腦價格高,國內軟件開發者生存壓力大,因此黑蘋果在國內也有一些真實的存在,國外固然也有啦。objective-c

黑蘋果基本能夠勝任iOS開發,但有一些問題:

  • 安裝黑蘋果是非法的
  • 我的行爲蘋果公司通常不會追究,但會遭同行的鄙視
  • 黑蘋果超級難裝,挑硬件。即便徹底相同的型號,相同的批次,也有可能A機器裝上了,B機器裝不上
  • 黑蘋果系統多少都存在一些使用上的問題,像驅動Bug啦、待機恢復藍屏啦、上網瀏覽有問題啦
  • 黑蘋果不能隨意升級,可能升級一次safari就致使整個系統崩潰了

上面這些雖然不會直接影響Xcode寫代碼、模擬器測試,但寫着寫着想上網查個東西的時候,safari不能翻頁,確實挺影響心情的。因此,錢包容許的前提下,仍是搞個蘋果電腦省心一些。

Xcode 和 模擬器

Xcode能夠在蘋果官網免費下載:Xcode下載地址

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

這麼強大的IDE竟然是免費的,仍是挺讓人開心的。

從改一個現成的應用開始吧

學一門新軟件開發技能,可以第一時間作出一個可運行的產品很是重要,有助於給本身正面激勵,我上大學的時候,有不少次想學一門新語言,每每花了半個月,還沉浸在數據類型和語法字典裏,連第一個Hello World都沒作出來。

這一次,就讓咱們從改一個現成的應用開始吧。

下載

首先,咱們從蘋果開發者中心下載一個示例代碼回來。我選了ToolBarSearch

在本文檔的末尾,還有一些其它的網址能夠下載開源iOS產品或者代碼段,但我試了一下,仍是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已經啓動了,就先按Command Q退出),啓動Xcode,會彈出「Welcome to Xcode」的歡迎頁,點擊左下角的「Open Other」按鈕,找到ToolBarSearch目錄,雙擊ToolBarSearch目錄,或者雙擊ToolBarSearch.Xcodeproj文件均可以

  • 若是Xcode處於打開狀態,能夠點擊其菜單欄的File -> Open,或者File -> Open Recent,而後再選擇要打開的項目

經過命令行打開

在Mac OS 10.8之前,有些目錄(例如/var/private/tmp),在Finder和Xcode的File > Open對話框中,點擊鼠標是找不到的,這時候就要經過命令行終端來打開了。

打開終端,執行:

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

open -a是mac os的系統命令,除了iOS項目,別的項目也能夠這樣打開。

運行剛下載的應用

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

編譯成功會在屏幕上淡淡地顯示「Build Succeeded」。反之,失敗就顯示「Build Failed」且不啓動模擬器。

修改

在模擬器上看到「Performed search using…」了吧,下面咱們改掉它。

  • 在Xcode左上角的Run按鈕下方,有一排小按鈕,從左到右第三個是一個放大鏡圖標,鼠標移上去會顯示「Show the Search Navigator」,點一下它,打開搜索界面,在它下方出現的Find輸入框中輸入「performed」

  • 搜索結果只有一條:ToolbarSearchViewController.m,點文件名下方被高亮的「Performed」字串,右側代碼編輯區會自動打開這個文件,並滾動屏幕,使包含「Performed」的這一行出如今編輯區的中間。

  • 修改雙引號裏的字串,隨便改爲啥,而後按「Command S」保存。

固然,這些操做,你也能夠在終端下經過grep和vim完成。

運行修改後的應用

按Command R運行,看看,是否是看到效果啦?

是的,修改一個應用就這麼簡單。

Objective-C

Objective-C是蘋果應用軟件(包括蘋果電腦上的Mac OS App和移動設備上的iOS App)的開發語言。它是一種面向對象的編程語言。

蘋果公司還提供了一個軟件,叫Interface Builder,簡稱IB,用於可視化的界面製做,就像用Dreamweaver作網頁,或者像Visual Basic作桌面軟件同樣。後來IB就整合進了Xcode,成了Xcode的一部分。這篇文檔不講IB,只講Objective-C,由於:

  • 基本上,每一本講iOS開發的書(紙質書、電子書),都有大量的截圖一步一步教如何用IB開發iOS應用,而講Objective-C開發應用的書卻沒有那麼多。
  • IB能夠用來直觀方便地畫界面、設置控件屬性、創建代碼與控件的聯繫,但後臺的業務邏輯和數據處理仍然要靠Objective-C,可見,無論用不用IB,Objective-C都是繞不過去的。

C的超集

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

  • 任何C源程序,不經修改,便可經過Objective-C編譯器成功編譯
  • Objective-C源程序中能夠直接使用任何C語言代碼

除了面向對象有語法是SmallTalk風格的(下面會講到),其它非面向對象的語法、數據類型,與C徹底相同,因此本文就再也不贅述。 來看一個經典的Hello World示例吧:

#import <Foundation/Foundation.h>
int main(int argc, char *argv[]){
    @autoreleasepool{
        NSLog(@"Hello World!");
    }
    return 0;
}

是否是彷彿穿越回了大一學習C語言的時代,看起來和C幾乎沒有區別,是吧?是的,由於還沒用到它的面向對象特性,哈哈!

SmallTalk的消息傳遞語法風格

Objective-C的面向對象語法源自SmallTalk,消息傳遞(Message Passing)風格。在源碼風格方面,這是它與C Family語言(包括C/C++、Java、PHP)差異最大的地方。

在Java、C++世界,咱們調用一個對象的某方法,在Objective-C裏,這稱做給類型發送一個消息,這可不只僅是文字遊戲,他們的技術細節也是不一樣的。

在Java裏,對象和方法關係很是嚴格,一個方法必須屬於一個類/對象,不然編譯是要報錯的。而在Objective-C裏,類型和消息的關係比較鬆散,消息處理到運行時(runtime)纔會動態決定,給類型發送一個它沒法處理的消息,也只會拋出一個異常,而不會掛掉。

[obj undefinedMethod];

在代碼裏調用沒定義的方法(這是Java世界的習慣說法啊,專業的叫法是,給obj對象傳遞它沒法處理的消息),Xcode會警告,但編譯能成功,運行的時候會出錯。它會輸出這樣一個錯誤:

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

相似Java的OOP概念

Objective-C中一些面向對象的概念,也能夠在Java中找到相似的實現(只能說是相似,不是徹底相同),個人讀者基本都是Java和PHP程序員,我會在下文中儘可能用Java的概念來類比。

GoogleCode上有人整理了Java和Objective-C的概念、數據類型對應表,參見這裏

字符串

Objective-C裏有字符串是由雙引號包裹,並在引號前加一個@符號,例如:

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

PHP程序員要注意,在這裏不能用單引號,即便只有一個字符也不能用。Objective-C與Java、C同樣,雙引號表示字符串。

函數調用

前文述及,不涉及面向對象時,它和C是徹底同樣的。如下是幾個函數調用的示例:

不帶參數

startedBlock();

帶參數

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

傳遞消息給類/實例方法

不帶參數

[obj method];

對應的Java版本

obj.method();

帶一個參數:

[counter increase:1];

對應的Java版本

counter.increase(1);

帶多個參數

對C Family程序員來講,這是最難接受的,最反人類的:

- (void) setColorToRed: (float)red Green: (float)green Blue:(float)blue {...} //定義方法
[myObj setColorToRed: 1.0 Green: 0.8 Blue: 0.2]; //調用方法

對應的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沒有指針,因此星號去掉了

接口和實現

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

接口定義也能夠寫在.m文件中,但最好不要這麼幹

須要注意的是,與Objective-C的interface概念最接近的是C和C++裏的頭文件,它與implementation是成雙成對出現的,做用是聲明類的成員變量和方法。它與Java的interface概念徹底不一樣:

  • Objective-C裏,interface有且只有一個實現,Java的interface能夠有0-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

接口和實現以@interface、@implementation開頭,都以@end結束。「@」符號在Objective-C中是個很神奇的符號。

冒號也是方法名的一部分,method和method:是兩個不一樣的方法名,不是overload,第二個帶參數。

上述代碼對應的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怎麼實現私有方法,我查閱了stackoverflow,統一的答案是,要實現私有方法的效果只能藉助Category,不過,根據個人測試,即便採用了Category,也不能阻止外部的代碼調用這個「私有方法」,只是Xcode不支持「私有方法」的自動完成,並會有警告提示,運行的時候,仍是會成功的。各位看官知道有這麼回事就能夠了,這裏不深講。

變量和屬性

類方法和實例方法

類方法

類方法就是Java、PHP裏的Static Method,不用實例化就能調。類方法有一個加號前綴。 示例:

類定義

@interface MyClass
    +(void) sayHello;
@end

@implementation MyClass

+(void) sayHello {
    NSLog(@"Hello, World");
}
@end

使用

[MyClass sayHello];
實例方法

實例方法就是Java、PHP裏的普通方法,必須實例化才能調。實例方法有一個減號前綴。 示例:

類定義

@interface MyClass : NSObject
-(void) sayHello;
@end

@implementation MyClass

-(void) sayHello {
    NSLog(@"Hello, World");
}
@end

使用

mycls = [MyClass new];
[mycls sayHello];

Selector

selector就是一個方法指針,相似PHP裏的動態方法名:

<?php
class Hello {
    public function sayHello() {}

    public function test() {
        $fun_name = "sayHello";
        $this->$fun_name();
    }
}

在Objective-C裏,selector主要用來作兩類事情:

綁定控件觸發的動做
@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];//當這個按鈕被按下時,觸發downButtonPressed:方法
}
@end
延時異步執行
@implementation ETHotDealViewController
- (void)viewDidLoad {

    //獲取數據源
    HotDealDataSource *ds = [[HotDealDataSource alloc]init];
    [ds reload];
    _items = ds.items;

    [self performSelector: @selector(refreshTable)
          withObject: self
          afterDelay: 0.5];//延遲0.5秒調用refreshTable方法
}

-(void)refreshTable
{
    [self.tableView reloadData];
}
@end

這個例子中,獲取數據源是經過ASIHTTP組件異步調用服務端HTTP接口,refreshTable要用到數據源返回回來的數據,若是不延遲0.5秒,就會馬上執行,執行的時候數據還在路上呢,頁面就要變空白了。

繼承

繼承是寫在Interface定義裏面的。語法爲:子類名在左,父類名在右,中間用冒號分隔。 示例:

@interface MyClass : NSObject
@end

對應的Java版本是:

public class MyClass extends NSObject {
}

協議(Protocol)

就是Java、PHP裏的Interface。

協議的定義

協議的定義用@protocol關鍵字:

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

對應的Java版本是:

publilc interface Printable {
    public void print(String str);
}
協議的繼承

協議自己也能夠繼承別的協議:

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

對應的Java版本:

public interface Printable extends NSObject {
    public void print (String str);
}
可選方法

協議能夠包含可選方法,顧名思義,可選方法能夠不被類實現:

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

加了@optional關鍵字,一個類在implements這個協議時,即可以不實現print:方法。

Java裏沒有相似的實現,除了Collection裏會有一些方法帶有optional的註釋,但Collection是個特例。

協議的實現

一個類實現某些協議是寫在Interface定義裏面的。語法爲:協議名用尖括號包裹,多個協議名用逗號隔開,協議寫在父類的右邊(若是沒有父類就直接寫在子類右邊)。

示例:

@interface  class MyClass : NSObject <Printable, Drawable>
@end

Printable, Drawablw就是兩個協議。

對應的Java版本是:

public class MyClass extends NSObject implements Printable, Drawable {
}

分類(Category)

分類能夠給一個已經存在的類增長方法,而不用去改它的源碼。Java和PHP中都沒有相似的特性。

好比說,NSObject是一個Objective-C內置的系統類,咱們想給它增長toJson方法,就像這樣:

頭文件:NSObject+Json.h

@interface NSObject (Json)
    -(NSString)toJson;
@end

實現文件:NSObject+Json.m

@implementation NSObject (Json)
    -(NSString)toJson {
        //...
    }
@end

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

import "NSObject+Json.h"
@implatementation XYZController
    -(void)test {
        NSObject *obj = [[NSObject alloc]init];
        NSString *str = [obj toJson];
    }
@end

固然了,NSObject原本的那些方法依然仍是能夠用的,什麼都沒變,只是多了個toJson方法。看起來是否是和繼承沒太多差異呢(除了使用的時候實例化的是NSObject,而不是JsonObject)?再看一個繼承實現不了的例子:

頭文件:NSObject+Json+XML.h

@interface NSObject (Json)
    -(NSString)toJson;
@end

@interface NSObject (XML)
    -(NSString)toXML;
@end

實現文件: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的開發框架,Cocoa Touch是iOS開發用的框架,Cocoa Touch和Cocoa大部分是同樣的,只是Cocoa Touch多了一些移動設備特有的東西,如:觸摸屏、加速度傳感器、GPS定位。Cocoa中多任務、多窗口的特性,在Cocoa Touch中也是沒有的(或者跟Cocoa不徹底同樣的)。

就像學了Java語言還要再學一些Spring、Hibernate、Struts(或者其它相似的Java類庫)才能開始作J2EE應用同樣,學過Objective-C語言以後,也要再學習Cocoa Touch框架才能順利地開發iOS應用。

最經常使用設計模式之Delegate

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

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

TableView

WebView

導航條

Xcode

運行

快捷鍵:Comman R

搜索

搜索文本

搜索文件

新建文件/目錄

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

斷點

模擬器和真機測試

模擬器測試

在Xcode中打開你的項目,在Xcode頂部工具欄的Stop按鈕(Run按鈕右邊那個黑色正方形按鈕)右邊,有個下拉菜單,顯示着 「ToolBarSearch > iPhone 5.0 Simulator」 (即 你的應用英文名 > 當前選中的調試 ),點擊這個下拉菜單,選中iPhone 5.0 Simulator(這裏的5.0是指iOS版本,不是iPhone5的意思,若是你的項目是iPad應用,請選iPad 5.0 Simulator),再按「Run」按鈕,Xcode就會自動把當前正在編輯開發的應用編譯並安裝到模擬器上。

在模擬器上操做時,若是執行過程當中遇到了你在Xcode裏設置的斷點,模擬器會暫停運行,並將當前活動窗口切換回Xcode,供你調試。

在Xcode裏增長或者取消了斷點,不須要從新編譯和安裝應用便可生效。

切換被模擬的設備

模擬器的「硬件」菜單,能夠選擇想要模擬什麼設備,有iPad、iPhone可選。

  • Retina:表示視網膜屏,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版本。

觸摸屏

用鼠標點擊(不區分左右鍵)模擬器上的iPhone、iPad屏幕,就是在模擬用手指觸摸iPhone,iPad的屏幕,能夠實現一些觸摸效果好比:

  • 鼠標單擊 等於 手指輕觸
  • 鼠標長按 等於 手指長按(例如你能夠在模擬器上長按應用icon調出刪除應用的確認框)
  • 鼠標按住拖動 等於 手指拖動
  • 雙擊和單擊模擬器的Home鍵也等於雙擊和單擊真機的Home鍵
多指手勢

多指手勢比較複雜,在白蘋果筆記本上能夠模擬簡單的雙指手勢,白蘋果的觸控板自然支持多指觸摸,但要定位到模擬器的區域再響應多指手勢就須要藉助一些額外的鍵啦:

  • 按住Option鍵,再用兩個手指去操做觸摸板,可模擬雙指拖動、旋轉
  • 按住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接管了物理鍵盤輸入,因此,調用的是模擬器iOS的輸入法,不是你的Mac電腦的輸入法。打個比方,你的Mac OS裝的是搜狗五筆,模擬器中iOS加了個拼音輸入法(Add New Keyboard),那麼,在iOS應用中輸入中文會調用拼音輸入法。
  • 要切換模擬器中iOS的中英文輸入法,也只能按iOS設備軟鍵盤上的小地球圖標,按Mac電腦上的Command+空格鍵是不行的。

地理位置

但Mac電腦沒有定位用的硬件(GPS)和軟件基礎,所以模擬器不能自動得到當前的地理位置,不能用模擬器測試定位功能。(注意,雖然WiFi也能夠獨立定位——iPad WiFi版沒有GPS也能夠定位,但Mac電腦的WiFi不具有定位相關的軟件)

要在模擬器裏測試依賴地理位置的功能(如」我附近的xx」),能夠手工指定一個經緯度給模擬器,方法:在Mac電腦頂部的模擬器菜單,點擊」調試 - 位置 - 自定位置」,會彈出一個對話框,在彈出的框內填入經緯度便可。

如何得到經緯度? 上谷歌地圖(ditu.google.cn),在地圖上找到你想要的位置(好比你想知道杭州大廈的位置,就在經過搜索框找到杭州大廈),點擊右鍵,選擇「這兒是什麼」,搜索框中就會出現這個位置的經緯度了,前面是緯度,後面是經度。我們天朝的版圖,都是北緯和東經。

攝像頭

Mac電腦有攝像頭,但Mac OS沒有設計API給iOS模擬器調用,因此,不能用模擬器測試對焦閃光燈等功能。

要在模擬器上測試依賴照片的功能,能夠在代碼裏作一個workaround,即當代碼檢測到攝像頭不可用時,彈出一個照片選擇器,讓測試人員從相冊裏選擇一幅照片,來進行後續的操做(如照片美化、人臉識別、條碼掃描)。

真機測試

模擬器能驗證你開發的iOS應用的大部分功能,但有些Mac設備上不具有的硬件,模擬器是不能模擬的。前文提到了一個繞過這些限制的辦法,但獲取當前位置、拍照、加速度感應這些是模擬不了的,一款應用發佈給消費者以前,必需要在真實設備上驗證過。

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

  • 加入蘋果的Developer Program,成爲付費會員,有了這個付費會員資格,就能夠直接在Xcode中點擊」Run」將剛剛改過的代碼編譯打包安裝到開發測試用的iOS設備上。在iOS真機上操做被測試的程序能激活Xcode中設置的斷點。
  • 越獄iOS設備。將iPhone和iPad越獄後,能夠經過SSH直接上傳Xcode編譯好的ipa包(一個iOS App本質上就是一個ipa包)。
  • 越獄的iOS設備,配合破解過的Xcode,甚至能夠實現和付費開發者計劃同樣的功能:在Xcode上點擊」Run」,就自動編譯安裝到iOS設備上去運行了
  • 企業部署方案。就像阿里巴巴的軒轅劍同樣,用iPhone/iPad訪問這個網址,點擊裏面的軒轅劍連接就能夠安裝軒轅劍這個應用了。

破解Xcode是違法行爲(越獄是合法的),並且挑版本挑得厲害,不是全部Xcode版本都能破解,也不是全部Xcode的破解版都能和越獄的iOS配合好。越獄+SSH上傳跟企業部署同樣效率低(部署效率低,沒法激活Xcode中的斷點),只能用於QA驗收,不適合開發自測。綜上所述,最適合開發實時測試的就是第一個正規途徑了。下面重點講這個:

擁有一個開發者帳號

蘋果的Developer Program分爲我的開發者和公司開發者,分別是每一年99美圓和每一年299美圓,分別能夠註冊100臺和500臺蘋果測試設備。這個臺數限制在一個付費年度內不會清空,好比說,2013年4月1日付費成功的,付費會員資格在2014年3月31日以前有效,這期間,註冊一臺就少一個名額,哪怕這個設備註冊進來用了以後一分鐘立刻又刪掉了,減小的這個名額也不會回來。

在交錢以前,最好問一下,周圍的同事,有沒有已經交了錢的。若是有,你只須要註冊一個免費的Apple ID(就是你在App Store安裝軟件用的Apple ID),請他發個邀請郵件給你,把你的Apple ID加入他的團隊就能夠了,蘋果會認爲大家兩我的是一個團隊的,大家分別用本身的帳號,共享100臺設備的限額,這是合法的。

安裝證書和私鑰

證書

不想看下面各類點擊各類頁面跳轉的直接用瀏覽器訪問證書管理,你要登陸你就用Apple ID登陸(前提是交過錢,或者找交了錢的人把你加入團隊了)。

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

頁面上有一個「Your Certificate」區域,下方有個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系統開機密碼,也不是你的Apple ID密碼。

將設備註冊到Provisioning Portal

  • 打開Xcode,從Xcode的Window菜單中找到Organizer,打開之(Shift Command 2)。
  • 把iOS設備連上電腦,Organizer會自動識別出你的設備,並顯示在左側邊欄。
  • 在Organizer左側邊欄找到你的設備,右鍵,點擊「Add Device to Provisioning Portal」,而後等Organizer提示你操做成功便可。(選中設備後,右邊設備詳情區域會顯示一個按鈕「Use for Development」,點它也能夠)。

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

回到Xcode主界面,在Stop按鈕(Run按鈕右邊那個黑色正方形按鈕)右邊,有個下拉菜單,顯示着 「ToolBarSearch > iPhone 5.0 Simulator」 (即 你的應用英文名 > 當前選中的調試 ),點擊這個下拉菜單,選中你的真機設備名,再按「Run」按鈕,Xcode就會自動把當前正在編輯開發的應用編譯並安裝到真機上測試啦!

發佈到App Store

打IPA包

IPA包本質上是一個ZIP壓縮包,只不過它有着特殊的目錄結構,擴展名是ipa,製做方法以下:

  • 在Xcode中Build項目,快捷鍵Command B
  • 在左側項目導航器中,展開Products文件夾,找到你要打包的應用,你的應用名.app,右鍵,選擇show in finder
  • 到Finder中Copy這個.app目錄(選中,按Command C),複製到一個你新建的名爲Payload(區分大小寫)的文件夾中
  • 找到你的應用Logo,即一個512 * 512像素的PNG文件,copy到與Payload一塊兒(與Payload並列,不要放進Payload了),並重命名爲iTunesArtwork(區分大小寫,沒有擴展名)
  • 將Payload目錄、ItunesArtwork文件打成一個zip包,並更改擴展名爲ipa
  • 雙擊這個ipa文件,會用iTunes打開,若是打開成功,且在iTunes裏有應用Logo顯示,就成功了

批量自動打包

除App Store外,還有許多其它的iOS應用市場(如91助手,同步推等等),若是一個應用須要發佈到不少個應用市場,且他們的代碼略有不一樣(好比說,統計代碼不一樣),按上述方法手工修改源碼再打包,再還原,比較容易出錯。好消息是,Xcode是有命令行的,咱們能夠寫一個shell腳本,先用se自動修改源碼,再調用Xcode的命令行來編譯以獲得your——app.app目錄,最後調用zip、mv等命令把上一個章節講的ipa打包動做自動執行。

閱讀應用代碼

從頭新建一個應用:Hello World

其它

代碼裏的控件尺寸

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

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

SVN操做含有@符號的文件

iOS應用中常常出現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

上面這個命令是將文件名不包含@符號的,且已經不在硬盤上的文件從svn version controll中刪掉

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

上面這個命令是將文件名包含@符號的,且已經不在硬盤上的文件從svn version controll中刪掉

svn add同上, 如法炮製便可.

Xcode中的代碼結構與操做系統上的文件系統並不一致

推薦在Finder裏建好目錄再到Xcode的Project Navigator中點擊「Add Files to」添加到項目中

iPhone 5適配

iPhone 5與以前的iPhone不同,採用了4寸Retina屏,因此它的Point數變成了320 * 568 points

開源代碼

Objective-C教程

相關文章
相關標籤/搜索