提示:这是一节公共的视频,也就是说,只要是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项目的写法。