ios cocopods 安装使用及高级教程

CocoaPods简介

每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如Java语言的Maven,nodejs的npm。随着iOS开发者的增多,业界也出现了为iOS程序提供依赖管理的工具,它的名字叫做:CocoaPods 官网: http://cocoapods.org/

一、安装

1.更新gem

如果终端gem版本太老可能会有问题,先更新gem:(现在大部分新机都不会有这个问题)

sudo gem update --system

2.换源

gem默认的源是外国的https://rubygems.org/,国内网速太慢,换成淘宝源

gem sources -l                         // 查看当前源

gem sources --remove https://rubygems.org/    // 删除原有的rubygems源

gem sources --add https://gems.ruby-china.com

gem sources -l // 再次查看当前源有没有替换成功


3.选中xcode

如果安装有多个版本xcode的朋友,需要切换一个默认的版本

sudo xcode-select --switch /Applications/Xcode.app

4.安装cocoapods

mac系统版本如果是10.11以前的,使用一下命令安装:

sudo gem install cocoapods

如果是10.11以后由于cocoapods的命令路径改变了,变成:

sudo gem install -n /usr/local/bin cocoapods

5.初始化cocopods

安装好cocopods以后,需要下载更新本地的依赖库tree,每天很多人都会更新或创建好的Pods库,需要下载或更新到本地,由于依赖库tree数量太多,可能会很慢,耐心等待,中间可能出现各种莫名其妙的错误,很大一部分是网络原因,请重新执行命令

pod setup

二、项目集成cocopods

1.进入到项目的根目录,创建Podfile文件,

cd  ***/IOSHelloWorldProject        // 进入项目根目录

touch Podfile                              // 创建Podfile文件

2.用记事本或xcode打开Podfile文件,添加项目所需要的依赖库,例如:

platform :ios, '8.0'

inhibit_all_warnings!

pod 'AFNetworking'

pod 'SDWebImage'

这样一个AFNetworking、SDWebImage的依赖库就添加完成了

3.安装依赖库,返回终端执行:

pod install --no-repo-update

pod install --verbose --no-repo-update

--verbose 查看安装细节

4.安装完成以后我们不在打开后缀为.xcodeproj的工程,而是打开后缀为.xcworkspace的工作空间。

此时一个简单的cocopods工程就完成了,相信可以满足大部分小朋友的需求了,对于项目比较复杂、架构设计要求高、个性化追求高的小朋友请接着看cocopods的高级教程

5.cocopods升级

pod --version   // 查看cocopods当前的版本

gem update cocoapod // 升级cocopods命令

6.cocopods卸载

电脑重装或者切换到某个账号后cocopods使用有问题或者cocopods出现解决不了的问题而必须卸载重装,下面就是卸载了:

which pod // 查看pod的安装路径

gem list --local | grep cocoapods   // 查看当前安装了哪些有关cocopods的东西

xiaomingdeMacBook-Pro:OCServiceDemo xiaoming$ gem list --local | grep cocoapods

cocoapods (1.1.1)

cocoapods-core (1.1.1)

cocoapods-deintegrate (1.0.1,1.0.0.beta.1)

cocoapods-downloader (1.1.2,1.1.1,1.0.0.beta.3,0.9.3)

cocoapods-plugins (1.0.0,1.0.0.beta.1,0.4.2)

cocoapods-search (1.0.0,1.0.0.beta.2,0.1.0)

cocoapods-stats (1.0.0,1.0.0.beta.4,0.6.2)

cocoapods-trunk (1.1.1,1.0.0,1.0.0.beta.3,0.6.4)

cocoapods-try(1.1.0,1.0.0.beta.3,0.5.1)


接下来一个一个卸载:

sudo gem uninstall cocoapods-core

sudo gem uninstall cocoapods-core

如果需要卸载那个版本,如下:

sudo gem uninstall cocoapods -v 1.1.1 //后面的版本号要和上面列表中的版本号对应


