當前位置:首頁 > 嵌入式 > 嵌入式軟件
[導讀] 本文面向已有其它語言(如Java,C,PHP,Javascript)編程經驗的iOS開發(fā)初學者,初衷在于讓我的同事一小時內了解如何開始開發(fā)iOS App,學習目標包括:

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

能使用Xcode IDE、模擬器

能修改、調試已有iOS App

能在已有應用內創(chuàng)建新模塊

能創(chuàng)建新應用

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

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

不僅是學習一門新語言

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

一門語言:Objective-C

一個框架:Cocoa Touch

一個IDE:Xcode

初學腳本語言通常不會來繪制圖形界面、與人交互,iOS如果不做圖形界面,像腳本語言一樣處理文本操作數據庫,就沒啥意思了。

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

環(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法案的,黑蘋果的更多資料,可以在維基上找到

蘋果電腦價格高,國內軟件開發(fā)者生存壓力大,所以黑蘋果在國內也有一些真實的存在,國外當然也有啦。

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

安裝黑蘋果是非法的

個人行為蘋果公司一般不會追究,但會遭同行的鄙視

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

黑蘋果系統(tǒng)多少都存在一些使用上的問題,像驅動Bug啦、待機恢復藍屏啦、上網瀏覽有問題啦

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

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

Xcode 和 模擬器

Xcode可以在蘋果官網免費下載:Xcode下載地址

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

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

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

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

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

下載

首先,我們從蘋果開發(fā)者中心下載一個示例代碼回來。我選了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處于打開狀態(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”且不啟動模擬器。

修改

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

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

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

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

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

運行修改后的應用

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

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

Objective-C

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

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

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

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

C的超集

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

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

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

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

#import

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

@autoreleasepool{

NSLog(@"Hello World!");

}

return 0;

}

是不是仿佛穿越回了大一學習C語言的時代,看起來和C幾乎沒有區(qū)別,是吧?是的,因為還沒用到它的面向對象特性,哈哈!

SmallTalk的消息傳遞語法風格

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

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

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

[obj undefinedMethod];

在代碼里調用沒定義的方法(這是Java世界的習慣說法啊,專業(yè)的叫法是,給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,統(tǒng)一的答案是,要實現私有方法的效果只能借助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里的動態(tài)方法名:

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 {

//獲取數據源

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秒,就會立刻執(zhí)行,執(zhí)行的時候數據還在路上呢,頁面就要變空白了。

繼承

繼承是寫在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

-(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

@end

Printable, Drawablw就是兩個協議。

對應的Java版本是:

public class MyClass extends NSObject implements Printable, Drawable {

}

分類(Category)

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

比如說,NSObject是一個Objective-C內置的系統(tǒng)類,我們想給它增加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的開發(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” (即 你的應用英文名 > 當前選中的調試 ),點擊這個下拉菜單,選中iPhone 5.0 Simulator(這里的5.0是指iOS版本,不是iPhone5的意思,如果你的項目是iPad應用,請選iPad 5.0 Simulator),再按“Run”按鈕,Xcode就會自動把當前正在編輯開發(fā)的應用編譯并安裝到模擬器上。

在模擬器上操作時,如果執(zhí)行過程中遇到了你在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版本。

觸摸屏

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

鼠標單擊 等于 手指輕觸

鼠標長按 等于 手指長按(例如你可以在模擬器上長按應用icon調出刪除應用的確認框)

鼠標按住拖動 等于 手指拖動

雙擊和單擊模擬器的Home鍵也等于雙擊和單擊真機的Home鍵

多指手勢

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

按住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,即當代碼檢測到攝像頭不可用時,彈出一個照片選擇器,讓測試人員從相冊里選擇一幅照片,來進行后續(xù)的操作(如照片美化、人臉識別、條碼掃描)。

真機測試

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

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

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

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

越獄的iOS設備,配合破解過的Xcode,甚至可以實現和付費開發(fā)者計劃一樣的功能:在Xcode上點擊”Run”,就自動編譯安裝到iOS設備上去運行了

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

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

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

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

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

安裝證書和私鑰

證書

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

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

點擊iOS Dev Center

點藍色“Login”按鈕,用你的Apple ID登錄,登錄成功會跳到 開發(fā)者首頁

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

點左側菜單欄里的Certificates

頁面上有一個“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會自動識別出你的設備,并顯示在左側邊欄。

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

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

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

發(fā)布到App Store

打IPA包

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

在Xcode中Build項目,快捷鍵Command B

在左側項目導航器中,展開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自動修改源碼,再調用Xcode的命令行來編譯以得到y(tǒng)our——app.app目錄,最后調用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數是一樣的,盡管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中的代碼結構與操作系統(tǒng)上的文件系統(tǒng)并不一致

推薦在Finder里建好目錄再到Xcode的Project Navigator中點擊“Add Files to”添加到項目中

iPhone 5適配

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

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

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

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

關鍵字: 汽車 人工智能 智能驅動 BSP

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

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

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

關鍵字: 華為 12nm EDA 半導體

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

關鍵字: 華為 12nm 手機 衛(wèi)星通信

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

關鍵字: 通信 BSP 電信運營商 數字經濟

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

關鍵字: VI 傳輸協議 音頻 BSP

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

關鍵字: BSP 信息技術
關閉
關閉