2015年1月26日 星期一

iOS App應用程式生命週期(上)

App的組成可視為撰寫程式碼(Custom Code)系統架構(System Frameworks)的互動,系統架構提供基本的運作模式,我們撰寫程式碼(Custom Code)讓App依照我們想要的方式去運作。若要寫好一個App,我們就要深入瞭解系統架構(System Frameworks)。

Main Function

每個C應用程式都會一個main function的進入點,iOS app也是一樣;不一樣的是iOS app的main function不用自行撰寫。XCode會在建立專案時自動產生main function,下面是main function示意程式碼。

import UIKit
func  main(argc:Int, argv:[String]) -> String
{
     return UIApplicationMain(argc, argv, nil, NSStringFromClass(new AppDelegate()));
}
main function主要會呼叫UIApplicationMain函式,UIApplicationMain函式主要會建立App的核心物件、從storyboard載入使用者介面、呼叫自行撰寫的程式碼,有機會做初始化及捕捉使用者的動作。開發者主要提供的是storyboard檔案及初始化程式碼。

App的結構

應用程式啟動時UIApplicationMain函式會建立關鍵物件並讓App執行;對每個iOS App最關鍵的物件是UIApplication,它主要的工作是協調系統與App中的物件之間的互動。下圖顯示每個App會出現的關鍵物件,以及它們之間的互動,而下表列出了每個物件的主要角色。
首先需要注意的是是iOS Apps使用Model-View-Controller架構;這個模式將應用程式資料及商業邏輯從使用者介面中分離;這樣設計很重要的好處是可讓Apps能在不同機裝置及不同螢幕畫面上執行。


物件
描述
UIApplication物件管理事件迴圈及其它高階應用程式行為,它也會反應用程式關鍵的轉換及特殊事件(例如push notifications)給在應用程式中自訂的物件來處理。每個iOS App只會有一個UIApplication物件。
App delegate物件
UIApplication物件是掌握iOS App的核心物件,而App delegate則是撰寫自訂程式碼的核心物件,App delegate與UIApplication物件一同合作,處理應用程式啟始、應用程式狀態轉換及其它App事件。App delegate一定會在每個App中出現,所以常用它來初始化App需要的資料結構。
Documents and data model objects
資料模型物件(Data model objects)用來儲存App專屬資料,舉例來說銀行App會儲存財務交易記錄、繪畫App會儲存使用者筆畫及順序資料。App可以使用document objects來管理資料模型物件,這是提供個方便的方法來管理,但並不是必要性的,開發者也可用自己的方式來管理。詳細可以參考Document-Based App Programming Guide for iOS
View controller objects
View controller 物件管理螢幕上呈現的App內容,一個View Controller管理單一View及它的子集合。實際呈現內容時View Controller會讓View狀態成為可見的,在App的視窗呈現。

UIViewController類別是所有View Controller物件的基礎類別,它提供了基本的功能包括載入Views、顯示它們,根據裝置旋轉而旋轉螢幕畫面,以及其他標準系統行為。

UIKit及其他Framework會定義其他的View Controller類別去實作其他的介面包括Image Picker、Tab Bar Interface及Navigation Interface。
若需要更多的資訊如何使用View Controllers,可參考 View Controller Programming Guide for iOS
UIWindowobject
UIWindow件用來代表視窗,協調一到多個View在主畫面中呈現,大部份的Apps只會有一個視窗。要改變App的內容,使用View Controller來改變顯示的View,並在對應的Windows上呈現;我們不會改變Windows本身。

除了代管Views外,UIWindow也與UIApplication合作將事件傳遞給Views及View controlls。
View objects,control objects, and layer objects
Views及Controls是實際顯示App內容的元素,Views物件用來在特定區域內顯示繪畫內容,並且會對於該區內的事件反應;Controls則是對於特定的使用者動作進行回應,像是Buttons、Text Fields…等。

UIKit Framework提供了許多標準的Views用來顯示內容,您也可以定義繼承自UIView用來定義自己的Views。

2015年1月19日 星期一

iOS App組成元素

本文分享iOS App在開發時期所組成的專案元素,當開發一個App時要逐步考慮到這些項目,例如是否同時在iPad/iPhone上執行、App有哪些讓使用者自行設定的選項、要開發哪些國家的版本…等。

The App Bundle

當用XCode建立專案時,XCode會幫我們產生專案需要的檔案,這些檔案的組合稱之為App Bundle,App Bundle包含了App執行檔案,及專案所需相關資源,包括了App Icons、影像檔及地區化內容…等,以下分別做介紹。

App Bundle.png

App executable

App executable是編譯過後的執行檔,執行檔名稱與XCode專案名稱通常是一樣的。

Information Property List File

用XCode建立專案時會自動建立info.plist檔案,裡面描述了對於App的metadata資訊,原始是XML檔案。info.plist檔案除了可在Supporting Files檔案夾看到外,還可在專案的Info頁面進行修改。對於info.list的詳細說明參考Information Property List Key Reference

每個App需要描述在什麼樣的硬體環境及條件下才可執行;App Store會根據此資訊來決定是否在使用者的裝置顯示此App。可以在info.list設定此資訊,詳細可參考UIRequiredDeviceCapabilities

InfoPropertyList.png

App Icons

App Icons用在顯示Home畫面的圖示,好的App Icon可以快速的吸引使用者;有分大圖及小圖,小圖是2x,大圖是3x

AppIcon.png

Launch Images

Launch Images有三種規格「Default.png、Default-Portrait.png、Default-Landscape.png」;當應用程式啟動,但沒有完全載入使用者介面時,會顯示暫時的畫面即是Launch image,App最少需提供一個Launch image。

LaunchImage.png

Storyboard files

Storyboards包含了Views及View Controllers;Views是顯示畫面,而View Controlls則控制了View上的資料如何顯示、與使用者的互動。Storyboards也確認了View之間如何進行轉換。

建立專案時,會自動建立main.storybaord,此為預設的storyboard,若要修改,除了改檔名外,也需在info.plist檔案中指定UIMainStoryboardFile鍵值,將修改後的檔名設為預設的storyboard。
StoryBoard.png

Nonlocalized resources

Nonlocalized resources包含了要在應用程式中使用的影片、聲音、電影及自訂資料;這些資料放在應用程式的最上層目錄。

Settings bundle

若要開放App有使用者偏好設定,那就要包含Settings Bundle;Settings Bundle包含了屬性列表及資源檔案用來定義App使用者偏好。詳細參考Preferences and Settings Programming Guide
Settings.png

Subdirectories for localized resources

地區化資源必須要放在語言專屬的目錄下,其中目錄名稱必須要符合ISO 639-1語言簡稱規範,後面加上.lproj副檔名,舉例而言en.lproj是英文(English)地區化目錄、fr.lproj是法文(French)地區化目錄、es.lproj則是西班牙文地區化目錄。

在地區化目錄可以放地區化App Icon Launch Images…等,更多資訊可以參考Internationalization and Localization Guide

App Structure.png