天天看点

iOS模块化:基础框架的创建

现在大家都在推进模块化,每次粘贴拷贝烦了,我也搞个模块化,因为公司要新起项目,我想我不能每一次都来粘贴一次这么多的基础库文件,我直接模块化出来好了,每次要用pod下就好了,还可以持续更新。

首先我们来说下这样做的好处,特别是多人开发的时候,这样是特别方便的,还有就是代码干净,工程里只有业务代码,然后业务代码再根据功能进行模块,我这里还没弄,项目不大不太需要。主要是在大工程这样的好处更大,清晰,问题好定位,代码干净解耦,同时也锻炼你的抽象能力吧。

这次我抽象出来的项目叫“KZWFoundation”,其中包含了基础控件的统一风格封装,基础网络框架的封装(对af 3.0的再次封装)包含加密验签,router,基础controller,通用控件视图,基础宏,和一些基础category的封装。

下面说下,怎么创建自己的cocospod库:

1、将你需要的文件和demo项目创建在github:

iOS模块化:基础框架的创建

第一步,创建.png

这里借用了James大叔的图,人懒就不重复截图了。

2、说下共享吧:

1

pod spec create KZWFoundation

编辑.podspec:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148

#

#  Be sure to run `pod spec lint KZWFoundation.podspec' to ensure 

this

is

a

#  valid spec and to remove all comments including 

this

before submitting the spec.

#

#  To learn more about Podspec attributes see http:

//docs.cocoapods.org/specification.html

#  To see working Podspecs 

in

the CocoaPods repo see https:

//github.com/CocoaPods/Specs/

#

Pod::Spec.

new

do

|s|

# ―――  Spec Metadata  ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #

#

#  These will help people to find your library, and whilst it

#  can feel like a chore to fill 

in

it's definitely to your advantage. The

#  summary should be tweet-length, and the description more 

in

depth.

#

s.name         = 

"KZWFoundation"

s.version      = 

"1.1.0"

s.summary      = 

"iOS 基本库"

# This description 

is

used to generate tags and improve search results.

#   * Think: What does it 

do

? Why did you write it? What 

is

the focus?

#   * Try to keep it short, snappy and to the point.

#   * Write the description between the DESC delimiters below.

#   * Finally, don't worry about the indent, CocoaPods strips it!

s.description  = <<-DESC

iOS基本库

DESC

s.homepage     = 

"https://github.com/ouyrp/KZWFoundation"

# s.screenshots  = 

"www.example.com/screenshots_1.gif"

"www.example.com/screenshots_2.gif"

# ―――  Spec License  ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #

#

#  Licensing your code 

is

important. See http:

//choosealicense.com for more info.

#  CocoaPods will detect a license file 

if

there 

is

a named LICENSE*

#  Popular ones are 

'MIT'

'BSD'

and 

'Apache License, Version 2.0'

.

#

s.license      = 

"MIT"

# s.license      = { :type => 

"MIT"

, :file => 

"FILE_LICENSE"

}

# ――― Author Metadata  ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #

#

#  Specify the authors of the library, 

with

email addresses. Email addresses

#  of the authors are extracted from the SCM log. E.g. $ git log. CocoaPods also

#  accepts just a name 

if

you'd rather not provide an email address.

#

#  Specify a social_media_url where others can refer to, 

for

example a twitter

#  profile URL.

#

s.author             = { 

"ouyang"

=> 

"[email protected]"

}

# Or just: s.author    = 

"ouyang"

# s.authors            = { 

"ouyang"

=> 

"[email protected]"

}

# s.social_media_url   = 

"http://twitter.com/ouyang"

# ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― #

#

#  If 

this

Pod runs only on iOS or OS X, then specify the platform and

#  the deployment target. You can optionally 

include

the target after the platform.

#

# s.platform     = :ios

s.platform     = :ios, 

"8.0"

#  When using multiple platforms

# s.ios.deployment_target = 

"5.0"

# s.osx.deployment_target = 

"10.7"

# s.watchos.deployment_target = 

"2.0"

# s.tvos.deployment_target = 

"9.0"

# ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #

#

#  Specify the location from where the source should be retrieved.