M1芯片:

sudo arch -x86_64 gem install ffi

arch -x86_64 pod install

二、国内镜像下载慢的解决方案:

1.切换镜像源

- gem sources --remove https://rubygems.org/

- gem sources -a https://gems.ruby-china.com

 2.使用国内站点开放的镜像源,如gitee:

pod repo remove master

pod repo add master https://gitee.com/mirrors/CocoaPods-Specs.git

 3.Podfile文件增加指向镜像源:

  source 'https://gitee.com/mirrors/CocoaPods-Specs.git'

三、cocopods高级教程

1.类似pod 'AFNetworking'依赖库名如何得来,使用pod的搜索命令:

pod search AFNetworking

xiaomingMacBook-Pro:OCServiceDemo xiaoming$ pod search AFNetworking

-> AFNetworking (3.1.0)

A delightful iOS and OS X networking framework.

pod 'AFNetworking', '~> 3.1.0'

- Homepage: https://github.com/AFNetworking/AFNetworking

- Source:   https://github.com/AFNetworking/AFNetworking.git

- Versions: 3.1.0, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 3.0.0-beta.3, 3.0.0-beta.2, 3.0.0-beta.1, 2.6.3, 2.6.2, 2.6.1, 2.6.0, 2.5.4, 2.5.3, 2.5.2,

2.5.1, 2.5.0, 2.4.1, 2.4.0, 2.3.1, 2.3.0, 2.2.4, 2.2.3, 2.2.2, 2.2.1, 2.2.0, 2.1.0, 2.0.3, 2.0.2, 2.0.1, 2.0.0, 2.0.0-RC3, 2.0.0-RC2, 2.0.0-RC1,

1.3.4, 1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.1, 1.2.0, 1.1.0, 1.0.1, 1.0, 1.0RC3, 1.0RC2, 1.0RC1, 0.10.1, 0.10.0, 0.9.2, 0.9.1, 0.9.0, 0.7.0, 0.5.1

[master repo]

- Subspecs:

- AFNetworking/Serialization (3.1.0)

- AFNetworking/Security (3.1.0)

- AFNetworking/Reachability (3.1.0)

- AFNetworking/NSURLSession (3.1.0)

- AFNetworking/UIKit (3.1.0)

-> AFNetworking+AutoRetry (0.0.5)                             

  Auto Retries for AFNetworking requests

  pod 'AFNetworking+AutoRetry','~> 0.0.5'- Homepage: https://github.com/shaioz/AFNetworking-AutoRetry- Source:  https://github.com/shaioz/AFNetworking-AutoRetry.git- Versions:0.0.5,0.0.4,0.0.3,0.0.2,0.0.1 [master repo]-> AFNetworking+Ext (1.2.1)

  AFNetworking的封装, 并提供一个 UIImageView+DYLoading  cacheinfileSystem+memory

  pod 'AFNetworking+Ext','~> 1.2.1'- Homepage: https://github.com/junhaiyang/AFNetworkingExt- Source:  https://github.com/junhaiyang/AFNetworkingExt.git- Versions:1.2.1,1.2,1.1,1.0,0.5,0.4,0.3 [master repo]

  - Subspecs:

    - AFNetworking+Ext/Base (1.2.1)

    - AFNetworking+Ext/AFCustomRequestOperation (1.2.1)

    - AFNetworking+Ext/AFDownloadRequestOperation (1.2.1)

    - AFNetworking+Ext/AFTextResponseSerializer (1.2.1)

    - AFNetworking+Ext/example (1.2.1)

    - AFNetworking+Ext/UIKit (1.2.1)

    - AFNetworking+Ext/UIKit/UIImageView+DYLoading (1.2.1)

解释下内容:

-> AFNetworking (3.1.0)        // 依赖库名、最新版本号

A delightful iOS and OS X networking framework.    // 简介描述

