在iOS应用开发,Xcode项目目录是随意组织的,这样一来,就会导致不同的人就会有不同的组织方式。从这一点来看,Xcode的项目组织形式上个人觉得就没有Android开发(无论是eclipse还是as)项目组织形式好了。

这段时间为了规范自己的编码目录组织形式,参考网上的资料,结合自己的习惯,定下了以下的一个iOS项目目录组织结构。这个结构并不完美,有好的想法和好的思路会继续更新,逐渐完善整个结构。

资源下载:iOS项目框架脚本

一、目录结构
.
| _ Expand (扩展内容)
| _ _ Category (自定义Category)
| _ _ Macros (宏定义)
| _ _ _ _ JHMacros.h (项目宏定义)
| _ _ _ _ JHMacros.h (全局默认宏定义)
| _ _ _ _ JHThirdMacros.h (项目第三方宏定义)
| _ _ Tool (工具类)
| _ Main (主逻辑及界面View)
| _ _ Module1 (模块1)
| _ _ _ _ Controller (控制器)
| _ _ _ _ Model (数据模型)
| _ _ _ _ Other (其他文件)
| _ _ _ _ Protocal (协议)
| _ _ _ _ Service (服务逻辑)
| _ _ _ _ View (自定义View视图)
| _ _ _ _ _ _ Cell (Cell视图)
| _ _ _ _ _ _ SubView (子视图)
| _ _ Module2 (模块2)
| _ _ _ _ Controller
| _ _ _ _ Model
| _ _ _ _ Other
| _ _ _ _ Protocal
| _ _ _ _ Service
| _ _ _ _ View
| _ _ _ _ _ _ Cell
| _ _ _ _ _ _ SubView
| _ _ Public (公共内容)
| _ _ _ _ Controller
| _ _ _ _ Model
| _ _ _ _ Other
| _ _ _ _ Protocal
| _ _ _ _ Service
| _ _ _ _ View
| _ _ _ _ _ _ Cell
| _ _ _ _ _ _ SubView
| _ Resource (资源)
| _ _ Font (字体资源)
| _ _ Image (图片资源)
| _ _ _ _ Module1.xcassets (模块1图片资源)
| _ _ _ _ Module2.xcassets (模块2图片资源)
| _ _ _ _ Public.xcassets (公共资源)
| _ _ Plist (Plist文件)
| _ SDKFile (第三方SDK)
| _ Vendor (开源项目代码)

二、生成脚本说明
本生成脚本共包含2个文件,一个是项目信息配置文件,一个是脚本程序。

1. 项目信息配置文件(JHFrameworkInitialization.plist)
项目信息配置文件为一个plist文件,包含两个key:projectName和Modules,分别指定项目的项目名称及项目的模块数组。项目名称*好是首字母大写并符合驼峰命名法原则,Modules是一个数组,若项目不能明显区分模块,则不需填写。 该文件需和脚本程序文件在同一目录,否则会出现找不到配置文件的错误。

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
<plist version=”1.0″>
<dict>
<key>ProjectName</key>
<string>OMGProject</string>
<key>Modules</key>
<array>
<string>Module1</string>
<string>Module2</string>
</array>
</dict>
</plist>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2. 脚本程序(JHFrameworkInitialization.sh)
其实这个脚本程序是很好理解的,只要有上述的项目目录组织结构,接着就基本使用mkdir命令来生成对应的文件即可。生成完成后需手动把整个结构文件夹添加

#!/bin/sh

echo “”
echo “————————————-”
echo “- 初始化JH iOS框架 -”
echo “————————————-”

echo “”
echo “将在以下目录新建:”
echo $PWD
echo “”

# 通过Plist文件获取当前配置数据
infoPlistFilePath=”JHFrameworkInitialization.plist”
if [[ -f infoPlistFilePath ]]; then
echo “找不到项目信息配置文件(JHFrameworkInitialization.plist)”
return
fi
projectName=$(/usr/libexec/PlistBuddy -c “print ProjectName” ${infoPlistFilePath})
modules=$(/usr/libexec/PlistBuddy -c “print Modules” ${infoPlistFilePath})