#  Supports git, hg, bzr, svn and HTTP.

#

s.source       = { :git => 

"https://github.com/ouyrp/KZWFoundation.git"

, :tag => 

"#{s.version}"

}

# ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #

#

#  CocoaPods 

is

smart about how it includes source code. For source files

#  giving a folder will 

include

any swift, h, m, mm, c & cpp files.

#  For header files it will 

include

any header 

in

the folder.

#  Not including the public_header_files will make all headers 

public

.

#

s.source_files  = 

"Classes/KZWFoundationHear.h"

s.subspec 

'Content'

do

|ss|

ss.source_files = 

'Classes*.{h,m}'

ss.exclude_files = 

"Classes/KZWFoundationHear.h"

ss.framework = 

"MapKit"

end

# s.public_header_files = 

"Classes*.h"

# ――― Resources ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #

#

#  A list of resources included 

with

the Pod. These are copied into the

#  target bundle 

with

a build phase script. Anything 

else

will be cleaned.

#  You can preserve files from being cleaned, please don't preserve

#  non-essential files like tests, examples and documentation.

#

# s.resource  = 

"Classes/Rseouce/KZWFundation.bundle"

# s.resource_bundle = 

"Classes/Rseouce/KZWFundation.bundle"

s.resource_bundle = { 

'KZWFundation'

=> [

'Classes/Rseouce/KZWFundation.bundle'

] }

# s.resources = 

"Resources/*.png"

# s.preserve_paths = 

"FilesToSave"

"MoreFilesToSave"

# ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #

#

#  Link your library 

with

frameworks, or libraries. Libraries 

do

not 

include

#  the lib prefix of their name.

#

# s.frameworks = 

"SomeFramework"

"AnotherFramework"

# s.library   = 

"iconv"

# s.libraries = 

"iconv"

"xml2"

# ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #

#

#  If your library depends on compiler flags you can 

set

them 

in

the xcconfig hash

#  where they will only apply to your library. If you depend on other Podspecs

#  you can 

include

multiple dependencies to ensure it works.

# s.requires_arc = 

true

# s.xcconfig = { 

"HEADER_SEARCH_PATHS"

=> 

"$(SDKROOT)/usr/include/libxml2"

}

s.dependency 

"Masonry"

s.dependency 

"MJRefresh"

s.dependency 

"AFNetworking"

s.dependency 

"Mantle"

s.dependency 

"MBProgressHUD"

s.dependency 

"SAMKeychain"

end

这里重点说下,遇到的坑,s.source_files这个说的是你要共享的文件的位置,和你在创建之后的文件没任何关系, s.subspec这个才是创建文件夹如果你没有就是默认没有文件夹,文件都在你的库下面,这样会很丑很难看,很不优雅,然后s.subspec这个里面也是一个cocospod所以你需要把你用到的都加上,然后我们说下资源文件,我们都是优雅的人所以我们肯定不能丢各种png文件对不对,所以我们需要创建bundle,然后配置是s.resource_bundle = { 'KZWFundation' => ['Classes/Rseouce/KZWFundation.bundle'] }这个浪费我一个下午,所以大家需要看下其他的比较大的库是怎么配的不用走弯路。

3、然后是验证

1

pod lib lint KZWFoundation.podspec --verbose --

use

-libraries --allow-warnings

这个是验证本地,最好是先跑下这个,没问题在提交然后验证远程,开始我没这么做一个天提交了10个版本,被自己蠢死了。

4、提交

1 2 3 4 5 6 7

git add -A && git commit -m 

"version 1.0.0"

git tag 

'1.0.0'

//和上面.podspec一致

git push --tags

git push origin master

5、验证远程的

1

pod spec lint KZWFoundation.podspec --verbose --

use

-libraries --allow-warnings

6、没问题了之后提交

1 2

pod trunk register *****@xx.com 

"ouyang"

pod trunk push KZWFoundation.podspec  --

use

-libraries --allow-warnings

如果trunk注册过了可以跳过注册直接推就好了,成功后就会让你告诉你的朋友了,这样就完成了,然后你就可以pod下来了,完美。然后你在改的话,就要升版本,改一次升一次版本。