提示:這是一節公共的視頻,也就是說,只要是iOS項目,創建方法都不多,所以我們就不給每個iOS課程都錄製一個創建項目的視頻了,因爲這樣,還不如將一節創建項目的視頻做好。
這一節是講解使用新版Xcode(現在是以12.3做演示,如果後面版本之間有太大差距,或重新錄製這一節)創建項目,完整視頻課程是基於10.3版本,推薦大家用這個版本學習,當然如果大家用最新Xcode學習,也就是沒有多大影響的,因爲我們會在有差異的位置增加新版Xcode講解。
現在我們就可以創建項目,首先打開Xcode,啓動後界面如下圖:
點擊“Create a new Xcode project”就可以創建一個項目,至於是什麼項目,在下一步選擇。然後後來到如下界面:
該界面然我們選擇創建的項目運行在什麼平臺,由於我們這是iOS課程,所以就選擇iOS;下面是讓我們選擇應用類型;我們選擇App;也就是隻有一個界面的App;點擊Next:
這一步主要是填寫一下信息:
- 填寫產品/項目名稱(Product Name):可以有中文,但不建議使用中文。
- 開發者團隊(Team):如果沒有請參考前面的課程,登錄一個iCloud賬號就行了,不付費的也可以。
- 組織標識符(Organization Identifier):一般填寫爲域名倒寫。
- 項目標識符(Bundle Identifier):用來標識唯一一個項目,默認是組織標識符+產品名稱,創建完成後可以手動修改。
- 界面開發方式(Interface):課程用的Storyboard,所以選擇他;SwiftUI是蘋果推出的類似Google推出Flutter框架,一句話總結就是用代碼寫UI;目前(2021年1月)因爲無法兼容低於iOS 13以下版本,同時還不是很穩定,功能也不是很全,所以目前還無法直接用到企業級項目中。
- 生命週期(Life Cycle):生命週期(例如:應用按home鍵後臺了)的回調形式,對於Storyboard只能選擇UIKit App Delegate;SwiftUI還可以選擇SwiftUI APP這種形式。
- 開發語言(Language):選擇Swift。
然後點擊下一步,現在這個界面是,讓我們選擇項目保存到哪裏:
點擊創建後,就會來到Xcode主界面,我們在《快速入門iOS開發》課程中講解了,如果大家還不熟悉,可以去學習下。
到這裏我們就完成了項目的創建。
爲什麼要講解區別?
直接學新版不行嗎?
是可以直接學習新版項目結構,不用管舊版結構;但還是建議學習下舊版項目結構,第一個原因是,我們這一版課程是舊版(Xcode 10.3)項目結構;最重要的是第二個原因,進入公司後大部分情況都可能維護老項目,而老項目大部分都是舊版結構,因爲目前新版這種結構不能兼容低於iOS 13以下版本,而企業級項目,例如:目前的微信,QQ,抖音,大部分都是兼容到iOS 10,11,甚至有些兼容到9,所以需要學習新版項目結構和舊版項目結構區別,並且還要學習如何把新版項目結構更改爲舊版結構,好兼容低版本。
項目結構區別
可以用我們提供的code/video/TestScreenAdapter項目對於前面創建的新項目,主要有以下區別,可以通過Beyond Compare工具直接比較文件夾:
AppDelegate:
- 新版註解變爲@main,原來是@UIApplicationMain。
- 新版沒有window屬性,拿到了SceneDelegate文件;舊版有該屬性
- 新版增加了UISceneSession生命週期方法,目前有如下兩個:
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration{
//在創建新的場景會話時調用。
//使用此方法可以選擇要創建新場景的配置。
}
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>){
//當用戶放棄場景會話時調用。
//如果在應用程序未運行時丟棄了任何會話,則將在ap後不久調用該會話複製:沒有完成啓動選項。
//由於這些特定的場景將不會被釋放,所以它們將不會使用這個方法來釋放特定的資源。
}
舊版沒有上面這兩個方法,但有App生命週期方法:
func applicationWillResignActive(_ application: UIApplication) {
//當應用程序即將從活動狀態移到非活動狀態時發送。這可能發生在某些類型的臨時中斷(例如來電或短消息)或當用戶退出應用程序並開始轉換到後臺狀態時。
//使用此方法可以暫停正在進行的任務,禁用計時器,並使圖形呈現回調無效。遊戲應該用這種方法暫停遊戲。
}
func applicationDidEnterBackground(_ application: UIApplication) {
//應用程序進入後臺後執行
//使用此方法可以釋放共享資源、保存用戶數據、使計時器無效,並存儲足夠的應用程序狀態信息,以便在以後終止應用程序時將其恢復到當前狀態。
//如果應用程序支持後臺執行,則在用戶退出時調用此方法,而不是applicationWillTerminate。
}
...
SceneDelegate:
- 新版增加的文件,主要是把舊版項目App全局生命週期(例如:applicationDidEnterBackground)這樣方法拿到該文件;舊版沒有該文件。
Info.plist
- 新版主要是增加如下內容:
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
</dict>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
主要是配置,應用是否支持多Scene,以及SceneDelegate文件位置。
爲什麼新版項目結構要變?
主要是支持分屏,iOS無法分屏,目前只有iPad支持,同時目前該功能也無法兼容低版本,而我們這裏又是項目課程,所以就不在講解他了。
如何使用新版結構學習課程?
從上面可以看到,最大的區別就是多了一個SceneDelegate文件,原來在AppDelegate中用到window屬性的代碼,移動到SceneDelegate就行了;例如:課程中條到界面的方法setRootViewController,toHome等,視頻中是寫到AppDelegate中的,如果直接用新版項目結構學習,要寫到SceneDelegate中,跳轉界面的時候,獲取到SceneDelegate調用方法;可以查看video/TestUseSceneDelegate項目的寫法。
新版項目結構如何兼容低於iOS 13版本
目前只能刪除相關文件,也就是不使用SceneDelegate;方法如下:
- 在AppDelegate中Scene生命週期方法刪除,並把window屬性從SceneDelegate拷貝過來。
- 將SceneDelegate文件刪除。
- 在info.plist文件中,將Application Scene Manifest
然後重新編譯項目就行了;跳轉界面就是獲取到AppDelegate跳轉;可以查看video/TestRemoveSceneDelegate項目的寫法。