關于iOS應用程序架構
應用程序需要與iOS一起工作,以確保他們提供出色的用戶體驗。 除了為您的應用程序的設計和用戶界面設計一個很好的設計,一個偉大的用戶體驗包含許多其他因素。 用戶期望iOS應用程序能夠快速響應,同時期待應用程序盡可能少地使用電能。應用程序針對當前設備但是需要支持所有最新的iOS設備 。開始執行這些行為似乎有點困難,但是iOS能提供幫助。
該文檔突出顯示了使您的應用程序在iOS上正常運行的核心行為。 您可能不會實現本文檔中描述的每個功能,但您應該為您創建的每個項目考慮這些功能。
注意:開發iOS應用程序需要安裝了iOS SDK的基于Intel的Macintosh計算機。 有關如何獲取iOS SDK的信息,請轉到iOS Dev Center。
簡述
當您準備好將您的想法轉化為應用程序時,您需要了解系統和應用之間發生的互動。
應用程序期望支持的主要功能
該系統期望每個應用程序都具有一些特定的資源和配置數據,例如應用程序圖標和有關應用程序功能的信息。 Xcode為每個新項目提供一些信息,但必須提供資源文件,并且在提交應用程序之前必須確保項目中的信息正確無誤。
相關章節:預期應用行為 Expected App Behaviors
應用程序遵循良好的執行路徑
從用戶啟動應用程序到它退出的時候,應用程序遵循一個定義良好的執行路徑。在應用程序的生命周期中,它可以在前臺和后臺執行之間轉換,它可以被終止和重新啟動,并且可以暫時進入睡眠狀態。每次轉換到新的狀態時,應用程序的期望都會改變。前臺應用程序幾乎可以做任何事情,但后臺應用程序必須盡可能少地執行。您可以使用狀態轉換來相應地調整應用的行為。
相關章節:應用程序生命周期,處理應用程序狀態轉換的策略 The App Life Cycle,Strategies for Handling App State Transitions
應用程序必須在多任務環境中高效運行
電池壽命對于用戶來說非常重要,性能,響應能力和良好的用戶體驗也是如此。盡量減少應用程序的電池使用量,確保用戶可以全天候運行應用程序,而無需為設備充電,但啟動和準備快速運行也很重要。 iOS多任務實現提供良好的電池壽命,而不會犧牲用戶期望的響應性和用戶體驗,但運行起來需要應用程序采用系統提供的行為。
相關章節:后臺執行,處理應用程序狀態轉換的策略 Background Execution,Strategies for Handling App State Transitions
應用程序之間的通信遵循具體的途徑
為了安全起見,iOS應用程序在沙盒中運行,并且減少與其他應用程序的交互。當您想與系統中的其他應用程序進行通信時,有具體的相關方法。
相關章節:應用間通信 Inter-App Communication
性能調整對于應用程序來說非常重要
應用程序執行的每個任務都有與之相關聯的電力成本。不會一次充電運行幾天而很快耗盡用戶電池的應用程序會產生消極的用戶體驗,并且更有可能被刪除。所以要注意不同操作的成本,并利用系統提供的省電措施。
相關章節:性能提示 Performance Tips
如何使用本文檔
本文檔不適合新手。對于準備好將其應用程序發布到App Store之前的開發人員。使用此文檔作為指導,以了解應用程序如何與系統進行交互,以及必須做什么才能使這些交互順利進行。
先決條件
本文檔提供有關iOS應用程序架構的詳細信息,并向您展示如何實現許多應用級功能。本書假設您已經安裝了iOS SDK,配置了開發環境,并了解了在Xcode中創建和實現應用程序的基礎知識。
如果您是iOS應用程序開發的新手,請閱讀開始開發iOS Apps(Swift)Start Developing iOS Apps (Swift)。該文檔為開發過程提供了一步一步的介紹,以幫助您快速上手。它還包括一個動手教程,從開始到結束,引導您完成應用創建過程,向您展示如何創建一個簡單的應用程序并快速運行。
也可以看看
如果您正在學習iOS,請閱讀iOS技術概述iOS Technology Overview,您可以將其納入iOS應用程序技術。
預期的應用行為
每個新的Xcode項目配置為立即在iOS模擬器或相應設備上運行。但只需能夠在設備上運行并不意味著您的應用程序已準備好在App Store上發布。每個應用程序都需要定制化,以確保用戶有良好的體驗。可以為您的應用程序提供自定義的圖標,用更好的想法來制定有關應用程序使用界面。本章介紹了您應該在早期規劃的過程中考慮所有應用程序預期行為。
提供所需資源
您創建的每個應用都必須具有以下資源和元數據集,才能在iOS設備上正確顯示:
信息屬性列表文件。
?Info.plist文件包含您的應用程序的元數據,系統用于與您的應用程序交互。 Xcode將根據項目的配置和設置自動創建此文件。如果要直接查看或修改此文件的內容,可以從項目的信息選項卡中進行修改。有關編輯此文件的信息以及有關應包含哪些鍵的建議,請參閱信息屬性列表文件。The Information Property List File.
應用程序所需功能的聲明。
每個應用程序必須聲明運行所需的硬件功能或特性。 App Store使用此信息來確定用戶是否可以在特定設備上運行您的應用。您可以使用項目的“信息”選項卡中的“必需設備”功能條目來編輯應用程序的要求列表。有關如何配置此密鑰的信息,請參閱聲明所需的設備功能。Declaring the Required Device Capabilities
一個或多個圖標。
系統在用戶設備的主屏幕上顯示您的應用程序圖標。系統還可以在“設置”應用程序中使用其他版本的圖標,或者在顯示搜索結果時使用。有關如何指定應用程序圖標的信息,請參閱應用程序圖標。App Icons
一個或多個啟動圖像。
啟動應用程序后,系統會顯示一個臨時圖片,直到應用程序能夠顯示其用戶界面。這個臨時圖片是您應用程序的啟動圖片,它向用戶提供應用程序啟動的即時反饋,并很快消失。您必須為應用程序提供至少一個啟動圖片,您可以提供其他啟動圖片以解決具體情況。有關創建啟動圖片的信息,請參閱應用啟動(默認)圖片。App Launch (Default) Images
這些資源是所有應用程序所必需的,但不是您應該包含的唯一資源。默認情況下,Xcode不包含在應用的Info.plist文件中的許多鍵。只有將特定功能合并到應用程序中,一些附加鍵才顯得重要。例如,使用麥克風的應用程序應包含NSMicrophoneUsageDescription鍵,并向用戶提供有關應用程序如何使用它的信息。
應用程序包
當您構建您的iOS應用程序時,Xcode將其作為捆綁包進行打包。bundle 是文件系統中的一個目錄,將相關資源組合在一起。 iOS應用程序包包含應用程序可執行文件和支持的資源文件,如應用程序圖標,圖像文件和本地化內容。表1-1列出了典型的iOS應用程序包的內容,為了演示的目的,該應用程序捆綁包稱為MyApp。此示例僅用于說明目的。本表中列出的某些文件可能不會出現在您自己的應用程序包中。
表1-1典型的應用程序包
?應用程序可執行文件 App executable
MyApp
可執行文件包含應用程序的編譯代碼。應用程序的可執行文件的名稱與您的應用程序名稱相同。減去.app擴展名。
此文件是必需的。
信息屬性列表文件
Info.plist
Info.plist文件包含應用程序的配置數據。系統使用這些數據來確定如何與應用程序交互。
此文件是必需的,必須稱為Info.plist。有關詳細信息,請參閱信息屬性列表文件。
應用程式圖示
icon.png
Icon@2x.png
ICON-Small.png
Icon-Small@2x.png
您的應用圖標用于在設備的主屏幕上表示您的應用。系統在適當的地方使用其他圖標。文件名中帶有@ 2x的圖標適用于帶有Retina顯示器的設備。
需要應用圖標。有關指定圖標圖像文件的信息,請參閱應用程序圖標。
啟動圖像
Default.png
Default Portrait.png?
Default Landscape.png?
系統在您的應用程序啟動時將此文件用作臨時背景。只要您的應用程序準備好顯示其用戶界面,它就會被刪除。
至少需要一個啟動映像。有關指定啟動映像的信息,請參閱應用啟動(默認)圖片。App Launch (Default) Images.
故事板文件(或nib文件)
MainBoard.storyboard
故事板包含應用程序在屏幕上顯示的視圖和視圖控制器。故事板中的視圖根據呈現它們的視圖控制器進行組織。故事板還會識別將用戶從一組視圖轉移到另一組視圖的轉換(稱為段 segues )。
當您創建項目時,主要故事板文件的名稱由Xcode設置。您可以通過為Info.plist文件中的UIMainStoryboardFile鍵分配不同的值來更改名稱。)使用nib文件而不是故事板的應用程序可以使用NSMainNibFile鍵替換UIMainStoryboardFile鍵,并使用該鍵指定其主要nib文件。
故事板(或nib文件)的使用是可選的,但推薦使用。
臨時分發圖標
iTunesArtwork
如果您正在分發您的應用程序,請添加512 x 512像素版本的應用程序圖標。該圖標通常由App Store從您提交給iTunes Connect的資料提供。但是,由于分發的應用程序不會通過App Store,您的圖標必須存在于應用程序包中。 iTunes使用此圖標表示您的應用程序。 (如果您以這種方式分發您的應用程序,則您指定的文件應與App Store中提交的文件相同)。
該圖標的文件名必須是iTunesArtwork,不得包含文件擴展名。此文件是臨時分發所必需的,否則為其他選項。
設置包
Settings.bundle
如果要通過“設置”應用程序公開自定義應用程序首選項,則必須包含設置包。此軟件包包含屬性列表數據和定義應用程序首選項的其他資源文件。 “設置”應用程序使用此包中的信息來組合應用程序所需的界面元素。
此捆綁是可選的。有關首選項和指定設置包的詳細信息,請參閱首選項和設置編程指南。Preferences and Settings Programming Guide.
非本地化資源文件
sun.png
mydata.plist
非本地化資源包括您的應用使用的圖像,聲音文件,電影和自定義數據文件。所有這些文件應該放置在應用程序包的頂層。
本地化資源的子目錄
en.lproj
fr.lproj
es.lproj
必須將本地化資源放置在特定于語言的項目目錄中,其名稱由ISO 639-1語言縮寫加上.lproj后綴組成。 (例如,en.lproj,fr.lproj和es.lproj目錄包含本地化為英文,法文和西班牙文的資源。)
iOS應用應該是國際化的,并且為它支持的每種語言都有一個language.lproj目錄。除了提供應用程序自定義資源的本地化版本之外,還可以通過在特定于語言的項目目錄中放置具有相同名稱的文件來本地化應用程序圖標,啟動映像和設置圖標。
有關更多信息,請參閱國際化您的應用程序。Internationalizing Your App.
注意:iOS應用程序包不能包含名為“資源”的自定義目錄。
有關iOS應用程序包結構的更多信息,請參閱“捆綁編程指南”Bundle Programming Guide。有關如何從包中加載資源文件的信息,請參閱資源編程指南。Resource Programming Guide
信息屬性列表文件
Xcode使用您項目的“常規”General ,“功能”Capabilities 和“信息”Info 選項卡中的信息,以在編譯時生成應用程序的信息屬性列表(Info.plist)文件。 Info.plist文件是一個結構化文件,其中包含有關應用程序配置的重要信息。它由App Store和iOS用于確定您的應用程序的功能并查找關鍵資源。每個應用都必須包含此文件。
雖然Xcode提供的Info.plist文件包含所有必需條目的默認值,但大多數應用程序需要進行一些更改或添加。只要有可能就使用“常規”和“功能”選項卡來指定應用程序的配置信息。這些選項卡包含可用于應用程序的最常見的配置選項。如果在這些選項卡中沒有看到特定選項,請使用“信息”選項卡。
對于Xcode不提供自定義配置界面的選項,您必須使用Xcode屬性列表編輯器直接提供適當的鍵和值。 “信息”選項卡的“自定義iOS目標屬性”部分包含要包含在Info.plist文件中的條目的摘要。默認情況下,Xcode顯示預期功能的可讀描述,但每個功能實際上對應于Info.plist文件中的唯一鍵。大多數鍵是可選的,很少使用,但在定義任何新項目時,您應該考慮幾個鍵:
在“信息”選項卡中聲明應用程序所需的功能。所需的設備功能部分包含有關您的應用程序運行所需的設備級功能的信息。 App Store使用此條目中的信息來確定應用程序的功能,并防止將其安裝在不支持應用程序功能的設備上。有關詳細信息,請參閱聲明所需的設備功能。Declaring the Required Device Capabilities
需要持續Wi-Fi連接的應用程序必須事先聲明。如果您的應用程序與網絡上的服務器通信,則可以將應用程序使用Wi-Fi條目添加到項目的“信息”選項卡。此條目對應于Info.plist文件中的UIRequiresPersistentWiFi鍵。將此鍵設置為YES將阻止iOS在長時間不活動時關閉活動的Wi-Fi連接。對于使用網絡與服務器進行通信的所有應用程序,建議使用此密鑰。
報亭應用程序必須聲明自己。包括UINewsstandApp密鑰,以表明您的應用程序提供了報亭應用程序的內容。
定義自定義文檔類型的應用程序必須聲明這些類型。使用“信息”選項卡的“文檔類型”部分為您支持的文檔格式指定圖標和UTI信息。系統使用此信息來識別能夠處理特定文件類型的應用程序。有關向您的應用程序添加文檔支持的更多信息,請參閱基于文檔的iOS應用程序編程指南。Document-Based App Programming Guide for iOS.
應用程序可以聲明他們支持的任何自定義URL方案。使用“信息”選項卡的“URL類型”部分來指定應用程序處理的自定義URL方案。應用程序可以使用自定義URL方案進行通信。有關如何實現對此功能的支持的更多信息,請參閱使用URL方案與Apps進行通信。Using URL Schemes to Communicate with Apps
應用程序必須提供用于訪問用戶數據和某些應用程序功能的目的字符串(有時稱為“使用說明”)。當有關于訪問用戶數據或設備功能的應用程序存在隱私權時,iOS會提示用戶并代表您的應用程序請求許可。應用程序必須通過在其Info.plist文件中定義的目的字符串向用戶解釋為什么需要訪問。如果您的應用嘗試在沒有提供相應的目的字符串的情況下訪問,則您的應用程序將退出。
需要用戶許可的數據和功能如表1-2所示。Purpose strings are described in theCocoa Keyschapter ofInformation Property List Key Reference.
有關可以包含在Info.plist文件中的鍵和值的詳細信息,請參閱信息屬性列表鍵參考。Information Property List Key Reference
聲明所需的設備功能
所有應用程序必須聲明其運行所需設備的特定功能。 Xcode包括項目信息選項卡中的必需設備功能條目,并填寫一些最低要求。您可以向此條目添加值以指定應用程序的其他要求。所需的設備功能條目對應于應用的Info.plist文件中的UIRequiredDeviceCapabilities密鑰。
UIRequiredDeviceCapabilities鍵的值是數組或字典,其中包含標識應用程序需要的功能的其他鍵(或明確禁止)。如果使用數組指定鍵的值,則鍵的存在表示該功能是必需的;沒有鍵表示該功能不是必需的,并且應用程序可以在沒有它的情況下運行。如果您指定字典,字典中的每個鍵都必須有一個布爾值,表示該功能是必需還是被禁止。值為true表示功能是必需的,值為false表示該功能不能在設備上顯示。如果給定的功能是您的應用程序可選的,請勿在字典中包含相應的鍵。
有關可以為UIRequiredDeviceCapabilities鍵包含的值的詳細信息,請參閱信息屬性列表鍵參考。Information Property List Key Reference
應用圖標
每個應用程序必須提供一個圖標顯示在設備的主屏幕和App Store中。一個應用程序實際上可以指定幾個不同的圖標,以便在不同的情況下使例如,當顯示搜索結果時,應用程序可以提供一個小圖標,并且可以為Retina顯示器的設備提供高分辨率圖標。
新的Xcode項目包括應用程序圖標圖像的圖像資源條目。要添加圖標,請將相應的圖像文件分配給項目的圖像資源。在構建時,Xcode會將相應的密鑰添加到應用的Info.plist文件中,并將圖像放置在應用程序包中。
有關設計應用圖標(包括這些圖標的大小)的信息,請參閱iOS人機界面指南。iOS Human Interface Guidelines
應用啟動(默認)圖像
當系統首次在設備上啟動應用程序時,它會在屏幕上臨時顯示靜態啟動映像。這個圖像是您應用程序的啟動映像,它是您在Xcode項目中指定的資源。啟動圖像為用戶提供應用程序啟動的即時反饋,同時讓應用程序準備初始用戶界面。當您的應用程序的窗口已配置并準備好顯示時,系統會切換該窗口的啟動圖片。
當您的應用程序的用戶界面的最新快照可用時,系統會更喜歡使用該映像作為應用程序的啟動映像。當您的應用程序從前臺轉換到后臺時,系統會收到應用程序用戶界面的快照。當您的應用程序返回到前臺時,盡可能使用該映像而不是啟動映像。如果用戶已經殺死了您的應用程序,或者您的應用程序未運行很長時間,則系統將放棄快照,并再次依賴于啟動映像。
新的Xcode項目包括您的應用程序啟動圖像的圖像資源條目。要添加啟動圖片,請將相應的圖片文件添加到項目的圖片資產(image assets)。在構建時,Xcode會將相應的密鑰添加到應用的Info.plist文件中,并將圖像放置在應用程序包中。
有關設計應用程序啟動映像(包括這些映像的大小)的信息,請參閱“iOS人機界面指南”。iOS Human Interface Guidelines
支持用戶隱私
設計用戶隱私很重要。大多數iOS設備都包含用戶可能不想暴露給應用或外部實體的個人數據。如果您的應用訪問或不正確地使用數據,則用戶可能會通過刪除您的應用。
只有在根據適用法律獲得的用戶知情同意的情況下才能訪問用戶或設備數據。此外,采取適當步驟保護用戶和設備數據,并對您如何使用它們進行透明化。以下是您可以采取的一些最佳做法:
審查政府或行業來源的指導方針,包括以下文件:
聯邦貿易委員會關于移動隱私的報告:移動隱私披露:通過透明度建立信任。
歐盟數據保護委員對移動應用數據保護的意見:http://ec.europa.eu/justice/data-protection/article-29/documentation/opinion-recommendation/files/2013/wp202_en.pdf
日本內政部智能手機隱私舉措:
智能手機隱私計劃(2012):
英文:http://www.soumu.go.jp/main_sosiki/joho_tsusin/eng/presentation/pdf/Initiative.pdf
日語:http://www.soumu.go.jp/main_content/000171225.pdf
智能手機隱私計劃II(2013):
英文:http://www.soumu.go.jp/main_sosiki/joho_tsusin/eng/presentation/pdf/Summary_II.pdf
日語:http://www.soumu.go.jp/main_content/000247654.pdf
加利福尼亞州總檢察長關于移動隱私的建議:隱私權:移動生態系統的建議
這些報告為保護用戶隱私提供了有用的建議。您還應該與公司的法律顧問一起審查這些文件。
在您的應用程序需要數據時,請求訪問受iOS系統授權設置保護的敏感用戶或設備數據。您必須在應用程序的Info.plist文件中提供用途字符串(有時稱為使用說明字符串),以解釋您的應用程序需要您嘗試訪問的數據或資源的原因。由iOS系統授權設置保護的數據包括位置,聯系人,日歷活動,提醒,照片,媒體和許多其他類型;參見表1-2。在用戶未授權訪問所請求的數據的情況下提供合理的回退行為。
與用戶透明地了解他們的數據將如何使用。例如,當您將應用程序提交到App Store時,請將您的隱私政策或聲明的URL指定為iTunes Connect元數據的一部分。您可能還想在您的應用說明中總結該政策或聲明。
有關在iTunes Connect中提供應用隱私政策的更多信息,請參閱在iTunes Connect中添加應用程序。
給用戶控制其用戶或設備數據。提供設置,以便用戶可以根據需要禁用對某些類型的敏感信息的訪問。
請求并使用完成給定任務所需的最少量的用戶或設備數據。不要因為不明顯的原因尋求訪問或收集數據,因為不必要的原因,或者您認為以后可能會有用。
采取合理的步驟來保護您在應用程序中收集的用戶和設備數據。在本地存儲此類信息時,請嘗試使用iOS數據保護功能(使用“使用磁盤加密保護數據”中的描述)將其存儲為加密格式。通過網絡發送用戶或設備數據時,使用應用傳輸安全性(如NSAppTransportSecurity所述)。
如果您的應用程序使用ASIdentifierManager類,則必須遵守其advertisingTrackingEnabled屬性的值。如果用戶將該屬性設置為否,則僅對有限廣告目的使用ASIdentifierManager類。 “有限廣告用途”是指頻次上限,歸因,轉換事件,估計唯一用戶數量,廣告欺詐檢測,僅用于廣告目的的調試,以及Apple可能允許的廣告支持API在文檔中可能允許的其他用途。
如果還沒有這樣做,請停止使用由UIDevice類的uniqueIdentifier屬性提供的唯一設備標識符(UDID)。該屬性在iOS 5.0中已被棄用,App Store不接受使用該標識符的新應用或應用更新。相反,應用程序應該根據需要使用UIDevice類的identifierForVendor屬性或ASIdentifierManager類的advertisingIdentifier屬性。
如果您的應用程序支持音頻輸入,請將音頻會話配置為僅在實際計劃開始錄制時進行錄制。如果您不打算馬上錄制,請勿在啟動時配置您的音頻會話進行錄制。當應用程序配置他們的音頻會話進行錄制時,該系統會提醒用戶,并為用戶提供禁用應用程序錄制的選項。
表1-2列出了iOS支持的資源和數據授權類型。對于每個項目,表格顯示用途字符串密鑰和用于檢查授權狀態的API。
重要提示:當您的應用程序嘗試使用受保護的項目時,系統會提示用戶提示要求訪問的權限。從iOS 10開始,Info.plist文件必須包含用于顯示在權限警報中的每個這樣的項目的用途字符串。如果您的應用程序嘗試訪問受保護的項目,而您沒有提供相應的目的字符串,則應用程序將退出。 (此行為同樣適用于iMessage應用程序,在應用程序訪問設備的相機或麥克風之前必須包含表1-2中列出的相關鍵。)
對于一些受保護的數據和資源,iOS框架提供專門的API來檢查和請求授權,如表1-2所示。
由于用戶可以隨時使用“設置”來更改授權,請在訪問任何這些項目之前檢查授權狀態。 (某些功能,特別是運動和HomeKit,不提供用于檢查系統授權狀態的專用API,具體請參見表1-2)
表1-2受系統授權設置保護的數據和資源
查看表1-2作為應用程序隱私行為的起點,而不是一個全面的清單。此表的內容隨iOS更新而變化。
國際化您的應用程序
由于iOS應用程序分布在許多國家/地區,因此本地化應用的內容可以幫助您吸引更多客戶。當用戶本地化為母語時,用戶更有可能使用該應用。當您將面向用戶的內容視為資源文件時,本地化該內容是一個相對簡單的過程。
在您可以本地化您的內容之前,您必須將您的應用程序國際化,以方便本地化過程。將您的應用程序國際化包括將任何面向用戶的內容分解為可本地化的資源文件,并提供用于存儲該內容的特定于語言的項目(.lproj)目錄。它還意味著在使用特定于語言的區域設置內容時使用適當的技術(如日期和數字格式化程序)。
對于完全國際化的應用程序,本地化過程將創建新的特定于語言的資源文件,以供您添加到項目中。典型的iOS應用程序需要以下類型資源文件的本地化版本:
故事板文件(或nib文件) - 工作臺可以包含需要本地化的文本標簽和其他內容。您可能還需要調整界面項的位置以適應文本長度的更改。 (類似地,nib文件可以包含需要本地化的文本或需要更新的布局。)
字符串文件 - 字符串文件(由于它們的.strings文件擴展名而被命名)包含應用程序顯示的靜態文本的本地化版本。
圖像文件 - 您應避免本地化圖像,除非圖像包含文化特定的內容。盡可能避免將文本直接存儲在圖像文件中。對于您在應用程序中加載和使用的圖像,將文本存儲在字符串文件中,并在運行時將該文本與基于圖像的內容合并。
視頻和音頻文件 - 您應該避免本地化多媒體文件,除非它們包含語言特定或特定于文化的內容。例如,您將需要本地化包含語音跟蹤軌道的視頻文件。
有關國際化和本地化流程的信息,請參閱國際化和本地化指南。Internationalization and Localization Guide 有關在應用程序中使用資源文件的正確方法的信息,請參閱資源編程指南。 Resource Programming Guide