新版Xcode项目和旧版区别

提示:这是一节公共的视频,也就是说,只要是iOS项目,创建方法都不多,所以我们就不给每个iOS课程都录制一个创建项目的视频了,因为这样,还不如将一节创建项目的视频做好。

这一节是讲解使用新版Xcode(现在是以12.3做演示,如果后面版本之间有太大差距,或重新录制这一节)创建项目,完整视频课程是基于10.3版本,推荐大家用这个版本学习,当然如果大家用最新Xcode学习,也就是没有多大影响的,因为我们会在有差异的位置增加新版Xcode讲解。

现在我们就可以创建项目,首先打开Xcode,启动后界面如下图:

image

点击“Create a new Xcode project”就可以创建一个项目,至于是什么项目,在下一步选择。然后后来到如下界面:

image

该界面然我们选择创建的项目运行在什么平台,由于我们这是iOS课程,所以就选择iOS;下面是让我们选择应用类型;我们选择App;也就是只有一个界面的App;点击Next:

image

这一步主要是填写一下信息:

  • 填写产品/项目名称(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。

然后点击下一步,现在这个界面是,让我们选择项目保存到哪里:

image

点击创建后,就会来到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项目的写法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容