pod 'AFNetworking', '~> 3.1.0'                             // 在Podfile文件里引用这个依赖库的语法,大部分情况下拷贝这行到Podfile文件即可

- Homepage: https://github.com/AFNetworking/AFNetworking   // 依赖库的主页,主页里包含介绍、说明、源码等一系列文件

- Source:   https://github.com/AFNetworking/AFNetworking.git   // 依赖库的git仓库路径

- Versions: 3.1.0, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 3.0.0-beta.3, 3.0.0-beta.2, 3.0.0-beta.1, 2.6.3, 2.6.2, 2.6.1, 2.6.0, 2.5.4, 2.5.3, 2.5.2,

2.5.1, 2.5.0, 2.4.1, 2.4.0, 2.3.1, 2.3.0, 2.2.4, 2.2.3, 2.2.2, 2.2.1, 2.2.0, 2.1.0, 2.0.3, 2.0.2, 2.0.1, 2.0.0, 2.0.0-RC3, 2.0.0-RC2, 2.0.0-RC1,

1.3.4, 1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.1, 1.2.0, 1.1.0, 1.0.1, 1.0, 1.0RC3, 1.0RC2, 1.0RC1, 0.10.1, 0.10.0, 0.9.2, 0.9.1, 0.9.0, 0.7.0, 0.5.1    // 依赖库的各个版本

[master repo]

- Subspecs:   // 这里的是依赖库的各个子模块,一般不用关心,研究依赖库源码框架的可以看看

- AFNetworking/Serialization (3.1.0)

- AFNetworking/Security (3.1.0)

- AFNetworking/Reachability (3.1.0)

- AFNetworking/NSURLSession (3.1.0)

- AFNetworking/UIKit (3.1.0)

在Podfile文件使用如下语法引用依赖库:

pod 'AFNetworking'//不显式指定依赖库版本,表示每次都获取最新版本pod 'AFNetworking', '2.0'//只使用2.0版本pod 'AFNetworking', '>2.0'//使用高于2.0的版本pod 'AFNetworking', '>=2.0'//使用大于或等于2.0的版本pod 'AFNetworking', '<2.0'//使用小于2.0的版本pod 'AFNetworking', '<=2.0'//使用小于或等于2.0的版本pod 'AFNetworking', '~>0.1.2'//使用大于等于0.1.2但小于0.2的版本,不包含0.1.2pod 'AFNetworking', '~>0.1'//使用大于等于0.1但小于1.0的版本pod 'AFNetworking', '~>0'//高于0的版本,写这个限制和什么都不写是一个效果,都表示使用最新版本

 2.多个target使用相同Pod依赖库

如果为IOSHelloWorldProject的targetOne和targetTwo都需要引用Reachability、SBJson、AFNetworking三个Pods依赖库,可以使用link_with关键字来实现,将Podfile写成如下方式:

link_with 'targetOne', 'targetTwo'   

pod'Reachability','~>3.0.0'pod'SBJson','~>4.0.0'   

pod 'AFNetworking','~>2.0'

新的语法是使用abstract_target

# There are no targets called"Shows"in any Xcode projects

abstract_target 'Shows'do  pod 'ShowsKit'  # Has its own copy of ShowsKit + ShowWebAuth

target 'ShowsiOS'do    pod 'ShowWebAuth'  end

 # Has its own copy of ShowsKit + ShowTVAuth

target 'ShowsTV'do    pod 'ShowTVAuth'  end

end

如果使用隐式abstract_target语法必须写在Podfile文件顶部:

pod'ShowsKit'# Has its own copy of ShowsKit + ShowWebAuth

target 'ShowsiOS'do  pod 'ShowWebAuth'end

# Has its own copy of ShowsKit + ShowTVAuth

target 'ShowsTV'do  pod 'ShowTVAuth'end


3.不同target引用不同Pod依赖

如果为IOSHelloWorldProject的targetOne引用Reachability,而targetTow引用SBJson、AFNetworking,将Podfile写成如下方式:

