吳君曉,女,寧波大紅鷹學院 2008級計算機科學與技術專業學生
項目基金:浙江省2010年度大學生科技創新活動項目(新苗計劃),項目編號:2010R423002
摘要:以地址簿應用程序為原型,對基于iPhone的應用程序開發進行了有益的探索, 解析了iPhone開發中的多視圖開發以及數據持久存儲等基本問題,探討了基于iPhone應用程序開發的基本流程,對基于移動平臺的應用程序實現有一定的借鑒作用。
關鍵詞:iPhone 地址簿 應用程序開發
中圖分類號: TP311 文獻標識碼:A 文章編號:1674-098X(2011)10(b)-0000-00
1 引言
第三代移動通信技術(3rd-generation,3G)的高速數據下載能力,以及終端應用程序的需求,促使了手機應用程序開發的快速發展。具有特定功能的應用程序對于用戶來說更有用,更方便。用戶只需打開終端的相應應用程序自動捕獲信息,而不用打開瀏覽器來主動搜索獲得信息。基于iPhone的手機應用程序也與日俱增,憑借iPhone 完美的用戶體驗性能,使得iPhone手機應用程序有極其廣闊的使用群體。
為探索iPhone平臺下應用程序開發的機制,作者按照浙江省2010年度大學生新苗計劃項目的要求,以地址簿應用程序為原型,對基于iPhone的應用程序開發進行的有益的探索。
地址簿應用程序以提供快捷方便的方式來存儲聯系人信息。地址簿信息是所有應用共享的非常重要的資源,使電話通訊、收發郵件、短信這樣的基本交互變得簡單,并允許其他的應用程序訪問該表獲取相關信息。本文對iPhone開發過程中的多視圖開發、數據持久存儲等基本問題進行了解析,并探討了基于iPhone應用程序開發的基本流程。
2 iPhone開發平臺簡介
iPhone基于SDK開發,采用Objective-C語言和Xcode開發環境,開發的應用程序運行在iPhone模擬器上。iPhone模擬器基本支持模擬真機上的所有功能,包括旋轉、搖晃等物理功能。
Objective-C是擴充C的面向對象編程語言,可以在支持gcc運作的系統上編寫代碼和編譯,同時又可以與c/c++混合編程。iPhone開發采用Cocoa快速開發框架。Cocoa框架最大程度的幫助開發人員開發出功能強大的軟件。Cocoa Frameworks包含以下兩個子框架:Foundation 和UIKit。
3 系統的設計與實現
3.1 功能模塊
地址簿應用程序包括了查詢聯系人詳細信息、添加新聯系人、刪除聯系人等基本功能模塊。在主界面上,按字母順序排列聯系人列表,用戶可以滾動查看聯系人。觸摸聯系人的名字將顯示這個聯系人的詳細信息。觸摸應用程序右上角的添加聯系人按鈕添加一個新的聯系人。觸摸左上角的修改聯系人按鈕可以實現選擇刪除聯系人。
3.2 總體設計
地址薄應用程序使用表視圖(UITableView)并復用UITableViewCells顯示聯系人列表,使用導航控制器實現添加、查看、修改視圖和主視圖間的切換。導航控制器通過一個視圖控制器棧來維護視圖的導航,當需要顯示某視圖,則壓棧該視圖的控制器,當前的視圖控制器出棧,則下一個視圖成為當前視圖。
iPhone視圖的規則是:一個窗口(UIWindow),多個視圖(UIView)。即只允許一個應用程序只有一個窗口。每個視圖通常都擁有一個視圖控制器。視圖控制器(UIViewController)管理著UIViews相應的表視圖控制器(UITableViewController)管理著UITableView。視圖控制器不是視圖,它們是沒有可視化表示的抽象類。視圖控制器集中進行視圖管理,包括管理頁面的生命周期,設置視圖的外觀和它顯示的子視圖,響應正在顯示或消失的視圖。
3.3 UI設計
地址薄應用程序創建一個基于Navigation—Based Application模板的多視圖項目。用戶主要通過IB(Interface Builder)程序來創建和編輯nib文件來設計界面。iPhone 操作系統提供了非常出色的UI庫以供用戶進行可視化設計,但不會產生任何維護的代碼。也可以通過代碼來實現界面的設計工作,或者繼承已有的視圖或控件。
地址薄應用程序主要的界面設計工作都是通過代碼來實現的:
(1) 為導航欄添加按鈕以便通過一個導航欄在多層視圖之間切換。所有的UIViewControllers都擁有一個UINavigationController類型的NavigationController的屬性。UINavigationItems包含用來在應用程序屏幕間導航的按鈕。在導航欄上添加一個添加按鈕來實現導航只添加新聯系人視圖:
UIBarButtonItem *plusButton=[[UIButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self
action:@selector(addContact)];
self.navigationItem.rightBarButtonItem=plusButton;
地址簿應用程序導航欄中還包含了返回、修改等Items,其放置位置只能是導航欄的左側或右側。
(2) 在每個聯系人窗格右側添加一個顯示聯系人按鈕實現導航到詳細信息視圖。
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
(3) 復用UITableViewCells節約內存。當翻閱一長串的聯系人時,在任何時候只有有限數量的聯系人可以出現在屏幕上。我們可以通過調用UITableView的dequeueReusableCellWithIdentifier:方法來重用那些不可見的UITableViewCells,而不是為要顯示的聯系人創建新的窗格。這樣可以節省內存并提高應用程序的性能。
3.4 數據持久性存儲
(1) 屬性列表訪問
持久性存儲就是某種形式存儲的非易失性存儲,這種存儲在設備應用程序重啟時不會丟失數據。在許多的應用程序中,需要持久存儲數據,在用戶進行更改時能夠保存這些修改到某種形式。
地址簿應用程序采用屬性列表訪問機制。屬性列表機制只要序列化特定的數據模型對象,就可以將字典(NSDictionary)和數組(NSArray)實例寫入屬性列表以及從屬性列表創建它們。
屬性列表機制都將考慮將數據存儲在一個文件中,還是存儲在多個文件中。使用單個文件存儲形式時,必須將全部的應用程序數據加載到內存中,并且將所有數據全部寫入文件系統,即使更改再少也是如此。而多個文件存儲形式允許應用程序僅加載用戶請求的數據,但大大增加了應用程序的復雜性。它當用戶進行更改時,只需保存更改的文件。此方法允許開發人員在收到內存不足通知時釋放內存。一般情況下,會選擇單個文件存儲,因為已足夠滿足于一般的程序。
(2) 獲取存儲文件
屬性列表持久存儲機制使用iPhone的文件系統實現,持久性存儲文件都存儲在應用程序的/Doucement文件夾。每個程序都有自己的/Doucement文件夾,并且應用程序僅能讀取各自的/Doucement文件夾目錄中的內容。應用程序將數據存儲在/Doucement中。不管使用什么機制實現持久數據存儲,只要是采用文件系統實現,都要獲取存儲文件路徑。
獲取/Doucement目錄:檢索/Doucement目錄的完整路徑以便讀取和寫入文件。使用C函數的NSSearchPathForDirectoriesInDomain來查找各種目錄,它是Foundation函數,因此可以在Cocoa框架中應用。
獲取文件夾路徑:
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
NSString *directory = [paths objectAtIndex:0];
獲取存儲文件路徑:使用stringByAppendingPathComponent方法追加存儲文件名,以獲得存儲的完整路徑。通常還會添加NSFileManager對象檢測數據存儲文件是否存在,如果存在則初始化,若不存在則新建。
filePath = [[NSString alloc] initWithString:
[directory stringByAppendingPathComponent:@\"contacts\"]];
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:filePath])
contacts = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
else // else initialize contacts as empty NSMutableArray
contacts = [[NSMutableArray alloc] init];
(3) 數據訪問
許多應用程序都使用了屬性列表,盡管可以讓任何對象序列化,但只能將這些對象放置到某個集合類(主要NSDictionary和NSArray)中,然后使用該集合類的writeToFile:atomically:方法將它們存儲到屬性列表。地址簿應用程序使用單個文件實現持久性存儲,首先創建一個根對象,通常是NSArray或NSDictionary。接下來,使用所有需要保存的程序數據填充根對象。需要保存時,代碼會將該根對象的全部內容重新寫入單個文件。應用程序在啟動時會將該文件的全部內容讀入內存,并在退出時注銷全部內容。程序中使用鍵/值編碼對對象和本地數據類型進行讀取和寫入。當應用程序管理的數據只有幾兆字節時,將會非常簡單。
讀取:
NSString *name = [[contacts objectAtIndex:indexPath.row] valueForKey:@\"Name\"];
寫入:
[contacts addObject:person];
[contacts writeToFile:filePath atomically:NO];
4 存在的問題及解決方案
4.1 存在的問題
在本項目中對數據的存儲采用列表存儲方式,雖然減小了程序,但是不能滿足大量的數據存儲和數據檢索等問題。但是對于數據的存儲和檢索數據存在一定的缺陷。Core Data以其數據模型編輯器幫助完成所有文件的系統管理工作。
4.2 解決方案
持久存儲數據可以使用多種不同的機制數進行數據持久存儲在iPhone上設備上,主要采用以下四種機制:屬性列表機制,對象歸檔機制,iPhone的嵌入式數據庫(SQLite3機制,以及蘋果公司提供的持久性工具Core Data機制。
經比對研究,確定在地址簿應用程序的基礎上,采用Core Data作為持久存儲機制實現記事本的添加、修改、刪除、查看等基本數據訪問功能模塊。Core Data使用其數據模型編輯器幫助程序完成所有存儲文件的系統管理工作。
Core Data是一種在關系數據庫和面向對象的編程語言中間實現對象關系映射(ORM)的解決工具。Core Data是一款穩定、功能全面的持久性工具,本質上是采用嵌入式關系庫SQLite3作為存儲文件。
在新建應用程序時,需選中”Use Core Data for Storage”的復選框,則在項目 Resource文件中產生了一個新的文件:Core_Data_Persistence.xcdatamodel數據模型編輯器。數據模型編輯器負責管理所有文件的系統管理工作。
5 結語
本文通過地址簿應用程序的開發,探索研究基于iPhone開發應用程序的完整流程,形成了Apple OS平臺下iPhone應用程序開發流程文檔。通過探索和實踐,不僅可以為今后需要在iPhone等移動開發平臺上開發應用程序提供幫助,也為基于iPhone應用程序二次開發建立基礎。在理解和開發地址簿應用程序的前提下,基于iPhone的應用程序開發得到實踐和驗證。
參考文獻
[1] A.Hamou, S.Guy,B.Lewden, A.Bilyea, F. Gwadry-Sridhar, M. Bauer.Data collection with iPhone Web apps efficiently collecting patient data using mobile devices[A]. 2010 IEEE International Conference[C].235-239.
[2] Apple Inc.Core Data Programming Guide[EB/OL]. http://developer.apple.com/ library/ios/#documentation/Cocoa/Conceptual/CoreData/cdProgrammingGuide.html.2010-11-15.
[3] 徐俊.基于iPhone 平臺的電子連環畫交互系統設計與實現[J].包裝工程. 2011(04). 45-48.
[4] Low D, Pittaway A. The 'iPhone' induction - a novel use for the Apple iPhone. Pediatric Anesthesia 2010;18:573-4.