# 判断是否存在JH iOS框架文件
JHPath=”JHFramework”
if [ -a “$JHPath” ]; then
rm -rf $JHPath
fi
mkdir $JHPath

# 创建Main文件夹
echo “1.创建Main文件夹…”
mkdir $JHPath”/Main”
mkdir $JHPath”/Main/Public”
mkdir $JHPath”/Main/Public/Controller”
mkdir $JHPath”/Main/Public/View”
mkdir $JHPath”/Main/Public/View/Cell”
mkdir $JHPath”/Main/Public/View/SubView”
mkdir $JHPath”/Main/Public/Model”
mkdir $JHPath”/Main/Public/Other”
mkdir $JHPath”/Main/Public/Protocal”
mkdir $JHPath”/Main/Public/Service”
# mkdir $JHPath”/Main/Preview”
# mkdir $JHPath”/Main/Base”
echo ” Main文件夹创建成功!”

# 创建Expand文件夹
echo “2.创建Expand文件夹…”
mkdir $JHPath”/Expand”
mkdir $JHPath”/Expand/Category”
mkdir $JHPath”/Expand/Macros”
mkdir $JHPath”/Expand/Tool”
echo ” Expand文件夹创建成功!”

# 创建Resource文件夹
echo “3.创建Resource文件夹…”
mkdir $JHPath”/Resource”
mkdir $JHPath”/Resource/Font”
mkdir $JHPath”/Resource/Image”
mkdir $JHPath”/Resource/Image/Public.xcassets”
# mkdir $JHPath”/Resource/Global”
mkdir $JHPath”/Resource/Plist”
echo ” Resource文件夹创建成功!”

# 创建SDKFile文件夹
echo “4.创建SDKFile文件夹…”
mkdir $JHPath”/SDKFile”
echo ” SDKFile文件夹创建成功!”

# 创建模块文件夹
echo “5.创建Vendor文件夹…”
mkdir $JHPath”/Vendor”
echo ” Vendor文件夹创建成功!”

# 初始化JHMacros.h
echo “6.创建JHMacros.h文件…”
macrosPath=$JHPath”/Expand/Macros/JHMacros.h” # JHMacros.h位置
echo “//” >>$macrosPath
echo “// JH常用宏定义(尽量不要在这里增加项目的宏定义)” >>$macrosPath
echo “// JHMacros.h” >>$macrosPath
echo “// “$projectName >>$macrosPath
echo “//” >>$macrosPath
echo “// Created by JH on $(date +%m/%d/%y).” >>$macrosPath
echo “// Copyright © 2016 JH. All rights reserved.” >>$macrosPath
echo “//” >>$macrosPath
echo “” >>$macrosPath
echo “#ifndef JHMacros_h” >>$macrosPath
echo “#define JHMacros_h” >>$macrosPath
echo “” >>$macrosPath
echo “// 导入必要的头文件” >>$macrosPath
echo “#import \”JHThridMacros.h\”” >>$macrosPath
echo “#import \”JH”$projectName”Macros.h\”” >>$macrosPath
echo “” >>$macrosPath
echo “// 设备Size常量” >>$macrosPath
echo “#define JH_SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width // 屏幕宽度” >>$macrosPath
echo “#define JH_SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height // 屏幕高度” >>$macrosPath
echo “#define JH_TABBAR_HEIGHT 49.0 // TabBar高度” >>$macrosPath
echo “#define JH_STATUSBAR_HEIGHT 20.0 // 状态栏高度([[UIApplication sharedApplication] statusBarFrame].size.height)” >>$macrosPath
echo “#define JH_NAVIGATIONBAR_HEIGHT 44.0 // NavigationBar高度” >>$macrosPath
echo “” >>$macrosPath
echo “// 设备信息常量” >>$macrosPath
echo “#define JH_SYSTEM_NAME [UIDevice currentDevice].systemName // 设备系统名称” >>$macrosPath
echo “#define JH_SYSTEM_VERSION [UIDevice currentDevice].systemVersion // 设备系统版本” >>$macrosPath
echo “#define JH_UUID [[UIDevice currentDevice].identifierForVendor UUIDString] // UUID,每次安装app都会不一样” >>$macrosPath
echo “” >>$macrosPath
echo “// NSUserDefaults” >>$macrosPath
echo “#define JH_USERDEFAULTS [NSUserDefaults standardUserDefaults]” >>$macrosPath
echo “” >>$macrosPath
echo “// 关于文件管理的常量” >>$macrosPath
echo “#define JH_FILE_MANAGER [NSFileManager defaultManager] // 文件管理者” >>$macrosPath
echo “#define JH_SANDBOX_DOCUMENTS_PATH [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] // sandbox中documents文件夹路径” >>$macrosPath
echo “#define JH_SANDBOX_LOG_DERECTORY [JH_SANDBOX_DOCUMENTS_PATH stringByAppendingPathComponent:@”JHLog”] // 日志缓存路径” >>$macrosPath
echo “” >>$macrosPath
echo “#endif /* JHMacros_h */” >>$macrosPath
echo ” JHMacros.h文件创建成功”

