{"id":13742921,"url":"https://github.com/XuYang8026/UniversalProject","last_synced_at":"2025-05-09T00:32:33.520Z","repository":{"id":41086501,"uuid":"92361502","full_name":"XuYang8026/UniversalProject","owner":"XuYang8026","description":"基于MVC架构的iOS轻量级框架，封装了基类、基于猿题库YTKNetwork的网络服务、工具库，NavigationController转场动画/瀑布流/粒子动画/小demo，已适配iOS11 \u0026 iPhone X。欢迎Star🌟 ","archived":false,"fork":false,"pushed_at":"2018-03-07T12:16:51.000Z","size":87992,"stargazers_count":2020,"open_issues_count":5,"forks_count":503,"subscribers_count":69,"default_branch":"master","last_synced_at":"2025-04-08T09:05:22.134Z","etag":null,"topics":["app","ios","ios-demo","ios-framework","ios-transition","yykit"],"latest_commit_sha":null,"homepage":"","language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/XuYang8026.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-05-25T03:36:01.000Z","updated_at":"2025-02-24T21:17:02.000Z","dependencies_parsed_at":"2022-07-21T04:34:44.451Z","dependency_job_id":null,"html_url":"https://github.com/XuYang8026/UniversalProject","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XuYang8026%2FUniversalProject","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XuYang8026%2FUniversalProject/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XuYang8026%2FUniversalProject/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XuYang8026%2FUniversalProject/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/XuYang8026","download_url":"https://codeload.github.com/XuYang8026/UniversalProject/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253171159,"owners_count":21865275,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["app","ios","ios-demo","ios-framework","ios-transition","yykit"],"created_at":"2024-08-03T05:00:37.842Z","updated_at":"2025-05-09T00:32:28.506Z","avatar_url":"https://github.com/XuYang8026.png","language":"Objective-C","readme":"\n## 最近更新\n已对iOS11 \u0026 iPhone X 适配, 适配参考：[10分钟适配 iOS 11 \u0026 iPhone X](http://www.jianshu.com/p/94d3fdc0f20d)\n###### 欢迎各路大神小白加群  iOS 超级码农交流群：538549344\n\n## 源码下载\n建议在此页面直接下载，若网络不佳屡次失败，可尝试通过百度云下载地址下载：[源码下载](https://pan.baidu.com/s/1nv88S0x)\n#\n\n## 简介\n`UniversalProject`是基于MVC架构的iOS轻量级框架，封装了各种基类、基于猿题库YTKNetwork的网络服务、工具库，基于NavigationController的瀑布流/转场动画/粒子动画以及常用功能demo，已适配iOS11 \u0026 iPhone X。欢迎交流 \u0026 Star🌟 \n\n原文传送门 http://www.jianshu.com/p/d553096914ff\n#\n\n## iOS 从0到1搭建高可用App框架\n\n    最近在搭建新项目的iOS框架，一直在思考如何才能搭建出高可用App框架，能否避免后期因为代码质量问题的重构。\n    以前接手过许多“烂代码”，架构松散，底层混乱，缺少规范，导致团队开发时代码风格迥异，\n    清晰的项目结构和良好的代码规范是保证产品质量的关键，\n    下面分享一下我的架构思路。\n\n\n## 效果图：\n\n\u003cdiv align=center\u003e\u003cimg width=\"375\" height=\"667\" src=\"https://github.com/XuYang8026/UniversalProject/blob/master/Gif/demo.gif\"/\u003e\u003c/div\u003e\n\n\n## 架构图：\n\n\u003cdiv align=center\u003e\u003cimg src=\"http://upload-images.jianshu.io/upload_images/743749-077e818f4b5f9f6e.png?imageMogr2/auto-orient/strip\"/\u003e\u003c/div\u003e\n\n架构原则：易读性、易维护性、易扩展性。\n\n## 一、思考\n\n做好一件事，花在思考上的时间应该多于执行。\n\n首先根据产品需求和设计图，脑中先建立一个产品架构：\n\n1. 产品的定位是什么。\n\n社交？媒体？游戏？运动？音视频？电商……要搞清楚你要做一个什么类型的App，不同类型的产品，技术选型也有所不同，在这我是搭建一个基础App架构，可以在此基础上拓展社交、电商、音视频等！\n\n2. 技术选型\n\n根据当前产品的需求以及未来可能有的需求（我怎么知道未来会有什么需求？可以参照竞品，可以发挥想象，如果产品说：“我们要做IM文字聊天，只做文字！不做音视频，以后都不做！” 类似这样的承诺，你如果信了他的邪……后面的故事就精彩了。。哈哈哈哈哈哈。。。。所以说这时候你就要考虑到后面会有语音+视频聊天，在设计的时候不要偷懒，预留一定空间，当某天产品反悔的时候，你可以微微一笑，从容应对。\n\n一把拉回话题，接着说技术选型，通常我会选择一些当下比较热门、好用的第三方框架，例如：YYKit ，YYKit 是一组庞大、功能丰富的 iOS 组件，包含Model解析、图片加载、缓存等基础服务，都是基于Category设计的，使用方便且性能高于一些老的框架，用过的都说好。\n\n其他框架的选择可以根据项目需求，去GitHub上搜索，星星多的每个都看一下，会给你增加一些思路。\n\n程序猿长得可以保守，思想一定不能太保守。\n\n## 二、搭建目录结构\n\n![image](http://upload-images.jianshu.io/upload_images/743749-5eec25e5a69c7138.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n目录图解\n如上图，我是这样搭建App目录结构的，从下到上，使用Pods管理第三方框架，将第三方框架进行二次封装，供给顶层使用，尽可能减少各模块之间的耦合度，只为更清晰。\n\n## 三、封装基础类\n\n![image](http://upload-images.jianshu.io/upload_images/743749-f88f1bf3414b0d65.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n\n1. AppDelegate是应用的代理，应用级的事件都委托它处理，包含启动退出、推送等事件，以及IM、支付等第三方的回调，这使得AppDelegate内代码庞大，错综复杂，十分不利于阅读和维护，因此我新增了一个AppDelegate+AppService类别，用来处理生命周期之外的业务，AppDelegate作为事件入口，具体实现直接调用类别里的方法，只为更清晰。\n\n\n\n![image](http://upload-images.jianshu.io/upload_images/743749-49f4c9f96e3d50fa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n2. Modules包含了应用内的功能模块，根据底部Tab栏划分并关联实体文件夹（默认是虚拟的要手动建立实体文件夹拖进来），每个模块内使用的是MVC模式，有人会问为什么多了Resource和Service文件夹，MVC是一种设计思想，并非死套路就仨文件夹，根据实际需求适当增加，在这我选择在Service封装数据请求，VC里调用拿数据即可，至于Resource为什么在这，我认为当功能模块层级较多时，每个大功能模块都对应许多资源，对应到模块内用起来方便，当然也可以放到最外层的Resource文件夹里，建立对应的模块名称，在这儿我是选择把公共的放到最外层Resource里，功能相关的放到模块里的Resource文件夹内，只为更清晰。\n\n\n\n\n![image](http://upload-images.jianshu.io/upload_images/743749-2480121eaccecc3c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n3. Manager的定义是全局基础服务，通常使用类方法或者单例来实现，主要包含对应用、用户的管理和服务，例如网络状态监听，广告页应用介绍页等；用户快速登录退出操作以及登录状态的获取等。只为更清晰。\n\n\n\n\n![image](http://upload-images.jianshu.io/upload_images/743749-dd03de0737474c9b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n4. Utils文件夹内主要包含全局通用工具，来源于对三方框架的二次封装，或是自己写的工具类。在这个项目里，我封装了带AES加密网络请求工具，全局Toast提示，广告页等。只为更清晰。\n\n\n\n\n\n![image](http://upload-images.jianshu.io/upload_images/743749-116d59c9061d2495.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n5. Base文件夹用来存放项目的基类，基类作用包含一些定制化的内容，例如页面样式，空数据页面等，使用基类来实现，可以统一控制，利于维护，减少冗余，也为更清晰。\n\n\n\n\n\n![image](http://upload-images.jianshu.io/upload_images/743749-e70733d5f2138425.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n6. 第三方文件夹放一些第三方的类库和对第三方封装，比如第三方登录、支付、IM等，现在项目我还没有添加第三方框架。\n\n7.全局宏顾名思义是定义了一些全局通用宏。我这里定义了四个：\n\nUtilsMacros定义的是一些工具宏，比如获取屏幕宽高，系统版本，数据类型验证等；\n\nURLMacros定义服务器接口地址以及环境开关；\n\nFontAndColorMacros定义全局用的色值、字体大小，这里建议跟设计师共同维护一个设计规范，例如：定义一个主色调宏 MainColor，色值是 0x333333，我们全局使用MainColor宏作为背景颜色，当某天App改版，色值改变，我们只需要去更改 0x333333即可，其他代码不需要动，同时也能一定程度约束设计师，不要随便增加一种颜色，非常接近的颜色应当使用一个。如果设计师不愿意维护这个规范，你可以尝试打一架，打不过的话，就只能自己维护了，只为更清晰。\n\nThirdMacros 包含第三方框架相关的定义，例如keySecret等。只为更清晰。\n\n\n\n\n\n![image](http://upload-images.jianshu.io/upload_images/743749-93424ab96e246b60.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n8. 资源文件，上面说到过，这里我是存放了全局的一些资源文件，功能模块的我放到了模块内的Resource文件夹内，个人喜好，只为更清晰。\n\n\n\n![image](http://upload-images.jianshu.io/upload_images/743749-5a0d548626865465.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n9. CocoaPods是iOS项目的依赖管理工具，开发iOS项目不可避免地要使用第三方开源库，CocoaPods的出现使得我们可以节省设置和第三方开源库的时间。\n\n\n\n本文只是阐述本人近期架构的出发点和整体思路，代码的具体实现没有细说，感兴趣的可以下载源码阅读\n\n欢迎各路大神提出更好的架构思想大家一起学习交流\n\n## 下面对你也许有帮助：\n\n[Xcode 9 快速跳转到定义新姿势（Jump to Definition）](http://www.jianshu.com/p/9c81e9de272b)\n\n[适配iOS11 - UITableview UICollectionView MJRefresh下拉刷新错乱](http://www.jianshu.com/p/a6e5cc20a008)\n\n[10分钟适配 iOS 11 \u0026 iPhone X](http://www.jianshu.com/p/94d3fdc0f20d)\n\n[iOS 团队编码规范 —— 团队开发需要共同遵守的代码规范](http://www.jianshu.com/p/1f0618a2ba9b)\n\n[代码注释，教你用快捷键+代码块实现快速注释 —— 让注释不再是负担，快捷键帮你解决](http://www.jianshu.com/p/78b8693d87cd)\n\n[通用工具类宏定义 —— 进一步提升编码效率](http://www.jianshu.com/p/2c55fcfeecb5)\n\n以上属于臭码农原创，若有雷同属巧合，如有错误望指正，转载请标明来源和作者。\n\n简书地址：http://www.jianshu.com/p/d553096914ff\n\nby：臭码农\n","funding_links":[],"categories":["Objective-C  Stars 1000以内排名整理","Objective-C","OOM-Leaks-Crash"],"sub_categories":["Tools"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FXuYang8026%2FUniversalProject","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FXuYang8026%2FUniversalProject","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FXuYang8026%2FUniversalProject/lists"}