新版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项目的写法。

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