新版Xcode項目和舊版區別

提示:這是一節公共的視頻,也就是說,只要是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項目的寫法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章