# 初始化JHThirdMacros.h
echo “7.创建JHThirdMacros.h文件…”
macrosPath=$JHPath”/Expand/Macros/JHThirdMacros.h” # JHThirdMacros.h位置
echo “//” >>$macrosPath
echo “// JH第三方SDK宏定义” >>$macrosPath
echo “// JHThridMacros.h” >>$macrosPath
echo “// “$projectName >>$macrosPath
echo “//” >>$macrosPath
echo “// Created by JH on $(date +%m/%d/%y).” >>$macrosPath
echo “// Copyright © 2016 JH. All rights reserved.” >>$macrosPath
echo “//” >>$macrosPath
echo “” >>$macrosPath
echo “#ifndef JHThridMacros_h” >>$macrosPath
echo “#define JHThridMacros_h” >>$macrosPath
echo “” >>$macrosPath
echo “” >>$macrosPath
echo “#endif /* JHThridMacros_h */” >>$macrosPath
echo ” JHThirdMacros.h文件创建成功”

# 初始化应用<ProjectName>Macros.h
if [[ $projectName != “” ]]; then
echo “8.创建JH”$projectName”Macros.h文件…”
macrosPath=$JHPath”/Expand/Macros/JH”$projectName”Macros.h” # JH<ProjectName>Macros.h位置
echo “//” >>$macrosPath
echo “// 本应用(”$projectName”)宏定义” >>$macrosPath
echo “// JH”$projectName”Macros.h” >>$macrosPath
echo “// “$projectName >>$macrosPath
echo “//” >>$macrosPath
echo “// Created by JH on $(date +%m/%d/%y).” >>$macrosPath
echo “// Copyright © 2016 JH. All rights reserved.” >>$macrosPath
echo “//” >>$macrosPath
echo “” >>$macrosPath
echo “#ifndef JH”$projectName”Macros_h” >>$macrosPath
echo “#define JH”$projectName”Macros_h” >>$macrosPath
echo “” >>$macrosPath
echo “” >>$macrosPath
echo “#endif /* JH”$projectName”Macros_h */” >>$macrosPath
echo ” JH”$projectName”Macros.h文件创建成功”
fi

# 创建模块文件夹
echo “9.创建模块文件夹…”
for module in $modules
do
if [[ ${module} != “Array” && ${module} != “{” && ${module} != “}” ]]; then
mkdir $JHPath”/Main/”$module
mkdir $JHPath”/Main/”$module”/Controller”
mkdir $JHPath”/Main/”$module”/View”
mkdir $JHPath”/Main/”$module”/View/Cell”
mkdir $JHPath”/Main/”$module”/View/SubView”
mkdir $JHPath”/Main/”$module”/Model”
mkdir $JHPath”/Main/”$module”/Other”
mkdir $JHPath”/Main/”$module”/Protocal”
mkdir $JHPath”/Main/”$module”/Service”
mkdir $JHPath”/Resource/Image/”$module.xcassets
fi
done
echo ” 模块文件夹创建成功!”

echo “”
echo “————————————-”
echo “- 初始化JH iOS框架完成 -”
echo “————————————-”
echo “”