target :'targetOne' do

pod'Reachability','~>3.0.0'

end   

target :'targetTow' do

pod 'AFNetworking','~>2.0'

pod'SBJson','~>4.0.0'

end

do/end作为开始和结束标识符

4.其他常用pod引用依赖库语法

pod'Alamofire',:path=>'~/Documents/Alamofire'      // 在~/Documents/Alamofire路径下存在spec的项目(spec后期介绍)pod'Alamofire',:git=>'https://github.com/Alamofire/Alamofire.git'  // git上的master分支pod'Alamofire',:git=>'https://github.com/Alamofire/Alamofire.git',:tag=>'3.1.1'  // git上tag为3.1.1pod'Alamofire',:git=>'https://github.com/Alamofire/Alamofire.git',:commit=>'0f506b1c45'// git上commit为0f506b1c45pod'Alamofire',:git=>'https://github.com/Alamofire/Alamofire.git',:branch=>'dev'      // git上的开发分支

更多Podfile语法请参考官网:https://guides.cocoapods.org/syntax/podfile.html#podfile

5.关于Podfile.lock文件

在使用CocoaPods,执行完pod install之后,会生成一个Podfile.lock文件。这个文件看起来跟我们关系不大,实际上绝对不应该忽略它。

该文件用于保存已经安装的Pods依赖库的版本

Podfile.lock文件最大得用处在于多人开发。当团队中的某个人执行完pod install命令后,生成的Podfile.lock文件就记录下了当时最新Pods依赖库的版本,这时团队中的其它人check下来这份包含Podfile.lock文件的工程以后,再去执行pod install命令时,获取下来的Pods依赖库的版本就和最开始用户获取到的版本一致。如果没有Podfile.lock文件,后续所有用户执行pod install命令都会获取最新版本的SBJson,这就有可能造成同一个团队使用的依赖库版本不一致,这对团队协作来说绝对是个灾难!

在这种情况下,如果团队想使用当前最新版本的SBJson依赖库,有两种方案:

更改Podfile,使其指向最新版本的SBJson依赖库;

执行pod update命令;

鉴于Podfile.lock文件对团队协作如此重要,我们需要将它添加到版本管理中

5.查看本地依赖库的tree文件

cocopods的tree文件默认是隐藏的,先把Mac隐藏文件夹显示出来,

Mac隐藏和显示的命令如下:

隐藏:defaults write com.apple.finder AppleShowAllFiles -bool true

显示:defaults write com.apple.finder AppleShowAllFiles -bool false

然后退出终端,重启Finder

cocopods的tree文件的默认路劲是

~/.cocoapods/repos/master/Specs  // 当前用户的.cocoapods/repos/master/Specs目录下

直接使用命令如下命令打开路劲即可:

open ~/.cocoapods/repos/master/Specs

常见问题:

1.如果pod install 出现报错:

[!] Unable to find host target(s) for StaticLib. Please add the host targets for the embedded targets to the Podfile.

Certain kinds of targets require a host target. A host target is a "parent" target which embeds a "child" target. These are example types of targets that need a host target:

- Framework

- App Extension

- Watch OS 1 Extension

- Messages Extension (except when used with a Messages Application)

解决方案:

降低一个版本试下:

pod _1.1.1_ install

Xcode 9以后如果使用了cocopods后icon无法显示,Podfile文件底部添加:

post_install do |installer|

copy_pods_resources_path = "Pods/Target Support Files/Pods-FuelCardApp/Pods-FuelCardApp-resources.sh"

string_to_replace = '--compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"'

assets_compile_with_app_icon_arguments = '--compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${BUILD_DIR}/assetcatalog_generated_info.plist"'

text = File.read(copy_pods_resources_path)

new_contents = text.gsub(string_to_replace, assets_compile_with_app_icon_arguments)

File.open(copy_pods_resources_path, "w") {|file| file.puts new_contents }

end

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

推荐阅读更多精彩内容